单片机编程系列之分层设计1
前言
本次學習了百問網的七天物聯網直播課收獲很多,寫下筆記記錄一下。
1.代碼分層設計
在《代碼大全》第五章中,可以把程序分為這幾個層次:
- 第一層:軟件系統
- 第二層:分解為子系統后包
- 第三層:分解為類
- 第四層:分解為子程序
- 第五層:子程序內部的設計
所有的系統都有分層的概念,這個可以提高協同效率,使各個組件緊密協作,在內容上細分,互不干擾。方便修改,維護成本小。因此,對于一個單片機程序系統來說也是可以分層設計的,這在復雜的項目中,極為方便。
2.第一層:軟件系統
下面我們用一個讀取按鍵值然后亮燈的單片機的程序為例,我們將按照分層設計的方法進行設計。
int main(void) {init_board(); /*MCU低級初始化*/init_dev(); /*所有外設初始化*/loop(); /*運行軟件程序*/ }上面就是我們所設計的軟件系統層,這是個最基礎的軟件可運行的軟件系統層,完整的系統層還包括故障處理程序,復位程序,初始化成功判斷程序等。
3.第二層分解為子系統和包。
對于上面這個軟件系統來說,它的子系統就是init_board()和init_dev()和loop(),init_board()包含的是MCU的引腳,ADC,中斷的初始化。而init_board()則包含了按鍵的信息注冊(結構體信息添加)和LED的信息注冊,下面是loop();這個子系統的示例。
void loop(void) {while (1){key_led();} }當然子系統里面,還可以包含子系統。
void key_led(void) {int val;led *l;l = get_led("led1");val = read_key();if (val != -1){if (val == 0xA)l->control(l, 1);else if (val == 0xB)l->control(l, 0);}}可以看出,這個獲取按鍵值然后亮燈的子系統里面還有,獲取LED信息的系統函數get_led(“led1”);閱讀按鍵子系統函數read_key();所以這又分為了一層子系統。
4.分解為類
C語言沒有類,但有結構體。
typedef struct key {char *name;int code;void (*init)(struct key *k);int (*read)(struct key *k); }key, *p_key; typedef struct led {char *name;void (*init)(struct led *l);int (*control)(struct led *l, int color); /* 0x00rrggbb */ }led, *p_led;初始化類然后注冊給結構體數組
static key k1 = {"k1", 0xA, NULL, read_key1};void k1_init(void) {register_key(&k1); }void register_key(key *k) {keys[key_cnt] = k;key_cnt++; }這樣只需要查詢數組keys[]就可以得到底層的子程序與信息。
key *get_key(char *name) {int i = 0; for (i = 0; i < key_cnt; i++)if (strcmp(name, keys[i]->name) == 0)return keys[i];return NULL; }5.分解為子程序
子程序就如圖中所標。
6.第五層:子程序內部的設計
子程序內部的設計就比較簡單了,是比較基礎的代碼編輯。
總結:綜上所訴 我畫了個結構圖
4結構體注冊的時候,會將上層需要的函數通過結構體里面的函數指針提供給他。
總結
以上是生活随笔為你收集整理的单片机编程系列之分层设计1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【python脚本】时钟频率/周期计算小
- 下一篇: evga x58服务器芯片组,多图:EV