一、上位机环境

MacBook Pro
系统:macOS Big Sur
编译器:SDCC
烧录器:stcgal

二、总结

先说结论:由于sdcc对中文的支持不好,我尝试了各种办法均无解,不想浪费太多时间在趟坑上面,所以暂时放弃了探索。转而使用Windows的PC机作为开发机,重点是使用Keil C编译器。
(为什么需要用到中文?因为要向屏幕上输出中文…… 有些液晶屏驱动还不带中文字库,需要自己维护字库,就需要维护charcode和代码对应关系,如果都是用unicode编码来替代,我尝试了一下,可以是可以,但可读性也太差了,实在是得不偿失)

三、多文件编译

在真实工程中,由于代码量更大更复杂,都写在一个 main.c 的文件中肯定是不现实的。根据经验肯定是编写相应的头文件 xxxx.h 和其实现代码 xxxx.c ,然后在 main.c 中引用头文件。

在SDCC中编译时,如果直接编译 main.c 会报错:

sdcc ../src/main.c           ?ASlink-Warning-Undefined Global '_LcdSt7565_WriteCmd' referenced by module 'main'?ASlink-Warning-Undefined Global '_Lcd12864_ClearScreen' referenced by module 'main'?ASlink-Warning-Undefined Global '_Lcd12864_Init' referenced by module 'main'?ASlink-Warning-Undefined Global '_LcdSt7565_WriteData' referenced by module 'main'

在多处查找答案无果,只能狠下心来啃用户手册,没想到很快就找到了答案。

3.2.3 Projects with Multiple Source Files
SDCC can compile only ONE file at a time. Let us for example assume that you have a project containing the following files:
foo1.c (contains some functions)
foo2.c (contains some more functions)
foomain.c (contains more functions and the function main)
The first two files will need to be compiled separately with the commands:
sdcc -c foo1.c
sdcc -c foo2.c
Then compile the source file containing the main() function and link the files together with the following command:
sdcc foomain.c foo1.rel foo2.rel

对应到上面的12864显示例子中,就是:

sdcc -c ../src/st7565.c
sdcc ../src/main.c st7565.rel
stcgal -P stc89 -p /dev/tty.wchusbserial14610 main.ihx

因为目前文件还不是很多,暂时可以满足工程化需求了。如果后续文件增多,可能要考虑使用更专业的构建工具进行管理了(如Make或者CMake等)。

四、struct array

示例程序:

struct Cn16CharTypeDef                  // 汉字字模数据结构
{unsigned char index[2];            // 汉字内码索引,一个汉字占两个字节 unsigned char msk[32];             // 点阵码数据(16*16有32个数据)
};/* 示例, 前两个字节为汉字“普”的unicode编码,后面为16*16点阵信息 */
/* 这种写法使用gcc或者keil c都可以编译成功,但是sdcc会报错 */
__code struct Cn16CharTypeDef CN16CHAR[] =
{0x66,0x6e,0x00,0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,
0x00,0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00
};

编译报错如下:

sdcc -c test.c...
test.c:9: error 69: struct/union/array 'CN16CHAR': initialization needs curly braces

经查阅SDCC的使用手册,找到如下内容:

于是,将代码改成如下形式即可解决报错。

// ------------------  汉字字模的数据结构定义 ------------------------ //
struct Cn16CharTypeDef                  // 汉字字模数据结构
{unsigned char index[2];            // 汉字内码索引,一个汉字占两个字节 unsigned char msk[32];             // 点阵码数据(16*16有32个数据)
};/* 正确示例, 每个字段都用括号引起来 */
__code struct Cn16CharTypeDef CN16CHAR[] =
{{0x66,0x6e},{0x00,0x40,0x44,0x54,0x64,0x45,0x7E,0x44,0x44,0x44,0x7E,0x45,0x64,0x54,0x44,0x40,
0x00,0x00,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00}
};

五、中文支持问题

SDCC对中文支持不好的问题,开头总结中已经描述了,不赘述。
如果后续SDCC改善了对unicode编码的支持,或者我发现了更优解,也会更新此文档做记录。

