1 為什麼要用高級語言當設計一個小的嵌入式系統時 一般我們都用彙編語言 在很多工程中 這是一個很好的方法 因為 代碼一般都不超過 8K 而且都比較簡單 如果硬體工程師要同時設計軟體和硬體 經常會採用彙編語言來做程序 我的經驗告述我 硬體工程師一般不熟系像 C一類的高級語言使用彙編的麻煩在於它的可讀性和可維護性 特別當程序沒有很好的標註的時候 代碼的可重用性也比較低 如果使用 C 的話 可以很好的解決這些問題用 C 編寫的程序 因為 C 語言很好的結構性和模塊化 更容易閱讀和維護 而且由於模塊化 用 C 語言編寫的程序有很好的可移植性 功能化的代碼能夠很方便的從一個工程移植到另一個工程 從而減少了開發時間用 C 編寫程序比彙編更符合人們的思考習慣 開發者可以更專心的考慮算法而不是考慮一些細節問題 這樣就減少了開發和調試的時間使用像 C 這樣的語言 程式設計師不必十分熟系處理器的運算過程 這意味著對新的處理器也能很快上手 不必知道處理器的具體內部結構 使得用 C 編寫的程序比彙編程序有更好的可移植性 很多處理器支持 C 編譯器所有這些並不說明彙編語言就沒了立足之地 很多系統 特別是實時時鐘系統都是用C 和彙編語言聯合編程 對時鐘要求很嚴格時 使用彙編語言成了唯一的方法 除此之外根據我的經驗 包括硬體接口的操作都應該用 C 來編程 C 的特點就是 可以使你儘量少地對硬體進行操作 是一種功能性和結構性很強的語言2 C 語言的一些要點這裡不是教你如何使用 C 語言 關於 C 語言的書有很多 像 Kernighan 和 Ritchie 所著的 C 程式語言等 這本書被認為是 C 語言的權威著作 Keil 的 C51 完全支持 C 的標準指令和很多用來優化 8051 指令結構的 C 的擴展指令我們將複習關於 C 的一些概念 如結構 聯合和類型定義 可能會使一些人傷腦筋2.1 結構結構是一種定義類型 它允許程式設計師把一系列變量集中到一個單元中 當某些變量相關的時候使用這種類型是很方便的 例如 你用一系列變量來描述一天的時間 你需要定義時 分 秒三個變量unsighed char hour,min,sec;還要定義一個天的變量unsighed int days;通過使用結構 你可以把這四個變量定義在一起 給他們一個共同的名字 聲明結構的語法如下
聯合經常被用來提供同一個數據的不同的表達方式 例如 假設你有一個長整型變量用來存放四個寄存器的值 如果希望對這些數據有兩種表達方法 可以在聯合中定義一個長整型變量 同時再定義一個字節數組 如下例
union status_type{
unsigned char status[4];
float idata outp_value;
4.4 PDATA 和 XDATA 段在這兩個段聲明變量和在其它段的語法是一樣的 PDATA 段只有 256 個字節 而 XDATA段可達 65536 個字節 下面是一些例子
unsigned char xdata system_status=0;
unsigned int pdata unit_id[2];
char xdata inp_string[16];
float pdata outp_value;
對 PDATA 和 XDATA 的操作是相似的 對 PDATA 段尋址比對 XDATA 段尋址要快 因為對 PDATA 段尋址只需要裝入 8 位地址 而對 XDATA 段尋址需裝入 16 位地址 所以儘量把外
4.5 CODE 段代碼段的數據是不可改變的 8051 的代碼段不可重寫 一般 代碼段中可存放數據表跳轉向量和狀態表 對 CODE 段的訪問和對 XDATA 段的訪問的時間是一樣的 代碼段中的對象在編譯的時候初始化 否則 你就得不到你想要的值 下面是代碼段的聲明例子
編譯產生的彙編代碼