嵌入式軟體架構設計

2021-06-04 05:00:01

一、前言

小生做MCU方面的開發已經很多年了,記得當初開始做專案的時候,實現功能就是我的目標,基本不會關注其它方面,功能的實現已經夠讓我折騰的了,也沒有多少精力關注其它方面,後面慢慢對程式碼風格、編碼規範有一定的講究,有些程式碼看起來令人賞心悅目,而有些卻不忍直視,再後來發現有些功能模組在一個產品上做了,然後換一個平臺(mcu)後,又得調一遍,有些甚至調了一遍又一遍,多幾次之後真是煩躁,哲學上有句話叫"人不能兩次踏入同一條河流",而我卻是一個坑踩了一次又一次,直到實在受不了了,我決定"再也不踩了",於是,軟體框架設計思想慢慢浮現,從此,我一直基於軟體框架開發,分層設計,低耦合高內聚,一個模組在一個產品上開發了,在另一個產品上基本可以直接拿過去用,避免了重複造輪子,開發速度直線上升,並且後期維護也是輕鬆方便,從此達到了人生巔峰!現在留下些許記錄,當然有些也是參考了網友的!

二、為何要進行嵌入式軟體架構設計

1、如果沒有好的架構,移植將會是一件非常痛苦的事情。

2、如果沒有好的架構,複用是不存在的,至少不能最大限度的複用原有的程式碼。

3、如果沒有好的架構,一旦某處修改了,其它很多地方都要改,費時費力且很容易出錯。

4、如果沒有好的架構,與硬體相關的程式碼隨處可見,看著會很混亂,維護起來非常困難。

5、要做到嵌入式軟體邏輯清晰,避免重複造輪子,不斷迭代積累,需要有好的軟體架構。

三、如何進行嵌入式軟體架構設計

首先,說到架構,你會想到什麼?像建造一棟樓盤一樣,首先要打地基,並且地基要打的牢靠樓盤才能建的高,抗自然災害(地震、颱風等)抗風險能力才更強,然後鋼筋、水泥、預製板像堆積木一樣,一層一層的造起來…

目前很多優秀的軟體都是有框架的,像linux,android等,其框架都是非常清晰,層次化分明的,在其上開發也是需要了解其框架,也只有瞭解了其框架才能按其套路輕鬆的開發,因為了解了那些框架就相當於站在了巨人的肩膀上.

我們的嵌軟架構也類似房屋建造與積木搭建,也是基於這種分層與模組化的思想,上層是建立在下層的基礎之上,模組與模組之間相互獨立、互不影響,具體分為驅動層(也叫BSP層), 模組層、邏輯層、應用層、加上各平臺的HAL層(硬體抽象層)共五層,另外一列是公共的庫、演演算法等檔案以及作業系統,俗稱"五橫一縱"!如下圖所示:
在這裡插入圖片描述

應用層:為程式的總體的執行框架,組織呼叫業務邏輯。可以用某種嵌入式作業系統(freeRTOS、rt-thread等)實現幾種任務 ,如定時任務,電機控制任務,故障監測任務,耗時處理任務等。

業務邏輯層:如畫圖處理,底盤運動處理,手臂運動處理,電池資訊處理,自動充電處理等。

功能模組層:可以封裝不同的功能模組。如gps模組,wifi模組,tof模組,藍芽模組等,向下呼叫驅動層介面,向上為應用接提供介面,模組之間儘量不要相互呼叫,做到低耦合,高內聚。

BSP層:也叫板級支援包層,由各個外設驅動組成,如gpio、timer,uart、iic、spi、dma、irq等外設的操作與控制,向上提供統一的介面。

HAL層(硬體抽象層):這層包含的是原生的晶片廠家官方庫,像STM32標準/HAL庫,NXP官方庫、TI庫等

注:功能模組層之上可以增加一個應用介面層,提供公共的api介面供上層呼叫。這些介面也可由下層的功能模組開放出來,應用介面層負責彙總。(一個檔案就可以搞定,一般順帶放在業務邏輯層)

四、需要嚴格遵循的原則

1.每個模組提供出的介面要統一,後續只能增,不能改原來的介面(向後相容)。

2.模組與模組之間相互獨立,互不影響,不能相互呼叫,只能呼叫它下層的介面(高內聚低耦合)。

3.由模組構成層,層與層之間不能跨級呼叫。如在應用層中不能看到直接呼叫驅動層的程式碼。

4.模組中又可以繼續分層,如硬體層、驅動層、介面層。 方便後續模組硬體更換。
如果驅動變動了,或者換不同平臺了,只需更改驅動層,應用層不受影響。
如果功能模組變動了,只需升級功能模組,其他的模組不受影響,應用層也不受影響。