使用 SDCC 编译器开发 51 单片机应用时需要注意的几个地方

        相信使用过 SDCC 开发 51单片机程序的人都遇到过,同样的代码(变量声明有区别,只因两者修饰符不同(诸如sfr与__sfr)),在 Keil 中调试正常,但 SDCC 编译出的程序就有问题。这个其实是 Keil 与 SDCC 之间的差别所致了,经过网上多方查阅验证,发现使用 SDCC 时需要注意几个地方:

一、位变量取反操作使用“!”(非)而不是“~”(按位取反)

        SDCC在处理位变量(__bit、__sbit类型)的“~”(按位取反)操作时会进行类型提升,出现不确定的结果,所以引脚反转时应写成“ LED = !LED ”而非“ LED = ~LED ”的形式。

二、中断服务函数的声明或定义要在 main 函数所在文件出现

        有时候为了代码方便管理,我们会将中断服务函数和相应模块放在一个文件里(如 timer 中断放在 timer.c 中)或者集中放在一个文件中(如 interrupt.c)。如果 main 函数在不同的文件里(如 main.c),中断服务程序是不会工作的。这时必须在 main.c 文件中加入中断服务函数的声明(如 timer_irq __interrupt 1 是的,中断函数的声明也要加上中断号。也可以将声明放在一个头文件里,然后在 main.c 文件中使用 #include 宏包含)。

三、数据字节序为小端存储(Little Endian)

        SDCC 与 Keil 最大的区别就是数据存储采用小端字节序,标准的51(包括8052)单片机寄存器地址采用的是小端序(参考定时器2的计数器TH2(0xCD)、TL2(0xCC)),而 MCU 厂商自行扩展的寄存器地址则因厂商而不同,例如 STC 采用的是与 Keil 一样的大端序(参考PWMA的计数器PWMA_CNTRH(0xFECE)、PWMA_CNTRL(0xFECF)),WCH 则采用的是小端序。所以当使用大端序的 MCU 时,程序中一次性存取多字节寄存器(大于1个字节)就会出错,例如 STC 的 MCU 直接读取 PWMA_CNTR(0xFECE)获取到的就是错误的结果。所以在小端序的 MCU  无所谓,但在大端序的 MCU ,多字节的寄存器应该分别读取高低字节的数据然后自行拼接。

四、char类型默认是 unsigned char

        不加 unsigned 或 signed 修饰的 char 变量,SDCC 默认解释是无符号的(这点和 Keil 是一样的),当变量用于计算或比较时需要特别注意。

只要规避了上面几个坑,虽然 SDCC 开发出来的程序空间占用仍然偏大,但运行一般是没什么问题了。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Visual Studio Code中进行SDCC开发51单片机,可以按照以下步骤进行操作: 1. 首先,确保你已经安装了Visual Studio Code编辑器。你可以从官方网站上下载并安装它。 2. 打开Visual Studio Code,并在应用商店中搜索并安装EIDE扩展。这个扩展提供了对51单片机开发的支持和工具链。 3. 安装完EIDE扩展后,你可以打开一个新的项目或文件夹,在其中进行开发。你可以创建一个新的文件,编写SDCC的代码,并保存为.c格式。 4. 接下来,你需要配置EIDE扩展以支持SDCC工具链。你可以在Visual Studio Code的设置中找到扩展的配置选项,并添加SDCC的安装路径。这样EIDE扩展就能够调用SDCC编译器来编译你的代码。 5. 编写完成后,你可以使用EIDE扩展提供的命令进行编译和烧录。这个扩展还提供了调试功能,可以帮助你在Visual Studio Code中进行单片机代码的调试。 6. 如果你需要在Visual Studio Code中使用简体中文界面,你可以在应用商店中搜索并安装"Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code"扩展。 总结起来,通过安装Visual Studio Code编辑器,然后在应用商店中搜索并安装EIDE扩展,你就可以在Visual Studio Code中进行SDCC开发51单片机。通过配置扩展和编写代码,你可以使用SDCC工具链进行编译、烧录和调试操作。如果需要中文界面,可以安装相应的语言包扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值