最近在除錯微控制器程式,總是遇到一些開始認為不可思議的事情,後來解決了問題後發現,都是因為自己書寫程式不嚴謹,其主要原因是沒有注意c語言的資料型別的資料範圍。
對有符號、無符號資料的使用存在誤區,對型別轉換理解不到位。下面就舉例一一說明:
1:乙個簡單的for迴圈,但因為資料溢位導致進入死迴圈,無法實現相應功能。
unsigned char i;
for(i=0;i<256;i++)
語句;咋看起來這語句沒有什麼問題。但仔細考慮發現,i在此迴圈中會溢位,i的值 0---255---0----255----0-----------。
2:在迴圈裡還需要注意的是有符號數和無符號數進行比較時:
unsigned char i;
i=230;
if(i>-5)
當無符號和有符號數進行比較時,會把無符號數轉換為有符號數,i=230轉換成有符號數是-26 因此if條件不成立。
3:使用printf或sprintf時,注意要列印的數值的資料型別,否則列印出來的不是你需要的。
4:注意在各個函式引數或者其他賦值時的資料型別的預設轉換。考慮清楚的型別不匹配時,和預設型別轉換不符時,可以使用強制型別轉換。
5:昨天除錯乙個微控制器漢字顯示程式時,遇到資料簡單運算結果不對的情況。
uchar ch0,ch1;
uint32 offset;
offset=(uint32) (hz_base_addr+((((ch0 - 1) * 94) + (ch1 - 1))*32)); 這個語句算出的結果不對,開始不理解,後來發現還是資料型別的問題。原因是ch0是無符號字元型別的,因此((ch0 - 1) * 94) 的結果溢位。導致出錯。修正方案:offset=(uint32) (hz_base_addr+((((ch0 - 1) * 94l) + (ch1 - 1))*32l)); 新增強制轉換,把立即數強制為long int型資料,根據c語言預設資料型別提公升方案,其他參與運算的數值也轉換為long int型。問題解決。
檔案 微控制器 如何檢視你寫的微控制器程式有多大?
如下圖所示,就是乙個編譯好的hex檔案 ro data 表示唯讀資料,程式中所定義的全域性常量資料和字串都位於此處。rw data 表示已初始化的讀寫資料,程式中定義並且初始化的全域性變數和靜態變數位於此處。zi data 表示未初始化的讀寫資料,程式中定義了但沒有初始化的全域性變數和靜態變數位於此...
微控制器程式是如何執行的 指令資料寫哪了
微控制器的執行需要執行程式,同時硬體也是必不可少的,二者缺一不可。大家都知道微控制器的執行需要執行寫好的程式,但是微控制器的指令資料都被寫在了 在哪讀取指令?讓我們從最開始的環節講起。在微控制器上電的瞬間,mcu的程式指標pc會被初始化為上電復位時的位址,從哪個位址處讀取將要執行的指令,由此程式在m...
微控制器串列埠收發字元資料的型別
今天在用51微控制器進行串列埠收發資料的時候遇到了這樣乙個問題,上位機給微控制器的字元資料是什麼型別的,微控制器又是怎樣儲存的?串列埠中斷如下 uart中斷服務函式 void interruptuart interrupt 4 else 位元組傳送完畢 問題1 微控制器將接收到的資料放到sbuf中儲...