找回密码
 立即注册
查看: 2102|回复: 18

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

[复制链接]
  • TA的每日心情
    开心
    昨天 10:41
  • 签到天数: 289 天

    [LV.8]以坛为家I

    33

    主题

    158

    回帖

    1921

    积分

    金牌会员

    积分
    1921
    发表于 2023-12-31 18:31:02 | 显示全部楼层 |阅读模式
    迁移.jpg

    前言

    前边的分享中提到过,大多数同学刚开始接触51单片机的时候,使用的开发工具都是keil。 如果想要从keil切换成 VPS【VSCode + PIO + SDCC】是不是调整一下代码结构那么简单呢。答案是很遗憾,作为两种不同的编译器,keil跟SDCC的区别还是挺多的。在sdcc的参考手册中就有关于不同编译器代码移植的描述,如下图所示:

    sdcc文档.png

    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)






    存储相关的注意事项
    内存模型.png

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


    其他关键词及语法的区别
    • sdcc 支持的数据类型及默认长度

    支持的数据类型.png

    其中 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需要注意的事项。在后边的分享中会一一介绍。





    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    不争是争
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:54
  • 签到天数: 322 天

    [LV.8]以坛为家I

    0

    主题

    733

    回帖

    1187

    积分

    金牌会员

    积分
    1187
    发表于 2024-1-1 06:09:01 | 显示全部楼层
    喜欢VSCode的界面,但平时还是直接用Keil
    靡不有初,鲜克有终
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 07:58
  • 签到天数: 339 天

    [LV.8]以坛为家I

    91

    主题

    1321

    回帖

    3902

    积分

    论坛元老

    积分
    3902
    发表于 2024-1-1 08:12:27 | 显示全部楼层
    小涵子爸爸 发表于 2024-1-1 06:09
    喜欢VSCode的界面,但平时还是直接用Keil

    同感
    51我一般直接用Keil,ARM芯片有时才用VSCode
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:41
  • 签到天数: 289 天

    [LV.8]以坛为家I

    33

    主题

    158

    回帖

    1921

    积分

    金牌会员

    积分
    1921
     楼主| 发表于 2024-1-1 16:34:36 | 显示全部楼层
    小涵子爸爸 发表于 2024-1-1 06:09
    喜欢VSCode的界面,但平时还是直接用Keil

    我当时探索这个途径最主要是想解决mac电脑不能用keil的问题。
    不争是争
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-9-14 09:16
  • 签到天数: 45 天

    [LV.5]常住居民I

    3

    主题

    41

    回帖

    91

    积分

    注册会员

    积分
    91
    发表于 2024-1-1 20:53:55 | 显示全部楼层
    keilC51固然更贴合~  但是VSCODE写代码更顺畅
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    640

    主题

    1万

    回帖

    1万

    积分

    管理员

    积分
    15687
    发表于 2024-1-16 21:36:12 | 显示全部楼层
    51世界必须向 SDCC 靠拢了,我们现在忙,
    3个月后,我们 51的例程 会全部用 SDCC 测试一遍

    点评

    给大佬点赞。我最近研究了下用将库函数发布到pio直接安装就能用。刚测试通了gpio一个库,有时间把流程分享出来  发表于 2024-1-16 21:46
    回复 支持 3 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-10-6 10:54
  • 签到天数: 204 天

    [LV.7]常住居民III

    13

    主题

    199

    回帖

    1001

    积分

    金牌会员

    积分
    1001
    发表于 2024-1-17 14:00:28 | 显示全部楼层
    vscode也有keil的插件,可以用vscode写代码,keil来调试
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:07
  • 签到天数: 301 天

    [LV.8]以坛为家I

    24

    主题

    140

    回帖

    1185

    积分

    金牌会员

    积分
    1185
    发表于 2024-1-18 12:06:51 | 显示全部楼层
    弱弱的问一句,vscode还存在只有31个中断号,超过了得借用13中断号跳转的情况么
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 10:41
  • 签到天数: 289 天

    [LV.8]以坛为家I

    33

    主题

    158

    回帖

    1921

    积分

    金牌会员

    积分
    1921
     楼主| 发表于 2024-1-18 12:12:48 来自手机 | 显示全部楼层
    18344371880 发表于 2024-1-18 12:06
    弱弱的问一句,vscode还存在只有31个中断号,超过了得借用13中断号跳转的情况么 ...

    问题有点问题,vscode解决不了这个问题。这是编译器的问题。看sdcc的文档没有限制中断号大小。
    不争是争
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:07
  • 签到天数: 301 天

    [LV.8]以坛为家I

    24

    主题

    140

    回帖

    1185

    积分

    金牌会员

    积分
    1185
    发表于 2024-1-18 12:14:22 | 显示全部楼层
    大锤子 发表于 2024-1-18 12:12
    问题有点问题,vscode解决不了这个问题。这是编译器的问题。看sdcc的文档没有限制中断号大小。 ...

    这样子啊,哈哈哈,我也不太懂
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-11-1 07:52 , Processed in 0.084513 second(s), 90 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表