基于SDCC的工程化实践
一、上位机环境
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的工程化实践相关推荐
- 小程序工程化实践(上篇)-- 手把手教你撸一个小程序 webpack 插件,一个例子带你熟悉 webpack 工作流程...
本文基于 webpack 4 和 babel 7,Mac OS,VS Code 小程序开发现状: 小程序开发者工具不好用,官方对 npm 的支持有限,缺少对 webpack, babel 等前端常用工 ...
- Go Module 工程化实践(二):go get 取包原理篇
接上篇: Go Module 工程化实践(一):基础概念篇. 2. go get 取包原理篇 不论是否开启Go Module功能,go get从版本控制系统VCS中取包的基础过程是类似的,除了在新的实 ...
- GraphQL(四):GraphQL工程化实践
Demo到产品化还有很长的路要走,尤其是要在尽量小的影响当前框架的前提下引入新的方法. GraphiQL GraphiQL是整个GraphQL优势的重要一环,然而默认的GraphiQL不允许配置gra ...
- 前端工程化实践总结 | QQ音乐商业化Web团队
蓝字关注,回复"加群"加入前端技术群 与大家一起成长 | 导语本文主要介绍在前端工程化的一些探索和实践,结合移动端的基础库重构和UI组件库开发这两个项目详细介绍工程化方案 . 随着 ...
- 前端工程化实践:从开发到构建测试部署——由此及彼
前端工程化实践 前端工程化实践 什么叫前端工程化 从实践方面来说 从理论角度来讲 前端工程化的意义: 1.规范化(从源头处约束到优雅-聚沙成塔) 1. 制定各项开发规范,让工作有章可循 2. 针对于版 ...
- 【推荐系统】EMBEDDING 在大厂推荐场景中的工程化实践
" 解读YouTube.Airbnb.Alibaba的三篇经典论文,总结Embedding在工业界的一些用法和技巧,这三篇论文亮点众多,提供的经验非常值得我们去细细品味和借鉴.这篇文章篇幅较 ...
- 为什么您应该使用基于标准的开发实践
为什么您应该使用基于标准的开发实践 Why you should use standards-based development practices (even if you don't have t ...
- 基于Spark的机器学习实践 (九) - 聚类算法
0 相关源码 1 k-平均算法(k-means clustering)概述 1.1 回顾无监督学习 ◆ 分类.回归都属于监督学习 ◆ 无监督学习是不需要用户去指定标签的 ◆ 而我们看到的分类.回归算法 ...
- 技术干货| 阿里云基于Hudi构建Lakehouse实践探索
简介:阿里云高级技术专家王烨(萌豆)在Apache Hudi 与 Apache Pulsar 联合 Meetup 杭州站上的演讲整理稿件,本议题介绍了阿里云如何使用 Hudi 和 OSS 对象存储构建 ...
- 基于Spark的机器学习实践 (三) - 实战环境搭建
0 相关源码 1 Spark环境安装 ◆ Spark 由scala语言编写,提供多种语言接口,需要JVM ◆ 官方为我们提供了Spark 编译好的版本,可以不必进行手动编译 ◆ Spark安装不难,配 ...
最新文章
- Html做弹出式菜单,JavaScript制作的可折叠弹出式菜单示例
- QT之error: cannot bind non-const lvalue reference of type ‘CBaowen’ to an rvalue of type ‘CBaowen
- android 支付宝 40247,支付宝 app支付异常摘记 -- ALI40247
- webpack4.0各个击破(4)—— Javascript splitChunk
- python集合set底层原理_Python进阶11_字典dict和集合set的秘密
- php和python-PHP和Python如何选择?或许可以考虑这三个问题
- vs中怎么去链接一个库文件(ws2_32.lib)
- mdoublem matlab,imhist以及matlab图像矩阵的数据类型
- 多空对比:一个实用的短中长期资金观察指标介绍
- 复合梯形公式matlab代码,复合梯形公式
- 5773. 插入后的最大值
- 用Python采集微博视频,随时随地发现新鲜事~
- 【SONY PS2模拟器】[PCSX2 V0.93 R7完美教程]+最新版模拟器
- apache评分表的意义_APACHE-II评分系统表.doc
- Eclipse中没有Servers或Dynamic Web Project的解决方案
- 爬虫豆瓣读书top250,保存为本地csv文件,可用excel查看(具体步骤和容易遇到的坑)
- python中column什么意思_DataFrame属性和column有什么区别
- 系统里能看服务器型号,操作系统如何查看服务器型号
- web前端入门到实战:HTML5 video视频播放
- 用P5 JS绘制二维动画场景——静态篇