说明
插件已更新至 v3.24.0
本次更新中,带来了新的 8051 的编译器 sdcc + binutils for mcs15 。这是基于 sdcc 上的改进,该编译器主要用于补全 sdcc 所缺失的死代码消除功能,这使得 sdcc 编译产物过大的问题能够得到缓解。
欢迎大家尝试使用
用法
- 打开 eide 选择设置工具链,选择带有
SDCC + Binutils
的选项,插件已经提供了在线安装包可用安装
也可前往:https://github.com/github0null/sdcc-binutils-mcs51 中的 release 中自行下载安装

- 打开 sdcc 项目,选择切换工具链:选择
SDCC + Binutils
即可

对比测试
- 使用两种编译器编译同一个 stc15 的 hello word 工程,源文件数量 10 个,以下是占用空间大小对比:
#include "config.h"
#include "delay.h"
#include "soft_uart.h"
#define LED_Toggle() P34 = !P34
void main(void)
{
while (1)
{
LOG("Hello, STC15F104W !");
LED_Toggle();
delay_ms(200);
}
}

- 使用两种编译器分别运行 sdcc 的测试套件

兼容性
由于链接器的不同,因此某些功能可能与 sdcc 不太一样
- 不支持 overlay:所有的局部变量和函数参数保存到栈
- 不支持 medium, huge 模型:目前仅支持
small
和 large
模型
- 不支持大于 64K 的地址:不支持引用大于的
0xFFFF
的地址,因此也不支持 SFR32
- 不支持 xstack: 栈只能位于
iram
中
- 绝对地址定位:不能使用
__at(xxx)
对 data idata xdata code
进行绝对地址定位,SFR寄存器除外,因为 ld 使用 linker script 进行地址分配。要使用绝对地址,请设置链接器参数 --defsym=
直接定义符号绝对位置
- 栈空间使用:由于不支持 overlay 功能,因此所有的局部变量和函数参数存储于栈中,这对于 mcs51 是一个挑战,因为即使使用 large 模型,stack 最大剩余大小为
256 - 32 = 224 bytes
,因此对于函数调用,不要使用太多的函数参数和嵌套调用,这会加速栈的溢出。