(1)採用短型變數
提高**效率最基本的方法就是減小變數的長度。減少int(16bit)的使用,多用unsigned char(8bit)。
(2)使用無符號型別
(3)使用位變數
對於某些標誌位應使用位變數而不是unsigned char,可以節省7位的儲存單元,且在ram中訪問位變數比較快。
(4)用區域性變數代替全域性變數
(5)使用巨集代替函式,讓程式有更好的可讀性
bit位標量是c51編譯器的一種擴充資料型別,利用它可以定義乙個位標量,但是不能定義位指標
也不能定義位陣列。它的值是乙個二進位制位,不是0或1,類似boolean中的true和false。
sfr也是一種擴充資料型別,點用乙個記憶體單元,值域為0~255.利用它可以訪問51微控制器內部的所有特殊功能暫存器。如果sfr p1 = 0x90,這一句定p1為p1埠在片內的暫存器,在後面的語句中我們可以用p1=255(對p1埠的所有的引腳置高電平)之類的語句來操作特殊功能暫存器。sfr是定義8位的特殊功能暫存器而sfr16 則是定義16位特殊功能暫存器。
1.定義的變數不要太多。低128位為使用者定義變數的存放區域(預設時),也可以把變數放在高128位,但容易出錯,盡量少放,最好不放。通過*.m51可以檢視記憶體變數的存放,最好不要超過110個位元組,否則程式無法執行或出錯。
2.如乙個變數多處使用可定義為全域性變數。例如迴圈變數i、j,儘量減少引數傳遞。
3.靜態變數最好放在程式儲存區,用code定義。
4.變數應定義為無符號數,像標誌位等僅佔一位的變數應定義為bit。
5.子程式在main()主程式之後的應事先宣告,放在前面的不用宣告。
6.變數、子程式定義但沒使用,系統給出警告。
7.雖然區域性變數和全域性變數不同名,但執行時可能被全域性變數改變。
8.程式在編譯後,有可能產生非常大的檔案。比如原來5k,編譯後變成10k,這是c彙編時程式空間分配太隨意造成的。可首先遮蔽一部分程式編譯,然後再去遮蔽再編譯,可恢復,或一部分一部分複製到另乙個檔案中編譯。
9.如產生脈衝訊號用到定時器,要去掉脈衝訊號時,應先關定時器,再按要求把電平置為高電平或低電平。
10.可使用軟體實現「看門狗」功能。比如:乙個程式執行乙個迴圈需要50ms,則定時器可定位100ms,當超過100ms時,程式將復位,在程式迴圈最下面都重灌定時器或重置定時器引數。
11.為了提高所求值的精度,可多次測量,然後排序,去掉最大值和最小值,求平均值,或直接求平均值。
12.可使用乙個定時器進行多個定時。一般來說,兩個定時器對大一點的程式就不夠用了,假如幾個定時時間分別為10ms、200us、50ms,則定時值可定位200us,另設兩個變數即可。在需要多個定時時,找到他們的最小公約數定時即可。
13.我們往微控制器中寫程式時,寫的是*.hex,不要被它的大小所迷惑,對於8k的微控制器,小於20k的程式都可寫進去。
C51儲存的優化
我們知道51微控制器只有128byte的ram,有的增強型有xram,此時程式設計時就要注意,否則就有可能超出空間 1 對於各模組的全域性變數 靜態變數 全域性列舉型常量,靜態列舉型常量 個別操作儲存 如外部spi flash 的區域性變數都要修飾成xdata型別,從而節省空間。2 對於bit型變數...
C51下彙編的嵌入
1 c51語言中呼叫組合語言程式 c51語言呼叫組合語言程式要注意以下幾點 1 在檔案欄選中 file group 和c51 程式原檔案,在配置檔案選項中啟用 產生彙編 src 檔案,編譯 src 檔案 和 建立工程 目標 時包含 三個選項。2 根據選擇的編譯模式,把相應的庫檔案 如 small 模...
大宇的ucos移植c51心得
這是我的移植心得 微控制器使用 r7傳引數,在呼叫任務函式時,提前把 r7裡放上該傳的引數值,等到呼叫任務函式時,編譯器自動到 r7裡把引數取出放到任務函式的形參裡。本人在做傳參時,在 main 裡宣告int8u idata dat 0x05 注意是 idata 在create 任務時傳過去的引數是...