单片机开发,推荐开源跨平台的SDCC编译器
摸索了几天,把STC8A单片机的程序转到了SDCC编译器。如果是刚接触单片机,没用过其他编译器,那么不会感觉有啥难度。如果从其他开发工具转过来,可能需要适应一下新环境。
STC官网给出的头文件和例程基本是基于keil的,这也让许多人选择keil开发环境。keil确实有过人之处,商业软件,比较可信赖。但是keil也有不足:一、它是收费的,免费也可以用,但有代码长度限制。我记得以前keil是免费的,被收购之后就收费了。二、keil只有windows版本,限制了使用的平台。
SDCC则是开源的,在多个平台可以使用,如linux, 苹果电脑, windows就更不在话下了,并且承诺一直开发更新。
看了一下STC8的头文件,只是寄存器地址的说明方法在SDCC中略有不同,使用notepad++很容易转换过来。SDCC也有自己的头文件,针对8051的,或者其他单片机的,都有。所以,也可以不用修改STC8的头文件,直接用SDCC提供的就好。
我使用的是SDCC 4.0 64位版本的。简单说说这个版本的使用方法。
1,SDCC支持多种单片机。它使用命令行编译,可以使用命令行参数指示编译功能。使用SDCC --help查看各编译参数。
2,SDCC一个命令行编译一个源文件。多文件源码要使用-c参数,先每个编译为目标文件rel,然后使用SDCC链接多个rel文件。其实这不算用法了,写个Makefile行了,用windows的,就下载cygwin或者mysys带的make,喜欢eclipse的也有个sdcc eclipse插件。还有个8051ide(windows版的我怎么没用对呢,编译不报告还总卡死)。
一个Makefile的参考例子,使用SDCC编译器,编译链接当前目录的所有c文件,编译结果为main.ihx
下载:https://download.csdn.net/download/lang999888/12727351
CC = sdcc
EXEC = main.ihx
SRC = $(wildcard *.c)
OBJ = $(SRC:%c=%rel)
CCFLAG = -c --stack-auto --no-xinit-opt --model-large
LDFLAG = --stack-auto --no-xinit-opt --model-large
$(EXEC):$(OBJ)
$(CC) $(LDFLAG) $(OBJ) -o $(EXEC)
%.rel:%.c
$(CC) $(CCFLAG) $(<) -o $(@)
注:下面2行前面的空格要用TAB符替换
$(CC) $(LDFLAG) $(OBJ) -o $(EXEC)
$(CC) $(CCFLAG) $(<) -o $(@)
3,--stack-auto编译参数。缺省的如果不使用--stack-auto编译参数,SDCC将函数参数和局部变量编译为数据变量,这是考虑到8051的堆栈空间有限,防止堆栈空间不足的处理办法。说实在的8051的8位堆栈指针确实能访问的空间不大。但SDCC这样处理的问题也来了:如果函数的局部变量比较多,它就可能报告“没有***个连续的数据存储器在DSEG”,造成编译失败。自己写的代码,尽量减少函数参数和局部变量。如果从计算机程序移植到8051的,这就不能怪SDCC,只能怪计算机的堆栈空间太大了,用起来太随意了。SDCC是比较保守的编译器,优化处理不大可能做。
4,使用--stack-auto编译参数。使用--stack-auto编译参数,SDCC真正将函数和局部变量编译进堆栈,数据区也比较清爽了,程序也编译通过了。但是,要小心堆栈溢出了。对于参数比较多的函数,最好将它们从参数表移出来,用全局变量传递。函数局部变量使用static声明为数据变量。这样要占用一些数据空间,可是,堆栈空间不是小吗,也是一种解决办法了。其实,8051的上百个字节的堆栈空间也不算小了,因此推荐使用--stack-auto编译参数。
5,使用__code声明查表数据。查表数据是不会改变的数据,如果数据空间紧张,将他们声明为__code,数据编译到代码空间,节省了数据空间。一般地,SDCC默认编译RAM数据空间256,XDATA扩展数据空间64KB,程序空间64KB。查看mem文件可以看到具体使用量。查看lst文件可以看到具体分配情况。
6,使用 --no-xinit-opt。SDCC 4.0这个版本有点怪异,对需要初始化的__xdata缺省不能完成初始化(等同于使用--model-large编译)。SDCC手册说使用了MOV指令做了优化,实际查看编译的lst文件,初始化数据是编译了,但是没有MOV。知道原因了,就不管它为啥没MOV了。使用--no-xinit-opt行了。
7,printf打印输出到串口。可以使用printf打印到串口,在程序中要提供一个putchar函数,这个函数完成串口输出。对于8051,SDCC给出了这个函数的参考源码:
int putchar (int c) {
while (!TI) /* assumes UART is initialized */ ;
TI = 0;
SBUF = c;
return c;
}
8,打印浮点数。printf库函数默认不支持打印浮点数。要打印浮点数,需要重新编译printf源码。推荐编译src目录中的printf_large.c,对于8051,使用 -DUSE_FLOATS=1 和 --model-large参数,然后链接它。printf和sprintf函数是很能占用代码空间的库函数啊。
9,浮点和长型定点运算。SDCC使用一套来自gcc的数学函数库来完成浮点和长型定点运算,运算效率一般,好处是可靠。
10,烧写STC单片机。我烧写程序使用STC官网的isp软件。文件可以直接使用缺省生成的ihx文件,不必转换成hex。
11,缺省代码效率。SDCC属于很保守的编译器了,对全局变量分配,代码优化做的不多。这样的好处是可靠性高。所以,不能指望它编译出的程序代码高效,只能寄希望使用的单片机高效了,呵呵。STC8A8K64S12执行128点的FFT运算速度约为25次每秒,相比于keil编译的代码40次每秒的速度,略逊一些。
12,手工优化。通过简单的手工处理代码:1,常数直接写进代码中;2,使用移位代替常数乘除运算;3,查表数据使用__code编译到代码区。通过这3点简单处理,128点的FFT运算速度提高到了55次每秒,速度提高1倍多。可见,对于编译器,代码编写对了非常重要。
总之,SDCC还是值得信赖和使用的。毕竟,它是开源的,能做到这些,已经非常可贵了。
单片机开发,推荐开源跨平台的SDCC编译器相关推荐
- 基于springboot+uniapp+vue3技术栈开发的开源跨平台小程序
塔可商城, 一个基于springboot+uniapp+vue3技术栈开发的开源跨平台小程序.管理后台,后端服务的项目,它内置提供了会员分销, 区域代理, 商品零售等功能的新零售电商系统.强大弹性的架 ...
- 零基础 Ubuntu 20.04.01 下搭建51单片机开发环境[开源编译器SDCC]
原创首发于CSDN,转载请注明出处,谢谢! 文章目录 为何会在Linux下开发单片机 个人系统环境与所用开发板 安装开源编译器 sdcc STC MCU ISP 闪存工具 stcgal 的安装 单片机 ...
- 【新书推荐】《微软开源跨平台移动开发实践》带你走近微软开源开源跨平台技术
上周收到本书作者李争送的一本12月份的新书<微软开源跨平台移动开发实践--利用ASP.NET Core 1.0 .Apache Cordova.Xamarin和Azure快速构建移动应用解决方案 ...
- 《微软开源跨平台移动开发实践》团购通知
[新书推荐]<微软开源跨平台移动开发实践>带你走近微软开源开源跨平台技术 大家的响应非常积极,接近400位同学想团购. 这两天通过作者李争的努力,为大家争取到了非常实惠的价格,投票结果看不 ...
- vscode+platformio IDE+sdcc搭建51单片机开发环境(win764)
vscode+platformio IDE+sdcc搭建51单片机开发环境,使用的单片机是STC89C52RC,最终我们使用单片机引脚的pwm输出实现两颗led拖尾交替输出,模拟警车上的灯的一个效果. ...
- 开源网盘系统推荐 - 开源云盘 - 安装及开发教程
开源网盘系统推荐 - 开源云盘 - 安装及开发教程 云盘界面 介绍 本开源云盘致力于打造成一个优雅,好用,高效,克制的开源云盘. 在线体验 (账号demo/123456) 软件架构 本开源云盘采用前后 ...
- .NET Core:面向未来的开源跨平台开发技术
作为一种全新的开源和跨平台的开发平台,.NET Core 历经两年多的开发,终于在于2016年6月27日针对所有主流服务器和桌面操作系统发布 1.0 RTM 版本..NET Core 是一种通用开发平 ...
- ubuntu 串口调试工具推荐_谈一谈单片机开发的几种调试方案
单片机开发过程中,有一个好的调试系统可以极大地提高开发效率. 举个例子,做平衡系统时调节PID参数,你会选择 修改参数–>编译–>烧录–>运行–>修改-,还是做一个功能可以一边 ...
- 吃了这个开源小玩意让单片机开发和Arduino一样高效
吃了这个开源小玩意,让单片机开发和Arduino一样高效(全中文注释) 无论你是一个单片机新手,或者是一位电子 DIY的爱好者,还是说是对嵌入式开发感兴趣的工程师,今天这个开源项目值得你看下去. // ...
- 推荐10个Vue 3.0开发的开源前端项目
Vue 是一款用于构建用户界面的 JavaScript 框,它基于标准 的HTML.CSS 和 JavaScript 构建,并提供了一套声明式的.组件化的编程模型,用以帮助开发者高效地开发用户界面.目 ...
最新文章
- no argument specified with option /LIBPATH:错误的解决
- 为什么阿里巴巴规定禁止超过三张表 join?
- Windows批处理(cmd/bat)常用命令
- python基础教程:装饰器的高级应用
- wxWidgets:SVG 示例
- Xmind settings lower
- MINIGUI常见错误集及解决方法
- tomcat默认连接数_Tomcat的默认连接器
- phpstorm 调试_PhpStorm中的多用户调试
- C语言——生命游戏(初始
- ef sqlserver切换到mysql_可以为MySql和SqlServer使用EF上下文吗?
- Java集合之Hashtable源码分析
- python枚举类型_Python 的枚举类型
- 利用Linux系统实现VLAN间的单臂路由及安全网关的功能
- Python 资源索引[绝对适合PYTHON人]
- MyBatis Plus 联合查询
- 没有基础的人如何自学裁缝?
- 普罗米修斯清除历史数据
- 小窍门解决大问题(绝对值得收藏)
- 主流的大数据BI软件有哪些?
热门文章
- 初探NIVIDIA GPU+CUDA+pyTorch
- python泰坦尼克号生存预测论文_Kaggle 泰坦尼克号生存预测--8%(Python)
- python批量生成列表_Python编程实战:根据数据表格,快速批量生成符合规范的WORD文档...
- 8cm等于多少像素_PPT尺寸你们都设置成多少(我问的不是分辨率像素,而是长、高尺寸)?...
- 使用python实现往手机发短信(基于twilio)
- 老王的JAVA基础课:第2课 JDK安装和环境变量配置
- 奥斯汀计算机专业排名,德克萨斯大学奥斯汀分校计算机工程类专业排名
- 移动端页面底部导航被浏览器工具栏遮盖解决方法
- mysql 数据库清理缓存
- C#反编译之:<PrivateImplementationDetails>.ComputeStringHash 错误