嵌入式硬件構件是指將一個或多個硬件功能模塊,支撐電路及其功能描述封裝成一個可重用的硬件實體,並提供一系列規範的輸入/輸出接口。硬件模塊是硬件構件的組成部分,一個硬件構件可能包含多個硬件功能模塊。框架
根據接口之間的生產消費關係,接口可分爲供給接口和需求接口兩類。根據所擁有的接口類型的不一樣,硬件構件分爲核心構件、中間構件和終端構件。函數
利用硬件構件進行嵌入式系統硬件設計以前,應該進行硬件構件的合理劃分,按照必定規則,設計與系統目標無關的構件個體,而後進行「組裝」,完成具體系統的硬件設計。學習
在繪製原理圖時,一個硬件構件使用一個虛線框,把硬件構件的電路及其文字描述括在其中,對外接口引出到虛線框外,填上接口網標。編碼
(1)、元器件命名格式:對於核心構件,其元器件直接編號命名,同種類型的元件命名時冠以相同字母前綴。如電阻\(R1,R2\)。對於中間構件和終端構件,其元器件命名格式採用「構件名-標誌字符?「。例如,\(LCD\)構件的電阻名爲\(LCD-C1\)。當構件原理圖應用到具體系統時,可藉助原理圖編輯軟件自動編號。spa
(2)、爲硬件構件添加詳細的文字描述,包括中文名稱、英文名稱、功能描述、接口描述、注意事項等,以加強原理圖的可讀性。操作系統
(3)、前兩步產生的內容封裝在一個虛線框內,組成硬件構件的內部實體。設計
(4)、爲該硬件構件添加與其餘構件交互的輸入/輸出接口標識。接口標識有兩種:3d
設計核心構件時,須要考慮的問題是:「核心構件能爲其餘構件提供哪些信號?「指針
核心構件其實就是某型號\(MCU\)的硬件最小系統。核心構件設計的目標是:凡是使用該\(MCU\)進行硬件系統設計時,核心構件能夠直接「組裝」到系統中,無需任何改動。code
在進行接口設計時,須要將全部可能使用到的引腳都標註上接口網標。若同一引腳具備不一樣的功能,則接口網標依據第一功能命名。
設計中間構件時,須要考慮的問題是:」中間構件須要接受哪些信號,以及提供哪些信號?」
一箇中間構件應具備明確的且相對獨立的功能,它既要有接受其餘構件提供的服務的接口,即需求接口,又要有爲其餘構件提供服務的接口,即供給接口。描述需求接口採用接口註釋,處於虛線框內,描述供給接口採用接口網標,處於虛線框外。
將構件的需求接口放置在構件實體的左側,供給接口放置在右側。接口網標的命名規則是:構件名稱-引腳信號/功能名稱。
設計終端構件時,須要考慮的問題是:」終端構件須要什麼信號才能工做?「
它僅有與上一級構件交互的需求接口,於是街廓標識均爲斜體標註的接口註釋。
使用硬件構件化思想設計嵌入式硬件系統的過程與步驟以下:
嵌入式系統中,驅動程序是直接工做在各類硬件設備上的軟件,是硬件和高層軟件之間橋樑。
構件\((Component)\)是可重用的實體,它包含合乎規範的接口和功能實現,可以被獨立部署和被第三方組裝。
嵌入式底層驅動構件,簡稱底層驅動構件或硬件驅動構件,是直接面向硬件操做系統的程序代碼及使用說明。規範的底層驅動構件由頭文件及源程序文件構成。頭文件是底層驅動構件簡明且完備的使用說明,也就是說,不須要查看源程序文件,就可以使用該構件進行下一層程序的開發。
在硬件構件層中,相對於核心構件而言,中間構件和終端構件是核心構件的」外設「。由這些」外設「的驅動程序封裝而成的軟件構件成爲底層外設構件。
由上圖能夠看出,底層外設構件能夠調用底層內部構件,如\(LCD\)構件能夠調用\(GPIO\)驅動構件。而高層構件能夠調用底層外設構件和底層內部構件中的功能構件,而不能直接調用\(GPIO\)驅動構件。另外,幾乎全部的底層內部構件都涉及\(MCU\)各類寄存器額使用,所以將\(MCU\)的全部寄存器定義組織在一塊兒,造成\(MCU\)頭文件。
構件設計的基本思想
底層構件被組織成具備必定獨立性的功能模塊,由頭文件和源程序文件兩部分組成。構件的頭文件名和源程序名一致,且爲構件名。
構件的頭文件中,主要包含必要的引用文件、描述構件功能特性的宏定義語句以及聲明對外接口函數。
構件的源程序文件中包含構件的頭文件,內部函數聲明、對外接口函數的實現。
儘可能作到:當一個底層構件應用到不一樣系統中時,僅需修改構件的頭文件,對於構件的源程序文件則沒必要要修改或改動很小。
構件設計的基本原則
良好的底層驅動具備如下特性:
封裝性。即內部實現的調整不會影響構件調用者的使用。
描述性。構件必須提供規範的函數名稱、接口信息,參數含義與範圍、必要的注意事項等。
可移植性。一樣功能的構件,作到不改動或少改動,而方便的移植到同系列及不一樣系列芯片內。
可複用性。高層調用者對構件的使用不會因底層實現的變化而有所改變。
一、層次化原則
針對應用場景和服務對象,分層組織構件。設計底層驅動構件的過程當中,有一些與處理器相關的、描述了芯片寄存器映射的內容,這些是全部底層驅動構件都須要使用的,將這些內容組織成底層驅動的公共內容,做爲底層驅動構件的基礎。
在構件的層次模型中,上層構件能夠調用下層構件提供的服務,同一層次的構件不存在相互依賴關係,不能相互調用。
二、易用性原則
三、魯棒性原則
四、內存可靠使用原則
命名基本原則:
命名清晰明瞭,有明確含義,使用完整單詞或約定俗稱的縮寫。
命名風格要自始至終保持一致。
爲了代碼的複用,命名中應避免使用與具體項目相關的前綴。
爲了便於管理,對程序實體的命名要體現出所屬構件的名稱。
使用英文命名。
除宏命名外,名稱字符所有小寫,以」_」做爲單詞的分隔符。
一、文件的命名
二、函數的命名
三、函數形參變量與函數內局部變量的命名
四、宏常量及宏函數的命名
五、結構體類型的命名、類型定義與變量聲明
註釋
在程序代碼中使用註釋,說明程序在「作什麼」,解釋代碼的目的,功能和採用的方法。
一、 文件頭註釋
二、函數頭註釋
爲某一款芯片編寫驅動構件時,不一樣的構件存在公共使用的內容,將這些內容以構件的形式組織起來,稱爲構件公共要素。全部底層驅動都包含對構件公共要素的引用。
芯片寄存器映射文件
每一個底層驅動構件都是以硬件模塊的特殊功能寄存器爲操做對象,所以,在\(common.h\)文件中包含描述芯片寄存器映射的頭文件。
還須要將內核及芯片相關文件引用到公共要素中。
移位操做的宏函數
重定義基本數據類型
在編寫嵌入式時要明確使用變量的字長,所以,需根據具體編譯器從新定義嵌入式基本數據類型。有利於軟件的移植。
編碼框架
編寫每一個構件的頭文件時,應使用#ifndef……#define……#endif
編碼結構,防止對頭文件的重複包含。
使用宏定義
使用宏定義標識構件中的常量,爲常量提供有意義的別名。
使用宏函數實現構件對外部請求服務的接口映射。
聲明對外接口函數,包含對外接口函數的使用說明
#include
包含自身頭文件。