日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单片机/嵌入式软件架构分层思想

發(fā)布時間:2023/12/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单片机/嵌入式软件架构分层思想 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

以STM32裸機開發(fā)為例。

軟件分層
應(yīng)用層
驅(qū)動層
硬件層
固件層

①最底層為固件層,Firmware
這一層通常是官方給的庫,庫函數(shù)對寄存器進(jìn)行操作,例如:

/*** @brief Transmits a Data through the SPIx/I2Sx peripheral.* @param SPIx: where x can be* - 1, 2 or 3 in SPI mode * - 2 or 3 in I2S mode* @param Data : Data to be transmitted.* @retval None*/ void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data) {/* Check the parameters */assert_param(IS_SPI_ALL_PERIPH(SPIx));/* Write in the DR register the data to be sent */SPIx->DR = Data; }

②往上一層為硬件層,Hardware。
這一層的函數(shù)是在庫函數(shù)的基礎(chǔ)上進(jìn)一步封裝,比如根據(jù)STM32 SPI的特性,SPI讀寫一個數(shù)據(jù)我們封裝為一個函數(shù),例如:

u8 SPI2_ReadWriteByte(u8 TxData) { u8 retry = 0; while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){retry++;if(retry > 200)return 0;} SPI_I2S_SendData(SPI2, TxData); retry = 0;while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) {retry++;if(retry > 200)return 0;} return SPI_I2S_ReceiveData(SPI2); }

這個函數(shù)的也只讀寫送一個數(shù)據(jù),我們通常不會只讀寫一個數(shù)據(jù),而是連續(xù)讀寫送N個數(shù)據(jù),所以在這個函數(shù)的基礎(chǔ)上再封裝出一個函數(shù),例如:

void SPI2_ReadWriteData(u8 *sendData, u8 *recvData, u32 length) {u32 i = 0;for(i = 0; i < length; i++){recvData[i] = SPI2_ReadWriteByte(sendData[i]);} }

③再往上一層是驅(qū)動層,drive。
前面兩層都是對STM32進(jìn)行操作,而這一層是對與STM32連接的元器件、模塊、模組進(jìn)行操作,通常稱為調(diào)試驅(qū)動,比如調(diào)試STM32和外部FLASH W25Q128的SPI驅(qū)動。
這一層的函數(shù)通常是對W25Q128進(jìn)行操作,例如:

u16 W25QXX_ReadID(void) {u16 Temp = 0; W25QXX_CS = 0; SPI2_ReadWriteByte(0x90); SPI2_ReadWriteByte(0x00); SPI2_ReadWriteByte(0x00); SPI2_ReadWriteByte(0x00); Temp |= SPI2_ReadWriteByte(0xFF) << 8; Temp |= SPI2_ReadWriteByte(0xFF); W25QXX_CS = 1; return Temp; }

④再往上一層是應(yīng)用層,APP。
有很多人往往在main.c里面做功能應(yīng)用,導(dǎo)致main.c內(nèi)容又多又長,main函數(shù)又長又臭,大多數(shù)公司的代碼規(guī)范要求是不允許的。最好把功能應(yīng)用剝離出來,單獨放在應(yīng)用層,讓main函數(shù)簡潔清晰。
例如:

int main(void) { STM32_Sys_Init();W25Q128_Init();//如果這些初始化超過3個,就要考慮封裝成一個函數(shù)UART_Init();//如果這些初始化超過3個,就要考慮封裝成一個函數(shù)while(1){switch(g_main_process){case MAIN_UART_RECV_HANDLE://APP_func1();break;case MAIN_XXX_HANDLE://APP_func2();break;//.............default://APP_funcN();break;}} }

總結(jié):
用分層思想不僅提高代碼閱讀性(方便新員工接手辭職員工代碼,而不是一團糟讓人一頭霧水),還提高可移植性,如果項目需要換一顆MCU,替換固件層,替換硬件層幾個庫函數(shù)即可,其他層不需要動。

總結(jié)

以上是生活随笔為你收集整理的单片机/嵌入式软件架构分层思想的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。