久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2507|回復: 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 ) 架構。




對于一些壇友說的 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 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
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 | 只看該作者
很有創意
回復

使用道具 舉報

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

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



LitMill-v0.9.zip

12.76 MB, 下載次數: 5, 下載積分: 黑幣 -5

litMill-v0.9

回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久婷婷香蕉 | 国产91在线播放 | 亚洲天天 | 可以免费观看的av | 高清视频一区二区三区 | 成年人免费看 | 国产精品2 | 91高清视频| 午夜精品一区二区三区免费视频 | 日韩综合在线 | 日韩亚洲一区二区 | 精品免费在线 | 国产三级日本三级 | 久久久久久久91 | 亚洲精品一区中文字幕乱码 | 91av视频在线播放 | 欧美精品在线播放 | 国产精品日韩高清伦字幕搜索 | 青草福利 | 欧洲精品视频一区 | 欧美日韩国产一区二区 | 日日碰狠狠躁久久躁96avv | 国产精品久久久久久婷婷天堂 | 亚洲一区二区电影在线观看 | 欧美啪啪 | 欧美精品一区二区三区在线 | 亚洲成人精选 | 国产福利在线 | 欧美激情视频网站 | 亚洲第一视频网站 | 日日夜夜天天综合 | 日韩中文字幕一区二区 | 国产日韩免费视频 | 国产一级电影网 | 国产av毛片| 免费激情网站 | 久久成人免费视频 | 欧美一级在线 | 国产一级在线 | 91在线视频网址 | 免费视频一区 |