前言
前边的分享中提到过,大多数同学刚开始接触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中有下划线;
其他关键词及语法的区别
其中 bool、和char类型默认是无符号的,在keil中默认是有符号的;
写在最后
这里需要特别介绍一下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需要注意的事项。在后边的分享中会一一介绍。
|