字體:小 中 大 | |
|
|
2008/12/16 11:47:05瀏覽3994|回應2|推薦1 | |
基本的語法與設計程式概念與方向(單一的環境) a. 變數: local variable, static variable, global variable這三種型態變數放在哪裡?如何控制放在哪裡?特性是什麼?該如何用?翻成組合語言的長相是什麼?這些都必須弄清楚才行。 1. local var: 一般來說在堆疊內,但也不是絕對,8051就是例外之ㄧ,所以堆疊大小和堆疊設定搞不好,程式一定不會正確,同時也是設計recursive/callback函式的關鍵變數。 2. global var: 所有*.c都看的見該變數,需要做extern宣告。 3. static var: 該*.c檔內,那一行變數宣告以下的函數都看的到,以上或其他*.c檔看不見,設計函式庫時用的到這種宣告。 4. heap memory: 動態配置的來源,如malloc,在一般的程式是不應該用到這個東西的,半大不小的記憶體配置,在執行若干次malloc後,會使得heap memory破碎不堪,最後因為沒有足夠完整的大小記憶體導致配置失敗,是毀滅穩定度的關鍵之ㄧ,可是在RTOS的函式庫設計卻非常重要,大部分HANDLER(大小不大)的來源就是這樣配置而來,如fopen,使用static variable來記憶是比較不恰當的作法。 5. volatile: HW register宣告時必定會用到的關鍵字,可以避免compiler做出不該有的化簡,這個漏了就很危險了。 6. bit address:一般HW register通常都會有這個bit幹什麼,那個bit幹什麼,然後都是擺在同一個byte,如果不用這種宣告,會使得硬體暫存器存取必須使用基本的and, or來動作,這樣會讓程式碼閱讀比較吃力。 7. 記憶體控制: 例如某段程式碼比較常使用,可以放在SRAM中,有些CPU memory還有8bit,16bit,32bit三種bank分別(例如H8),就要依需求把資源放進去,這些控制手法,每個COMPILER都不相同,有的放在command檔,有的使用pragma來控制,有的是option裡面,雖然方法不同,但是目的都是一樣的。 b. 語法:基本的structure, data table, function table, pointer的撰寫方法,尤其是多顆星星(char***)與二維陣列以上的pointer(char (*array)[n])如何使用?外加上無型別指位器(void*)的運用,這幾個部份關係到state machine設計的優劣,畢竟充滿if-else的程式,不但難以維護,甚至執行時間也不定。 c. 檔名與命名規則:這是大型程式的關鍵點,也是目前許多solution的弊病之ㄧ,畫電路圖的時候,理想的net name可以表達該線路的特性,同時可以避免錯誤的連結,程式也是一樣,好的命名規則可以讓程式碼長的很大,運作的很理想,好查,容易debug,例如local variable使用小寫,global使用大小寫混合,因為在c語言中是允許global與local使用相同名字,這樣簡單的規則便可以完全避免重複命名造成的錯誤,設計一個規則,不但可以簡易區分函式變數存在哪裡?甚至可以辨別功能,如此可以大幅縮短發展與偵錯時間。 d. define: 正確的前置處理器(#define)可以讓程式碼很容易移植與修改,過份複雜的定義,或是錯誤的使用,將會使得程式碼變得難以閱讀與修改,甚至是漏改的嚴重錯誤發生。 e. main()以前發生了什麼事?上述的動作清楚以後,可以知道main以前需要完成所有變數的初值化,所以這裡是使用組合語言完成的,static variable也在這裡寫入預設值,每一種tool方法都不一樣,compiler一定會產生相關的lable,這個層級的boot loader便需要依據這些標籤來做動作,有些硬體需要在這個階段初值化,例如ARM7的memory swap,RTOS移植在這裡也很重要,例如context switch機制就是這裏控制。 f. 組合語言: 不會組合語言的程式設計師,在撰寫embedded system時,很容易碰到效能低落,甚至是c程式邏輯正確,但實際的機械碼運作錯誤等問題發生,例如read modify write的問題,一般純軟體工程師就比較沒辦法理解。 g. 物件導向: 一般人都把這個學術化了,變成了問答題,c++、active x等都是為了"解決"物件導向而設計出來的東西,所以物件導向是寫程式的風格,c語言也可以寫成物件導向,這種風格可以解決很多事,程式比較整齊。 |
|
( 時事評論|政治 ) |