找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1471|回复: 4
收起左侧

基于SDCC的跨平台、轻量级IDE C语言编译器 Linux下开发嵌入式51单片机

[复制链接]
ID:1041851 发表于 2023-7-3 11:06 | 显示全部楼层 |阅读模式
SDCC 是一个开源免费的 C编译器,且支持跨平台,是在 Linux 下开发嵌入式( 51单片机 )应用的得力工具。但是其只有命令行的方式,使用起来诸多不方便。于是做了一个前端( SDCC 需要自行另外安装),代码编辑体验比 Keil 好很多,支持 Linux、Windows 平台,支持 x86、mips64el( loongson 3A ) 架构。

litmill.png


对于一些坛友说的 SDCC 的兼容性问题,我想说只要注意以下几点,基本没啥问题。
(为了简洁,下面的例子只截取关键部分代码,完整的验证程序在附件的 demo 里)

1、位取反操作使用 "! "而不要使用"~"

  1. typedef unsigned char uint8;
  2. #define PRINT_BIT_INVERSE 0x11
  3. #define PRINT_BIT_NOT 0x22

  4. void uart1_irq() __interrupt 4
  5. {
  6.     uint8 i;
  7.    
  8.     if (RI) {
  9.         RI = 0;
  10.         i = SBUF;
  11.         
  12.         if (PRINT_BIT_INVERSE == i) { //打印 00 01 或 01 01 结果是不确定的
  13.             uart1_send(IT0);
  14.             IT0 = ~IT0;
  15.             uart1_send(IT0);
  16.         }else if (PRINT_BIT_NOT == i) { //00 01 与 01 00 交替打印,结果与预期一致
  17.             uart1_send(IT0);
  18.             IT0 = !IT0;
  19.             uart1_send(IT0);
  20.     }
  21. }

复制代码


2、SDCC 内部数据使用小端存储,Keil 使用的是大端存储,所以访问大于1个字节以上的寄存器时需要分别赋值或读取
  1. void uart1_irq() __interrupt 4
  2. {
  3.     uint8 i;
  4.    
  5.     if (RI) {
  6.         RI = 0;
  7.         i = SBUF;
  8.         uart1_send(i); //先打印执行的指令
  9.         
  10.         //此时 PWM1_CNTR 设置值如下
  11.         //PWM1_CNTRH = 0x12;
  12.         //PWM1_CNTRL = 0x34;
  13.         if (PRINT_PWM1_CNTR == i) { //打印 PWM1_CNTR,打印 34 12
  14.             uart1_send(PWM1_CNTR >> 8);
  15.             uart1_send(PWM1_CNTR);
  16.         }else if (PRINT_PWM1_CNTR_DIV == i) { //分别打印 PWM1_CNTR,打印 12 34
  17.             uart1_send(PWM1_CNTRH);
  18.             uart1_send(PWM1_CNTRL);
  19.         }else if (PRINT_BGV == i) { //打印参考电压,打印 A4 04
  20.             uart1_send(*BGV >> 8);
  21.             uart1_send(*BGV);
  22.         }else if (PRINT_BGV_DIV == i) { //分别打印参考电压, 打印 04 A4,0x04A4十进制为1188符合STC8H内部参考电压范围
  23.             uart1_send(*BGVH);
  24.             uart1_send(*BGVL);
  25.         }
  26.     }
  27. }
复制代码


3、中断服务声明或定义必须在main函数所在文件中可见才能正常工作
  1. //将中断服务移到 uart1_interrupt.c 文件
  2. //如果注释掉下面这个声明,串口1就不能正常收发
  3. void uart1_irq() __interrupt 4;
复制代码


4、char 类型默认为 unsigned char 而非 signed char


  1. <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">//(编译前要将首选项中“char类型默认为有符号”选项取消勾选)</p>
  2. <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">char test = 0; //声明为 char 或者 unsigned char 时,程序交替打印128个 11 和128个 ff,而不会打印 00</p>
  3. <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; -qt-user-state:0;">//signed char test = 0;//声明为 signed char 时,程序交替打印128个 11 与128个 00 ,而不会打印 ff</p><style type="text/css">p, li { white-space: pre-wrap; }</style>
  4. void main()
  5. {
  6.     while (1) {
  7.         WDT_CONTR |= 0x10; //清看门狗
  8.         
  9.         ++test;

  10.         if (test < 0) {
  11.             uart1_send(0x00);
  12.         }else if (test >= 0x80) {
  13.             uart1_send(0xFF);
  14.         }else {
  15.             uart1_send(0x11);
  16.         }
  17.         
  18.         delay_ms(200);
  19.     }
  20. }
复制代码
下载: LitMill-v0.8.7z (10.91 MB, 下载次数: 13)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1087079 发表于 2023-7-3 20:02 | 显示全部楼层
第二点很重要,我就在这上边折腾了好久。还有大佬为啥不尝试使用platformio
回复

使用道具 举报

ID:1041851 发表于 2023-7-4 08:36 | 显示全部楼层
大锤子 发表于 2023-7-3 20:02
第二点很重要,我就在这上边折腾了好久。还有大佬为啥不尝试使用platformio

回头我试试,之前除了codeblocks,不知道有其他的 IDE 支持 SDCC,但 codeblocks 代码编辑风格不是我想要的,我所理想的是 Qt Creator 那般的编辑体验
回复

使用道具 举报

ID:467496 发表于 2023-7-5 17:41 | 显示全部楼层
很有创意
回复

使用道具 举报

ID:1041851 发表于 2023-10-16 11:39 | 显示全部楼层
更新:
0.9版本(2023.10)
增加支持 loong64-newabi 架构

添加功能:拖拽标签页调整位置
添加功能:生成Makefile(工程配置-->高级-->生成Makefile)
添加功能:鼠标在符号悬停显示提示信息
修复若干bug



LitMill-v0.9.zip

12.76 MB, 下载次数: 3, 下载积分: 黑币 -5

litMill-v0.9

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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