0x00 | Keil C51和SDCC

  • Keil C51:
    • 闭源的商业软件
    • 自带(绑定)IDE
    • IDE提供了仿真环境
    • 生成的程序体积较小,汇编质量较高
    • 网络资料较多
    • 只要能接受那个IDE,门槛较低
  • SDCC:
    • 免费的开源软件
    • 更接近标准C语言
    • 生成的程序体积较大,汇编质量一般
    • 不止能给8051写程序
    • 网络资料较少
    • 有一点点的门槛(需要自己配置环境和工作流

0x01 | 从Keil C51迁移到SDCC

sdcc 更加接近标准C编译器,对于不属于标准C语言的特性,sdcc 在其标识符前加上两个下划线进行标识。 sdcc中没有sbitbit这样的数据类型(但实际上有__sbit)。在Keil C51中常见的一些定义语句在SDCC中需要使用宏实现。

sbit SDA = P1 ^ 5;
sbit CLK_ST = P1 ^ 6;

在 sdcc 中:

#define SDA P1_5
#define CLK_ST P1_6

// 也可以使用__sbit,不过可能不是你想的那样
__sbit __at (0x90) P1_0 ;

另外,Keil C51中的interrupt关键字也被改为了__interrupt,在Keil C51中可以这样定义一个中断函数:

void my_interrupt_func()  interrupt 4
{
	// ...
}

而在 sdcc 中需要这样:

void my_interrupt_func()  __interrupt 4
{
	// ...
}

最后,sdcc 只支持以__asm开头,__endasm结尾的内联汇编。所以对于在Keil C51中常见的_nop_(),在 sdcc 中需要使用宏对其进行定义:

#define _nop_() __asm NOP __endasm
// ...
_nop_()

当然,你也可以直接写__asm__endasm段。

0x03 | packihx

sdcc 在默认参数配置下会把源文件编译出一堆东西,很不幸里面没有.hex。但是可以用 sdcc 提供的packihx工具把.ihx转换为Intel HEX格式的.hex。 (指令懒得写了,直接把路径接后面)(大概,没有测试,因为我用pio,不用自己弄(x