1. 程式人生 > >如何建立一個通用軟體架構以滿足嵌入式產品的快速迭代需求

如何建立一個通用軟體架構以滿足嵌入式產品的快速迭代需求

最近年連續開發幾款智慧儀器的嵌入式產品。因為是相近的產品型別,只是控制器和一些具體功能電路

有些差異。考慮到軟體研發人力有限,同時又要把過往的成熟產品的一些處理經驗方法把它IP化,形成自己獨有的演算法處理體系。因此,建立起一個通用的軟體架構,儘量做到與底層硬體的弱耦合,這樣可以更快的構建產品原型。尤其是在產品早期,很多想法不一定成熟,或者產品使用一個階段之後,可能需要新增修改一些功能,這個時候,通用的軟體架構因為其硬體的無關性,就能幫助我們快速實現想要的功能,完成快速迭代。

一種通用的嵌入軟體框架

現在的嵌入式開發已經過了一行行敲C程式碼的時代。基本上,一款新的控制器晶片出來,廠商往往都發布豐富的例程,從底層暫存器的設定,到一個功能如
ADC
採集的實現,通常都有例程。只是,不同廠家不同規格的控制器,底層實現的程式碼千差萬別。 所以,這裡提出的所謂通用軟體框架,是以應用為目標,在不同的層級,建立相應的抽象層,試圖做到業務上儘可能與硬體無關。

CSLchipsupport layer,又稱之為register drivers,這一部分對控制器底層要非常瞭解。比如,主頻設定,時鐘源選擇,復位方式,片內外設如UARTIICADCPWMGPIO等的時鐘選擇,使能設定等等。

BSPboardsupport packet,板級支援包,包括一部分外設驅動。這裡主要是實現某一個明確的功能,比如如何實現WDC,如何輸出PWM,怎樣通過

ADC讀取一次轉換資料等。

CSLBSP這兩層,基本上控制器廠商都會有原始碼支援。這裡主要是要求硬體工程師或驅動工程師對晶片本身比較瞭解,一般工作量不會太大。

再往上走,就是與產品應用有關的硬體抽象層HALhardware abstract layer。硬體抽象層的主要作用在於,遮蔽掉底層不同的BSPCSL呼叫介面,向上層應用提供儘可能統一的呼叫介面,使應用工程師專注於產品功能的實現。一般地,相近的產品,其功能呼叫介面都大同小異。同一家公司,同一個研發團隊,應儘可能定義一個自己的統一風格的HAL,並隨著後續產品的研發,逐漸充實、完善這套HAL。通常,所謂的HAL呼叫介面,可定義成如下方式

Hal_LED_AlarmOn(void);

Hal_LED_ServiceOff(void);

把這些看似簡單的介面從一開始就定義清晰,久而久之,就形成了自己產品程式碼編寫風格。既方便後續閱讀維護,也方便新來工程師的儘快上手。

中介軟體層

MDL, middleware layer, 主要是一些與產品應用相關的如演算法實現,資料濾波,私有協議棧,也包括自有特色的如圖形互動介面,互動控制檯,以及如類似XML

配置引數解析在內的服務型設施等。

HALMDL構成了相近產品或一家公司嵌入產品的核心IP,往往需要多年的產品積累和技術沉澱,以軟體IP方式鞏固產品特色。HALMDL向下相容了不同的硬體,向上則為應用程式開發提供統一的API以及功能元件。

最後是應用層,這部分是與產品功能、效能緊密相關的程式碼,實現組合邏輯呼叫、輸入輸出控制、互動配置等功能。

現在的軟體開發過程,往往都是果斷開始,快速搭建和迭代更新。對於嵌入式軟體,基本上都要求具有bootloader引導功能,一方面可基於私有協議實現線上升級,可保證一定的安全性,另一方面為快速迭代更新提供技術保障。以筆者的專案為例,同時提供ISP/IAP功能,為產品生產階段和量產釋出階段的迭代更新提供完整的技術保障方案。

最後,附上自己在程式開發過程中,遵從上述原則所進行的原始碼檔案的工程管理例子。

嵌入軟體框架原始碼管理