電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 101|回復: 0
收起左側(cè)

嵌入式軟件的分層架構(gòu)設計思維

[復制鏈接]

613

主題

613

帖子

1765

積分

三級會員

Rank: 3Rank: 3

積分
1765
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-10-6 08:02:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

點擊上方藍色字體,關注我們

假設我們設計一個物聯(lián)網(wǎng)設備,該設備可以通過網(wǎng)絡監(jiān)測環(huán)境溫度并在超過設定閾值時觸發(fā)報警。

該系統(tǒng)可以如下分層設計:
  • 應用層:環(huán)境溫度監(jiān)測、報警觸發(fā)邏輯。
  • 中間件層:支持MQTT協(xié)議的網(wǎng)絡通信模塊,用于將溫度數(shù)據(jù)上傳至云端。
  • 操作系統(tǒng)層:基于FreeRTOS進行多任務管理,例如定期讀取溫度、監(jiān)控網(wǎng)絡狀態(tài)。
  • 設備驅(qū)動層:溫度傳感器驅(qū)動、蜂鳴器驅(qū)動、LED指示燈驅(qū)動。
  • 硬件抽象層:通過HAL訪問GPIO、I2C接口與傳感器交互。

    1
    應用層(Application Layer)
    應用層實現(xiàn)具體的應用邏輯,是直接面向用戶或設備功能的部分。它通過調(diào)用中間件、操作系統(tǒng)服務、設備驅(qū)動等下層功能來實現(xiàn)最終的產(chǎn)品功能。

    設計原則
  • 盡量保持應用邏輯的高層次抽象,避免直接依賴底層硬件。
  • 應用層代碼應當盡可能的簡潔,并通過模塊化設計保證代碼可維護性和可擴展性。

    應用層實現(xiàn)環(huán)境溫度監(jiān)測、報警觸發(fā)邏輯,示例如下:

  • // 簡單的溫度監(jiān)控應用層代碼void MonitorTemperature(void) {    int temperature = Sensor_ReadData(TEMP_SENSOR_REG);    if (temperature > THRESHOLD) {        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET);  // 啟動風扇    } else {        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET); // 關閉風扇    }}
    2
    中間件層(Middleware Layer)
    中間件層提供一些通用的服務或協(xié)議棧,例如TCP/IP、藍牙棧、文件系統(tǒng)等,幫助嵌入式系統(tǒng)更好地實現(xiàn)特定功能。中間件層封裝了復雜的協(xié)議和算法,提供標準化的接口供應用層調(diào)用。

    設計原則
  • 中間件應盡可能與具體的硬件平臺無關,便于在不同硬件平臺上復用。
  • 中間件通;诓僮飨到y(tǒng)進行設計,利用操作系統(tǒng)的線程、定時器等資源來實現(xiàn)協(xié)議和服務。

    中間件層實現(xiàn)支持MQTT協(xié)議的網(wǎng)絡通信模塊,用于將溫度數(shù)據(jù)上傳至云端,示例如下:

  • // 中間件層中的TCP/IP協(xié)議棧初始化void init_network() {    struct netif netif;    ip4_addr_t ipaddr, netmask, gw;
        IP4_ADDR(&ipaddr, 192, 168, 1, 100);    IP4_ADDR(&netmask, 255, 255, 255, 0);    IP4_ADDR(&gw, 192, 168, 1, 1);
        netif_add(&netif, &ipaddr, &netmask, &gw, NULL, ethernetif_init, tcpip_input);    netif_set_up(&netif);}
    3
    操作系統(tǒng)層(Operating System Layer)
    在嵌入式系統(tǒng)中,操作系統(tǒng)層提供了任務調(diào)度、內(nèi)存管理、中斷處理等功能。常見的實時操作系統(tǒng)(RTOS)或輕量級操作系統(tǒng)(如FreeRTOS、Zephyr)能夠保證系統(tǒng)的實時性需求。

    設計原則
  • 操作系統(tǒng)應盡量輕量化,提供實時性保障(如中斷優(yōu)先級、任務調(diào)度)。
  • 通過任務、信號量、消息隊列等機制進行任務間通信和同步。
  • 操作系統(tǒng)層不應直接依賴于具體的硬件細節(jié),而是通過硬件抽象層或設備驅(qū)動層訪問底層硬件。

    操作系統(tǒng)層基于FreeRTOS進行多任務管理,例如定期讀取溫度、監(jiān)控網(wǎng)絡狀態(tài)。示例如下:

  • // FreeRTOS 中的任務創(chuàng)建void vTaskFunction(void *pvParameters) {    for(;;) {        // 執(zhí)行任務功能        vTaskDelay(1000 / portTICK_PERIOD_MS);  // 延時1秒    }}
    int main(void) {    // 創(chuàng)建任務    xTaskCreate(vTaskFunction, "Task1", 1000, NULL, 1, NULL);    // 啟動調(diào)度器    vTaskStartScheduler();}
    4
    設備驅(qū)動層(Device Driver Layer)
    設備驅(qū)動層為具體的硬件設備(如傳感器、通信模塊、存儲設備等)提供軟件接口。驅(qū)動程序與硬件抽象層互動,為上層應用提供簡化的接口以控制和管理設備。

    設計原則
  • 封裝設備特有的硬件操作,為上層提供通用接口。
  • 支持硬件初始化、狀態(tài)查詢、數(shù)據(jù)讀寫等功能。
  • 與硬件抽象層解耦,通過HAL接口與具體硬件交互。

    設備驅(qū)動層實現(xiàn)溫度傳感器驅(qū)動、蜂鳴器驅(qū)動、LED指示燈驅(qū)動。示例如下:

  • // I2C 設備驅(qū)動層中的傳感器讀取函數(shù)uint8_t Sensor_ReadData(uint8_t reg) {    uint8_t data;    HAL_I2C_Mem_Read(&hi2c1, SENSOR_I2C_ADDRESS, reg, I2C_MEMADD_SIZE_8BIT, &data, 1, HAL_MAX_DELAY);    return data;}
    5
    硬件抽象層(Hardware Abstraction Layer)
    硬件抽象層位于軟件與硬件之間,提供對硬件資源(如GPIO、定時器、ADC等)的抽象接口。它將具體的硬件操作封裝在標準化的接口之下,使得上層代碼無需了解具體的硬件細節(jié)即可操作底層硬件。

    設計原則
  • 通過標準接口(如寄存器讀寫)訪問硬件外設。
  • 盡量避免硬件細節(jié)在上層暴露,以便將來能夠更換硬件而不影響上層軟件。

    硬件抽象層實現(xiàn)通過HAL訪問GPIO、I2C接口與傳感器交互。

  • // 假設這是硬件抽象層中的GPIO接口定義void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState) {    if (PinState == GPIO_PIN_SET) {        GPIOx->BSRR = GPIO_Pin;  // 設置引腳為高電平    } else {        GPIOx->BRR = GPIO_Pin;   // 設置引腳為低電平    }}
    這樣的分層設計能夠有效管理系統(tǒng)的復雜性,確保硬件更換時無需重寫上層代碼,并且能夠輕松擴展更多的功能。



    點擊閱讀原文,更精彩~
  • 回復

    使用道具 舉報

    發(fā)表回復

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則


    聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表