標(biāo)題: 基于SDCC的跨平臺(tái)、輕量級(jí)IDE C語(yǔ)言編譯器 Linux下開(kāi)發(fā)嵌入式51單片機(jī) [打印本頁(yè)]

作者: littlespider    時(shí)間: 2023-7-3 11:06
標(biāo)題: 基于SDCC的跨平臺(tái)、輕量級(jí)IDE C語(yǔ)言編譯器 Linux下開(kāi)發(fā)嵌入式51單片機(jī)
SDCC 是一個(gè)開(kāi)源免費(fèi)的 C編譯器,且支持跨平臺(tái),是在 Linux 下開(kāi)發(fā)嵌入式( 51單片機(jī) )應(yīng)用的得力工具。但是其只有命令行的方式,使用起來(lái)諸多不方便。于是做了一個(gè)前端( SDCC 需要自行另外安裝),代碼編輯體驗(yàn)比 Keil 好很多,支持 Linux、Windows 平臺(tái),支持 x86、mips64el( loongson 3A ) 架構(gòu)。




對(duì)于一些壇友說(shuō)的 SDCC 的兼容性問(wèn)題,我想說(shuō)只要注意以下幾點(diǎn),基本沒(méi)啥問(wèn)題。
(為了簡(jiǎn)潔,下面的例子只截取關(guān)鍵部分代碼,完整的驗(yàn)證程序在附件的 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 結(jié)果是不確定的
  13.             uart1_send(IT0);
  14.             IT0 = ~IT0;
  15.             uart1_send(IT0);
  16.         }else if (PRINT_BIT_NOT == i) { //00 01 與 01 00 交替打印,結(jié)果與預(yù)期一致
  17.             uart1_send(IT0);
  18.             IT0 = !IT0;
  19.             uart1_send(IT0);
  20.     }
  21. }

復(fù)制代碼


2、SDCC 內(nèi)部數(shù)據(jù)使用小端存儲(chǔ),Keil 使用的是大端存儲(chǔ),所以訪問(wèn)大于1個(gè)字節(jié)以上的寄存器時(shí)需要分別賦值或讀取
  1. void uart1_irq() __interrupt 4
  2. {
  3.     uint8 i;
  4.    
  5.     if (RI) {
  6.         RI = 0;
  7.         i = SBUF;
  8.         uart1_send(i); //先打印執(zhí)行的指令
  9.         
  10.         //此時(shí) PWM1_CNTR 設(shè)置值如下
  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十進(jìn)制為1188符合STC8H內(nèi)部參考電壓范圍
  23.             uart1_send(*BGVH);
  24.             uart1_send(*BGVL);
  25.         }
  26.     }
  27. }
復(fù)制代碼


3、中斷服務(wù)聲明或定義必須在main函數(shù)所在文件中可見(jiàn)才能正常工作
  1. //將中斷服務(wù)移到 uart1_interrupt.c 文件
  2. //如果注釋掉下面這個(gè)聲明,串口1就不能正常收發(fā)
  3. void uart1_irq() __interrupt 4;
復(fù)制代碼


4、char 類型默認(rèn)為 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;">//(編譯前要將首選項(xiàng)中“char類型默認(rèn)為有符號(hào)”選項(xiàng)取消勾選)</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 時(shí),程序交替打印128個(gè) 11 和128個(gè) ff,而不會(huì)打印 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 時(shí),程序交替打印128個(gè) 11 與128個(gè) 00 ,而不會(huì)打印 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. }
復(fù)制代碼
下載: LitMill-v0.8.7z (10.91 MB, 下載次數(shù): 13)

作者: 大錘子    時(shí)間: 2023-7-3 20:02
第二點(diǎn)很重要,我就在這上邊折騰了好久。還有大佬為啥不嘗試使用platformio
作者: littlespider    時(shí)間: 2023-7-4 08:36
大錘子 發(fā)表于 2023-7-3 20:02
第二點(diǎn)很重要,我就在這上邊折騰了好久。還有大佬為啥不嘗試使用platformio

回頭我試試,之前除了codeblocks,不知道有其他的 IDE 支持 SDCC,但 codeblocks 代碼編輯風(fēng)格不是我想要的,我所理想的是 Qt Creator 那般的編輯體驗(yàn)
作者: 56379075    時(shí)間: 2023-7-5 17:41
很有創(chuàng)意
作者: littlespider    時(shí)間: 2023-10-16 11:39
更新:
0.9版本(2023.10)
增加支持 loong64-newabi 架構(gòu)

添加功能:拖拽標(biāo)簽頁(yè)調(diào)整位置
添加功能:生成Makefile(工程配置-->高級(jí)-->生成Makefile)
添加功能:鼠標(biāo)在符號(hào)懸停顯示提示信息
修復(fù)若干bug

[attach]320273[/attach]

LitMill-v0.9.zip

12.76 MB, 下載次數(shù): 5, 下載積分: 黑幣 -5

litMill-v0.9






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1