從會寫**,到想要寫好**,這個過程是很難受的。
由於做的嵌入式軟體,主要是mcu方面,都是要跟硬體底層打交道的軟體設計,接手的別人的軟體給人影響最深刻的就是典型的面向過程式程式設計,高層模組大量依賴低層模組,特別是高層模組依賴底層硬體,還有各種跨層呼叫等。
缺點:修改底層模組,將影響高層模組。在實際應用中,底層模組又是經常要被修改的。
怎麼解決?依賴反轉,低層模組依賴高層,低層根據高層模組來實現。
怎麼實現依賴反轉?物件導向程式設計中有乙個很重要的概念 —— 面向抽象介面程式設計。在c++中使用虛函式實現多型、抽象介面,c語言沒有虛函式,對於oopc
來說只能使用函式指標來實現多型、抽象介面。
了解很多理論後嘗試了在stm32上使用。
資料結構:
struct gpio
;
mcu的gpio雖然有很多模式,實際上只有一種,感覺有點類似設計模式中的單例模式
實現抽象介面:
#include
"hal_gpio.h"
#include
"stm32f10x.h"
#define stm32_pin(x) (2 << (x-1))
#define arr(a) (sizeof(a)/sizeof(a[0]))
static gpio_typedef* stm32_port=
;static
void
hal_gpio_init
(unsigned
char port,
unsigned
short pin,
unsigned
char mode)
static
void
hal_set_gpio
(unsigned
char port,
unsigned
short pin,
unsigned
char level)
else
}static
void
hal_set_gpio_port
(unsigned
char port,
unsigned
int portval)
static
unsigned
char
hal_get_gpio
(unsigned
char port,
unsigned
short pin)
static
unsigned
inthal_get_gpio_port
(unsigned
char port)
struct gpio gpio;
void
init_gpio()
實現了stm32的gpio硬體抽象介面,之後的gpio操作使用gpio
物件進行操作。這樣做之後,上層使用到gpio功能,當要換其他mcu,只需要實現這些抽象介面即可,上一層的程式不要修改。
知道抽象介面這玩意後考慮使用它來給軟體分層。
關於嵌入式軟體分層設計的文章:
實現了gpio硬體適配,假設現在有乙個led模組,乙個開發板總是要點燈的嘛。
抽象led:
led無非就是點亮、熄滅。
struct led
;void
led_init
(struct led *led,
void
(*led_on)()
,void
(*led_off)()
)void
set_led_on
(struct led *led)
}void
set_led_off
(struct led *led)
}
led的功能模組:
struct led led1;
struct led led2;
void
led1_on()
void
led1_off()
void
led2_on()
void
led2_off()
led_init
(&led1, led1_on, led1_off)
;led_init
(&led2, led2_on, led1_off)
;
更高一層的業務邏輯層可能呼叫led模組去實現閃爍等功能。假如現在由於硬體變更,某個led控制引腳變更,用了抽象介面後業務邏輯層關於led閃爍的**不需要修改,只需要修改led功能模組給這個led換乙個引腳即可。 關於嵌入式
1 基礎知識 目的 能看懂硬體工作原理,但重點在嵌入式軟體,特別是作業系統級軟體,那將是我的優勢。科目 數位電路 計算機組成原理 嵌入式微處理器結構。組合語言 c c 編譯原理 離散數學。資料結構和演算法 作業系統 軟體工程 網路 資料庫。方法 雖科目眾多,但都是較簡單的基礎,且大部分已掌握。不一定...
自己做嵌入式軟體分層一(解讀AUTOSAR架構)
autosar是由全球各大汽車整車廠 汽車零部件 商 汽車電子軟體系統公司聯合建立的一套標準協議,是對汽車技術開發一百多年來的經驗總結。從2003年起,擬定了乙個符合汽車電子軟體開發的 開放的以及標準化的軟體架構。該架構旨在改善汽車電子系統軟體的更新與交換,同時更方便有效地管理日趨複雜的汽車電子軟體...
嵌入式軟體測試
嵌入式軟體測試 嵌入式軟體測試 嵌入式測試或叫交叉測試 cross test 的日的與非嵌入式軟體是相同的。但是,在嵌入式系統設計中,軟體正越來越多地取代硬體,以降低系統的成本,獲得更大的靈活性,這就需要使用更好的測試方法和工具進行嵌入式和實時軟體的測試。通常嵌入式系統對可靠性的要求比較高。嵌入式系...