微控制器開發,推薦開源跨平台的SDCC編譯器

2021-10-09 03:51:30 字數 2629 閱讀 4587

摸索了幾天,把stc8a微控制器的程式轉到了sdcc編譯器。如果是剛接觸微控制器,沒用過其他編譯器,那麼不會感覺有啥難度。如果從其他開發工具轉過來,可能需要適應一下新環境。

stc官網給出的標頭檔案和例程基本是基於keil的,這也讓許多人選擇keil開發環境。keil確實有過人之處,商業軟體,比較可信賴。但是keil也有不足:一、它是收費的,免費也可以用,但有**長度限制。我記得以前keil是免費的,被收購之後就收費了。二、keil只有windows版本,限制了使用的平台。

sdcc則是開源的,在多個平台可以使用,如linux, 蘋果電腦, windows就更不在話下了,並且承諾一直開發更新。

看了一下stc8的標頭檔案,只是暫存器位址的說明方法在sdcc中略有不同,使用notepad++很容易轉換過來。sdcc也有自己的標頭檔案,針對8051的,或者其他微控制器的,都有。所以,也可以不用修改stc8的標頭檔案,直接用sdcc提供的就好。

我使用的是sdcc 4.0 64位版本的。簡單說說這個版本的使用方法。

1,sdcc支援多種微控制器。它使用命令列編譯,可以使用命令列引數指示編譯功能。使用sdcc --help檢視各編譯引數。

cc = sdcc

exec = main.ihx

src = $(wildcard *.c)

obj = $(src:%c=%rel)

ccflag = -c --stack-auto --no-xinit-opt --model-large

ldflag = --stack-auto --no-xinit-opt --model-large

$(exec):$(obj)

$(cc) $(ldflag) $(obj) -o $(exec)

%.rel:%.c

$(cc) $(ccflag) $(<) -o $(@)

注:下面2行前面的空格要用tab符替換

$(cc) $(ldflag) $(obj) -o $(exec)

$(cc) $(ccflag) $(<) -o $(@)

3,--stack-auto編譯引數。預設的如果不使用--stack-auto編譯引數,sdcc將函式引數和區域性變數編譯為資料變數,這是考慮到8051的堆疊空間有限,防止堆疊空間不足的處理辦法。說實在的8051的8位堆疊指標確實能訪問的空間不大。但sdcc這樣處理的問題也來了:如果函式的區域性變數比較多,它就可能報告「沒有***個連續的資料儲存器在dseg」,造成編譯失敗。自己寫的**,儘量減少函式引數和區域性變數。如果從電腦程式移植到8051的,這就不能怪sdcc,只能怪計算機的堆疊空間太大了,用起來太隨意了。sdcc是比較保守的編譯器,優化處理不大可能做。

4,使用--stack-auto編譯引數。使用--stack-auto編譯引數,sdcc真正將函式和區域性變數編譯進堆疊,資料區也比較清爽了,程式也編譯通過了。但是,要小心堆疊溢位了。對於引數比較多的函式,最好將它們從參數列移出來,用全域性變數傳遞。函式區域性變數使用static宣告為資料變數。這樣要占用一些資料空間,可是,堆疊空間不是小嗎,也是一種解決辦法了。其實,8051的上百個位元組的堆疊空間也不算小了,因此推薦使用--stack-auto編譯引數。

5,使用__code宣告查表資料。查表資料是不會改變的資料,如果資料空間緊張,將他們宣告為__code,資料編譯到**空間,節省了資料空間。一般地,sdcc預設編譯ram資料空間256,xdata擴充套件資料空間64kb,程式空間64kb。檢視mem檔案可以看到具體使用量。檢視lst檔案可以看到具體分配情況。

6,使用 --no-xinit-opt。sdcc 4.0這個版本有點怪異,對需要初始化的__xdata預設不能完成初始化(等同於使用--model-large編譯)。sdcc手冊說使用了mov指令做了優化,實際檢視編譯的lst檔案,初始化資料是編譯了,但是沒有mov。知道原因了,就不管它為啥沒mov了。使用--no-xinit-opt行了。

int putchar (int c) {

while (!ti) /* assumes uart is initialized */ ;

ti = 0;

sbuf = c;

return c;

8,列印浮點數。printf庫函式預設不支援列印浮點數。要列印浮點數,需要重新編譯printf原始碼。推薦編譯src目錄中的printf_large.c,對於8051,使用 -duse_floats=1 和 --model-large引數,然後鏈結它。printf和sprintf函式是很能占用**空間的庫函式啊。

9,浮點和長型定點運算。sdcc使用一套來自gcc的數學函式庫來完成浮點和長型定點運算,運算效率一般,好處是可靠。

10,燒寫stc微控制器。我燒寫程式使用stc官網的isp軟體。檔案可以直接使用預設生成的ihx檔案,不必轉換成hex。

11,預設**效率。sdcc屬於很保守的編譯器了,對全域性變數分配,**優化做的不多。這樣的好處是可靠性高。所以,不能指望它編譯出的程式**高效,只能寄希望使用的微控制器高效了,呵呵。stc8a8k64s12執行128點的fft運算速度約為25次每秒,相比於keil編譯的**40次每秒的速度,略遜一些。

12,手工優化。通過簡單的手工處理**:1,常數直接寫進**中;2,使用移位代替常數乘除運算;3,查表資料使用__code編譯到**區。通過這3點簡單處理,128點的fft運算速度提高到了55次每秒,速度提高1倍多。可見,對於編譯器,**編寫對了非常重要。

總之,sdcc還是值得信賴和使用的。畢竟,它是開源的,能做到這些,已經非常可貴了。

51微控制器 51系列微控制器的開發模板

這個是微控制器開發的模板,下面給些注釋和思路,開發的時候其實是經常使用的,之前也不懂,參加藍橋杯之後學習到的,如果有時間和機會,會結合前輩的這些思路,再寫個stm32和嵌入式下的開發模板,這個很有利於專案的設計開發。說明 適用於stc15f2k60s2微控制器,其他的類似,只需要改動相關的定時器設定...

Linux和Windows平台的微控制器串列埠通訊

1 windows 我們首先用串列埠除錯助手進行串列埠通訊,再使用c語言程式設計進行通訊。windows上的串列埠除錯助手我使用的是安信可串列埠除錯助手 在微控制器中寫好串列埠通訊的 在串列埠除錯助手中對應設定好串口號 波特率等引數,串列埠在win10下可以通過win x 裝置管理器 埠來檢視。當然...

總結51微控制器開發的要點

1 微控制器io口上電後預設是高電平。p1 p2 p3口內部上拉,若p0口未接上拉電阻的話,預設是高阻態 2 微控制器工作頻率 晶振頻率 12,即使用12mhz的晶振,實際工作頻率為1mhz,乙個機器週期為1us。3 微控制器常用11.0592mhz的晶振,主要是保證串列埠通訊的同步。比如說在960...