大锤子 发表于 2023-12-31 18:31:02

从 KEIL C51 到 SDCC, VPS【VSCode + PIO + SDCC】



前言
前边的分享中提到过,大多数同学刚开始接触51单片机的时候,使用的开发工具都是keil。 如果想要从keil切换成 VPS【VSCode + PIO + SDCC】是不是调整一下代码结构那么简单呢。答案是很遗憾,作为两种不同的编译器,keil跟SDCC的区别还是挺多的。在sdcc的参考手册中就有关于不同编译器代码移植的描述,如下图所示:
sdcc跟keil的一些区别
结合上边文档中给出的注意事项和我在使用过程中所遇到的问题,分享一下在迁移的过程中需要注意的事项。肯定不全,会在以后的实践中不断完善,也希望各位同学能一起使用,共同完善。
特殊功能寄存器的定义方式       这里可以直接参考keil使用的头文件和sdcc使用的头文件的不同,对比如下:
不同点 keil sdcc 示例
特殊功能寄存器声明 sfr __sfr __sfr __at(0x80) P0
可位寻址的位寄存器声明 sbit __sbit __sbit __at(0x80 + 0) P00
扩展特殊功能寄存器声明volatile unsigned char xdata name _at_ addr__xdata volatile unsigned char __at(addr) name __xdata volatile unsigned char __at(0xFCA0) PWM5CH

16位特殊功能寄存器声明 sfr16 __sfr16 __sfr16 __at(((0xCC+1U)<<8) | 0xCC)TMR2
32位特殊功能寄存器声明 无 __sfr32
中断使用中的注意事项

[*]中断服务函数的声明




         If you have multiple source files in your project, interrupt service routines can be present in any of them, but a prototype of the isr MUST be present or included in the file that contains the function main.
         摘自用户手册中的一段,如果你的工程中有多个源文件,可以将中断服务函数写在任意的源文件中。但是需要在main函数所在的源文件中声明;

[*]中断服务函数声明的关键字

    void name (void) __interrupt (vector)






存储相关的注意事项


上边这种图相信都不陌生,其中的关键词跟keil也是有区别的,keil中没有下划线,在sdcc中有下划线;


其他关键词及语法的区别

[*]sdcc 支持的数据类型及默认长度
其中 bool、和char类型默认是无符号的,在keil中默认是有符号的;


[*]bool 类型中不能使用 ~ 而是需要使用 !



写在最后
      这里需要特别介绍一下sdcc提供的一个头文件,在 .platformio\packages\toolchain-sdcc\include\mcs51 这个目录下的 compile.h,引用原文:* Header file to overcome 8051 compiler differences for specifying
* special function registers. The following compilers are supported:
* SDCC, Keil, Raisonance, IAR, Hi-Tech, Tasking, Crossware, Wickenhaeuser.
* Unfortunately not for use with Dunfield.
使用这个头文件可以屏蔽不同编译器在特殊功能寄存器定义时的语法的不同。不仅能支持SDCC,还能支持Keil, Raisonance, IAR, Hi-Tech 等。

      这篇文章仅仅是介绍了一下很常见的比较简单的不同点,在使用的过程中除了SDCC还有很多关于PIO需要注意的事项。在后边的分享中会一一介绍。





小涵子爸爸 发表于 2024-1-1 06:09:01

喜欢VSCode的界面,但平时还是直接用Keil

xxkj2010 发表于 2024-1-1 08:12:27

小涵子爸爸 发表于 2024-1-1 06:09
喜欢VSCode的界面,但平时还是直接用Keil
同感
51我一般直接用Keil,ARM芯片有时才用VSCode

大锤子 发表于 2024-1-1 16:34:36

小涵子爸爸 发表于 2024-1-1 06:09
喜欢VSCode的界面,但平时还是直接用Keil

我当时探索这个途径最主要是想解决mac电脑不能用keil的问题。

开物 发表于 2024-1-1 20:53:55

keilC51固然更贴合~但是VSCODE写代码更顺畅

神农鼎 发表于 2024-1-16 21:36:12

51世界必须向 SDCC 靠拢了,我们现在忙,
3个月后,我们 51的例程 会全部用 SDCC 测试一遍

challis 发表于 2024-1-17 14:00:28

vscode也有keil的插件,可以用vscode写代码,keil来调试

18344371880 发表于 2024-1-18 12:06:51

弱弱的问一句,vscode还存在只有31个中断号,超过了得借用13中断号跳转的情况么

大锤子 发表于 2024-1-18 12:12:48

18344371880 发表于 2024-1-18 12:06
弱弱的问一句,vscode还存在只有31个中断号,超过了得借用13中断号跳转的情况么 ...

问题有点问题,vscode解决不了这个问题。这是编译器的问题。看sdcc的文档没有限制中断号大小。

18344371880 发表于 2024-1-18 12:14:22

大锤子 发表于 2024-1-18 12:12
问题有点问题,vscode解决不了这个问题。这是编译器的问题。看sdcc的文档没有限制中断号大小。 ...

这样子啊,哈哈哈,我也不太懂
页: [1] 2
查看完整版本: 从 KEIL C51 到 SDCC, VPS【VSCode + PIO + SDCC】