嵌入式開發之常見C語言問題探討

嵌入式系統的C語言開發中,經常遇到這樣那樣的問題。有些問題可能很快就能找到原因,但是有些問題必須有一定的經驗積累才能快速找到原因。本著「吃一塹長一智;別人吃一塹,我長一智」的精神,本文整理了本人所了解的和經常遇到的嵌入式開發中的C語言典型問題,不足之處歡迎各位專家指摘賜教。

一、由編譯優化引起的問題

例1、編譯后的彙編語言處理邏輯跟C語言處理邏輯不一致

由於編譯器的原因,在設置了編譯優化的情況下,編譯後有些代碼的邏輯會發生變化。這種情況下會發生很奇怪的問題,一些函數的處理結果跟預想的不一致,而檢查代碼又看不出什麼問題。

這種問題的解決辦法一般是在充分分析軟體處理邏輯,確認處理上沒問題后,把編譯后的列表文件(*.lis)和C語言處理邏輯逐行對照。把不一致的地方找出來,並尋找修正對策。

例2、編譯后的一些處理被優化了

這種問題經常發生在硬體寄存器的操作上。對於硬體而言,每一次讀寫操作可能都有特定的含義:某些硬體寄存器要求讀一下才能做後續其他處理;而某些寄存器要連續寫幾次。比如下面的情形:

#define TSTREG (unsigned char *) 0x00C00032 /*TEST REGISTER */

unsigned char *pTSTR;

pTSTR = TSTREG;

*pTSTR = 0x01; //這個操作很容易被編譯器優化掉。

*pTSTR = 0x02;

……

作為對策之一,可以在定義變數時加上volatile關鍵字。比如:

volatile unsigned char *pTSTR;

volatile關鍵詞影響編譯器編譯的結果,用volatile聲明的變數表示該變數隨時可能發生變化,與該變數有關的運算,不要進行編譯優化,以免出錯。使用volatile變數的幾個場景:

1)中斷服務程序中修改的供其它程序檢測的變數需要加volatile。

2)多任務環境下各任務間共享的標誌應該加volatile。

3)存儲器映射的硬體寄存器通常也要加voliate,因為每次對它的讀寫都可能有不同意義。

二、由位元組對齊引起的問題

全文請閱讀原文。



---
資料來源:嵌入式開發之常見C語言問題探討
如果內容有不適當或對出處有疑慮,請立即通知客服中心
值得看看:
→ 
→ 
→ 
Facebook留言板
您可能有興趣
客服信箱
一則未讀訊息
發訊息給線上客服