找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2673|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

基于SDCC的跨平臺、輕量級IDE C語言編譯器 Linux下開發(fā)嵌入式51單片機

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1041851 發(fā)表于 2023-7-3 11:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
SDCC 是一個開源免費的 C編譯器,且支持跨平臺,是在 Linux 下開發(fā)嵌入式( 51單片機 )應(yīng)用的得力工具。但是其只有命令行的方式,使用起來諸多不方便。于是做了一個前端( SDCC 需要自行另外安裝),代碼編輯體驗比 Keil 好很多,支持 Linux、Windows 平臺,支持 x86、mips64el( loongson 3A ) 架構(gòu)。




對于一些壇友說的 SDCC 的兼容性問題,我想說只要注意以下幾點,基本沒啥問題。
(為了簡潔,下面的例子只截取關(guā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ù)使用小端存儲,Keil 使用的是大端存儲,所以訪問大于1個字節(jié)以上的寄存器時需要分別賦值或讀取
  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.         //此時 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十進制為1188符合STC8H內(nèi)部參考電壓范圍
  23.             uart1_send(*BGVH);
  24.             uart1_send(*BGVL);
  25.         }
  26.     }
  27. }
復(fù)制代碼


3、中斷服務(wù)聲明或定義必須在main函數(shù)所在文件中可見才能正常工作
  1. //將中斷服務(wù)移到 uart1_interrupt.c 文件
  2. //如果注釋掉下面這個聲明,串口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;">//(編譯前要將首選項中“char類型默認(rèn)為有符號”選項取消勾選)</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. }
復(fù)制代碼
下載: LitMill-v0.8.7z (10.91 MB, 下載次數(shù): 13)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1087079 發(fā)表于 2023-7-3 20:02 | 只看該作者
第二點很重要,我就在這上邊折騰了好久。還有大佬為啥不嘗試使用platformio
回復(fù)

使用道具 舉報

板凳
ID:1041851 發(fā)表于 2023-7-4 08:36 | 只看該作者
大錘子 發(fā)表于 2023-7-3 20:02
第二點很重要,我就在這上邊折騰了好久。還有大佬為啥不嘗試使用platformio

回頭我試試,之前除了codeblocks,不知道有其他的 IDE 支持 SDCC,但 codeblocks 代碼編輯風(fēng)格不是我想要的,我所理想的是 Qt Creator 那般的編輯體驗
回復(fù)

使用道具 舉報

地板
ID:467496 發(fā)表于 2023-7-5 17:41 | 只看該作者
很有創(chuàng)意
回復(fù)

使用道具 舉報

5#
ID:1041851 發(fā)表于 2023-10-16 11:39 | 只看該作者
更新:
0.9版本(2023.10)
增加支持 loong64-newabi 架構(gòu)

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



LitMill-v0.9.zip

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

litMill-v0.9

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表