網路城邦
上一篇 回創作列表 下一篇   字體:
基本的語法與設計程式概念與方向(單一的環境)
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語言中是允許globallocal使用相同名字,這樣簡單的規則便可以完全避免重複命名造成的錯誤,設計一個規則,不但可以簡易區分函式變數存在哪裡?甚至可以辨別功能,如此可以大幅縮短發展與偵錯時間。

d. define: 正確的前置處理器(#define)可以讓程式碼很容易移植與修改,過份複雜的定義,或是錯誤的使用,將會使得程式碼變得難以閱讀與修改,甚至是漏改的嚴重錯誤發生。

e. main()以前發生了什麼事?上述的動作清楚以後,可以知道main以前需要完成所有變數的初值化,所以這裡是使用組合語言完成的,static variable也在這裡寫入預設值,每一種tool方法都不一樣,compiler一定會產生相關的lable,這個層級的boot loader便需要依據這些標籤來做動作,有些硬體需要在這個階段初值化,例如ARM7memory swapRTOS移植在這裡也很重要,例如context switch機制就是這裏控制。

f. 組合語言: 不會組合語言的程式設計師,在撰寫embedded system時,很容易碰到效能低落,甚至是c程式邏輯正確,但實際的機械碼運作錯誤等問題發生,例如read modify write的問題,一般純軟體工程師就比較沒辦法理解。

g. 物件導向: 一般人都把這個學術化了,變成了問答題,c++active x等都是為了"解決"物件導向而設計出來的東西,所以物件導向是寫程式的風格,c語言也可以寫成物件導向,這種風格可以解決很多事,程式比較整齊。

( 時事評論政治 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=cchahacaptain&aid=2477779

 回應文章

Art
Hi
2009/10/29 10:37
請問能否請您詳解一下void*呢?
彼得鄧(cchahacaptain) 於 2009-10-31 21:11 回覆:

謝謝,

請參考"程式鬼扯蛋"中的"c語言中void *該如何使用呢?"

裡面有寫一個範例,希望能有一點點幫助。


彼得鄧
等級:7
留言加入好友
缺乏一個實例
2008/12/16 11:54

現在已經有一個現象了:文武相輕,就是軟硬體不是分工,而是分家了,明明只是電子流動的現象,不知道為什麼,輕一點互相看不懂,嚴重一點會互相看扁。

我還在想要怎麼在blog上展現一個實例,就是完整ic組合出來的例子,這個例子可以完整表達整個cpu電路的結構,還可以讓軟硬體工程師明白自己的角度是哪裡,不會太冗長,我也不會寫太多字,這可能需要一段時間。