基于SDCC的工程化实践相关推荐

  1. 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...

    本文基于 webpack 4 和 babel 7,Mac OS,VS Code 小程序开发现状: 小程序开发者工具不好用,官方对 npm 的支持有限,缺少对 webpack, babel 等前端常用工 ...

  2. Go Module 工程化实践(二):go get 取包原理篇

    接上篇: Go Module 工程化实践(一):基础概念篇. 2. go get 取包原理篇 不论是否开启Go Module功能,go get从版本控制系统VCS中取包的基础过程是类似的,除了在新的实 ...

  3. GraphQL(四):GraphQL工程化实践

    Demo到产品化还有很长的路要走,尤其是要在尽量小的影响当前框架的前提下引入新的方法. GraphiQL GraphiQL是整个GraphQL优势的重要一环,然而默认的GraphiQL不允许配置gra ...

  4. 前端工程化实践总结 | QQ音乐商业化Web团队

    蓝字关注,回复"加群"加入前端技术群 与大家一起成长 | 导语本文主要介绍在前端工程化的一些探索和实践,结合移动端的基础库重构和UI组件库开发这两个项目详细介绍工程化方案 . 随着 ...

  5. 前端工程化实践:从开发到构建测试部署——由此及彼

    前端工程化实践 前端工程化实践 什么叫前端工程化 从实践方面来说 从理论角度来讲 前端工程化的意义: 1.规范化(从源头处约束到优雅-聚沙成塔) 1. 制定各项开发规范,让工作有章可循 2. 针对于版 ...

  6. 【推荐系统】EMBEDDING 在大厂推荐场景中的工程化实践

    " 解读YouTube.Airbnb.Alibaba的三篇经典论文,总结Embedding在工业界的一些用法和技巧,这三篇论文亮点众多,提供的经验非常值得我们去细细品味和借鉴.这篇文章篇幅较 ...

  7. 为什么您应该使用基于标准的开发实践

    为什么您应该使用基于标准的开发实践 Why you should use standards-based development practices (even if you don't have t ...

  8. 基于Spark的机器学习实践 (九) - 聚类算法

    0 相关源码 1 k-平均算法(k-means clustering)概述 1.1 回顾无监督学习 ◆ 分类.回归都属于监督学习 ◆ 无监督学习是不需要用户去指定标签的 ◆ 而我们看到的分类.回归算法 ...

  9. 技术干货| 阿里云基于Hudi构建Lakehouse实践探索

    简介:阿里云高级技术专家王烨(萌豆)在Apache Hudi 与 Apache Pulsar 联合 Meetup 杭州站上的演讲整理稿件,本议题介绍了阿里云如何使用 Hudi 和 OSS 对象存储构建 ...

  10. 基于Spark的机器学习实践 (三) - 实战环境搭建

    0 相关源码 1 Spark环境安装 ◆ Spark 由scala语言编写,提供多种语言接口,需要JVM ◆ 官方为我们提供了Spark 编译好的版本,可以不必进行手动编译 ◆ Spark安装不难,配 ...

最新文章

  1. Html做弹出式菜单,JavaScript制作的可折叠弹出式菜单示例
  2. QT之error: cannot bind non-const lvalue reference of type ‘CBaowen’ to an rvalue of type ‘CBaowen
  3. android 支付宝 40247,支付宝 app支付异常摘记 -- ALI40247
  4. webpack4.0各个击破(4)—— Javascript splitChunk
  5. python集合set底层原理_Python进阶11_字典dict和集合set的秘密
  6. php和python-PHP和Python如何选择?或许可以考虑这三个问题
  7. vs中怎么去链接一个库文件(ws2_32.lib)
  8. mdoublem matlab,imhist以及matlab图像矩阵的数据类型
  9. 多空对比:一个实用的短中长期资金观察指标介绍
  10. 复合梯形公式matlab代码,复合梯形公式
  11. 5773. 插入后的最大值
  12. 用Python采集微博视频,随时随地发现新鲜事~
  13. 【SONY PS2模拟器】[PCSX2 V0.93 R7完美教程]+最新版模拟器
  14. apache评分表的意义_APACHE-II评分系统表.doc
  15. Eclipse中没有Servers或Dynamic Web Project的解决方案
  16. 爬虫豆瓣读书top250,保存为本地csv文件,可用excel查看(具体步骤和容易遇到的坑)
  17. python中column什么意思_DataFrame属性和column有什么区别
  18. 系统里能看服务器型号,操作系统如何查看服务器型号
  19. web前端入门到实战:HTML5 video视频播放
  20. 用P5 JS绘制二维动画场景——静态篇

热门文章

  1. 硬盘(IDE硬盘与SCSI硬盘)在Linux标识的命名规则
  2. Python123 练习1
  3. word2016从某一页开始插入新的起始页码
  4. 【读】自动文摘——预备
  5. 深入了解示波器(三):示波器的带宽
  6. 2014年终总结,我决定要实现的三个目标
  7. 新的一年,如何做好日计划、月计划与年计划?
  8. 大气科学领域必备的模型软件汇总丨WRF、WRF-CMAQ、WRF-Chem、WRF-Hydro、WRF DA、PMF、MCM、CAMx、SMOKE、CMIP6等
  9. excel高级筛选怎么用_Excel工作表中如何使用高级筛功能来实现多条件筛选
  10. 程序员坐行李箱迎寒风编码2小时,上热搜!你怎么看?