wampserver裝wordpress福建seo搜索引擎優(yōu)化
以串口接口為例介紹關(guān)于BSP底層架構(gòu)開(kāi)發(fā)的迭代過(guò)程
文章目錄
- 以串口接口為例介紹關(guān)于BSP底層架構(gòu)開(kāi)發(fā)的迭代過(guò)程
- 架構(gòu)概述
- 初代BSP
- 二代BSP:
- 三代BSP:
- 四代BSP:
架構(gòu)概述
單片機(jī)開(kāi)發(fā)有四個(gè)階段:
階段一:?jiǎn)我粏纹瑱C(jī)的功能實(shí)現(xiàn)階段
此階段你開(kāi)始熟悉STM32F1系列的單片機(jī),并利用其完成相應(yīng)的功能,比如點(diǎn)了個(gè)燈,通過(guò)串口發(fā)了個(gè)”STM32F103 Hello World“,你完成了第一個(gè)工程,將其命名為STM32F103_Hello.
此階段不考慮單片機(jī)的移植性,只管實(shí)現(xiàn)功能,你可以在一個(gè)main函數(shù)寫(xiě)上幾千行的代碼,當(dāng)你覺(jué)得一個(gè)main函數(shù)的代碼太長(zhǎng)不好維護(hù)時(shí),即開(kāi)始進(jìn)入階段二:
階段二:?jiǎn)我粏纹瑱C(jī)的模塊化實(shí)現(xiàn)階段
此階段你已經(jīng)會(huì)使用STM32F1系列單片機(jī)的各種不同外設(shè),并打算將外設(shè)代碼進(jìn)行模塊化。
此階段不考慮單片機(jī)的移植性,但需要考慮代碼的復(fù)用性,你將main函數(shù)的幾千行代碼拆分成一個(gè)個(gè)的模塊,模塊間的調(diào)用完全隨性而為,低內(nèi)聚,高耦合的代碼隨處可見(jiàn),改動(dòng)一個(gè)模塊會(huì)影響太多其他模塊,當(dāng)你覺(jué)得需要對(duì)模塊進(jìn)行解耦,以實(shí)現(xiàn)標(biāo)準(zhǔn)化模塊間的復(fù)用時(shí),你就開(kāi)始進(jìn)入階段三:
階段三:同一廠商不同系列單片機(jī)的應(yīng)用層模塊復(fù)用實(shí)現(xiàn)階段
此階段你實(shí)現(xiàn)了代碼模塊化,會(huì)通過(guò)接口間的數(shù)據(jù)實(shí)現(xiàn)松散耦合調(diào)用
此階段你可以通過(guò)調(diào)用以前寫(xiě)好的應(yīng)用層模塊,來(lái)滿(mǎn)足更換同一廠商的不同單片機(jī)時(shí),只需改動(dòng)少量代碼的需求,然而對(duì)于大量硬件傳感器等外設(shè),不可能做到模塊復(fù)用,因?yàn)閭鞲衅鞯哪K太過(guò)依賴(lài)于底層接口的實(shí)現(xiàn),你要初始化它的引腳,就得調(diào)用它的時(shí)鐘使能接口方法,調(diào)用它的gpio庫(kù)初始化方法,要點(diǎn)個(gè)燈,就得調(diào)用它的gpio拉高拉低方法,而這些接口在同一廠商的不通系列單片機(jī)中,居然都會(huì)不一致。于是你不能忍,決定自己開(kāi)發(fā)一個(gè)接口更加標(biāo)準(zhǔn)化的庫(kù)。
階段四:不用廠商不同系列單片機(jī)的分層架構(gòu)實(shí)現(xiàn)階段
此階段你完成了BSP-SYSTEM-HARDWARE-APP四層架構(gòu),各個(gè)層次分工明確。BSP負(fù)責(zé)外設(shè)驅(qū)動(dòng)初始化,配置,調(diào)用引腳電平拉高拉低等,SYSTEM負(fù)責(zé)系統(tǒng)精確延時(shí),及時(shí)間片的輪詢(xún)處理,HARDWARE負(fù)責(zé)調(diào)用BSP的統(tǒng)一接口,實(shí)現(xiàn)各個(gè)傳感器或硬件的初始化及數(shù)據(jù)收發(fā),APP包含各種通信協(xié)議處理及控制邏輯處理,不同單片機(jī)通過(guò)加入不同的BSP,而SYSTEM-HARDWARE-APP都可以做到不變。
類(lèi)似的,我們的BSP底層架構(gòu)開(kāi)發(fā)也經(jīng)歷了若干版本。
初代BSP
最初的版本只限于單個(gè)單片機(jī)使用,底層和應(yīng)用層完全沒(méi)有隔離,經(jīng)??梢?jiàn)在main函數(shù)里操作GPIO庫(kù)函數(shù)的情況,這種架構(gòu)模式的好處是開(kāi)發(fā)簡(jiǎn)單,不用考慮復(fù)雜的移植性,因此耦合度過(guò)高,同廠商不同內(nèi)核的單片機(jī)移植,都會(huì)改動(dòng)大量代碼。
初版的串口驅(qū)動(dòng)接口是這個(gè)樣的:
void USART_driverInit(USART_TypeDef* USARTx, uint32_t baudRate, uint8_t preemptionPriority, uint8_t subPriority);void USART_sendByte(USART_TypeDef* USARTx, uint8_t byte);
void USART_sendMsg(USART_TypeDef* USARTx, uint8_t *sendBuf, uint32_t len);void USART1_dmaTxIsr(void);
void USART2_dmaTxIsr(void);
void USART3_dmaTxIsr(void);
void UART4_dmaTxIsr(void);void USART1_recvIsr(void);
void USART2_recvIsr(void);
void USART3_recvIsr(void);
void UART4_RecvIsr(void);
假設(shè)某個(gè)應(yīng)用層要引用它,就必須得包含USART_TypeDef*這個(gè)定義的文件,如果不同的廠商串口結(jié)構(gòu)定義不是這個(gè)怎么辦。
在迭代中我們想到用USART_t給USART_TypeDef*取別名
typedef USART_TypeDef* USART_t;
隨著gpio口和dma操作的增加,這種取別名的方式,也不能解決問(wèn)題,有些結(jié)構(gòu)體內(nèi)部的成員名都不相同。
于是,我們對(duì)BSP架構(gòu)進(jìn)行了升級(jí),使其可以兼容更多單片機(jī)甚至國(guó)產(chǎn)化的單片機(jī)。
二代BSP:
方法是建立BSP-SYSTEM-HARDWARE-APP四層架構(gòu)。
其中不同系列的單片機(jī)使用不同BSP框架,保留相同命令的接口,SYSTEM-HARDWARE-APP如果需要調(diào)用這個(gè)接口,只需要引用XXX系列單片機(jī)目錄下的BSP頭文件。
這個(gè)版本的串口驅(qū)動(dòng)接口是這個(gè)樣的:
typedef USART_TypeDef* USART_Type_t;
typedef struct USART_Struct* USART_t;
typedef struct USART_Struct
{USART_Type_t usart;uint32_t baudRate; uint8_t priority;uint8_t subPriority;uint16_t parity;uint16_t stopBits;uint16_t wordLength;uint32_t RS485Delay;USART_Config_t config; USART_Transport_t *send;USART_Transport_t *receive;uint32_t timeout;uint32_t linkCount;bool isRS485Connected;void (*USART_TypeInit)(USART_t USART);void (*USART_SendByte)(USART_t USART, uint8_t byte);void (