嵌入式技術基礎與實踐-學習札記(三)

嵌入式技術基礎與實踐-學習札記(三)

嵌入式硬件構件

概念

嵌入式硬件構件是指將一個或多個硬件功能模塊,支撐電路及其功能描述封裝成一個可重用的硬件實體,並提供一系列規範的輸入/輸出接口。硬件模塊是硬件構件的組成部分,一個硬件構件可能包含多個硬件功能模塊框架

分類

根據接口之間的生產消費關係,接口可分爲供給接口和需求接口兩類。根據所擁有的接口類型的不一樣,硬件構件分爲核心構件、中間構件和終端構件。函數

  • 核心構件只有供給結構,沒有需求接口。也就是說,只爲其餘硬件構件提供服務,而不接受服務。例如芯片的硬件最小系統
  • 中間構件既有需求接口又有供給接口。例如電源控制構件,\(232\)電平轉換構件。
  • 終端構件只有需求接口,它只接受其餘構件提供的服務。例如\(LCD\)構件,\(LED\)構件,鍵盤構件。

利用硬件構件進行嵌入式系統硬件設計以前,應該進行硬件構件的合理劃分,按照必定規則,設計與系統目標無關的構件個體,而後進行「組裝」,完成具體系統的硬件設計。學習

電路圖設計簡明規則

在繪製原理圖時,一個硬件構件使用一個虛線框,把硬件構件的電路及其文字描述括在其中,對外接口引出到虛線框外,填上接口網標。編碼

1. 硬件構件設計的通用規則

(1)、元器件命名格式:對於核心構件,其元器件直接編號命名,同種類型的元件命名時冠以相同字母前綴。如電阻\(R1,R2\)。對於中間構件和終端構件,其元器件命名格式採用「構件名-標誌字符?「。例如,\(LCD\)構件的電阻名爲\(LCD-C1\)。當構件原理圖應用到具體系統時,可藉助原理圖編輯軟件自動編號。spa

(2)、爲硬件構件添加詳細的文字描述,包括中文名稱、英文名稱、功能描述、接口描述、注意事項等,以加強原理圖的可讀性。操作系統

(3)、前兩步產生的內容封裝在一個虛線框內,組成硬件構件的內部實體。設計

(4)、爲該硬件構件添加與其餘構件交互的輸入/輸出接口標識。接口標識有兩種:3d

  • 接口註釋標於虛線框內,是爲構件接口所作的解釋性文字。
  • 接口網標位於虛線框外,且具備電路鏈接特性。

2. 核心構件設計規則

設計核心構件時,須要考慮的問題是:「核心構件能爲其餘構件提供哪些信號?指針

核心構件其實就是某型號\(MCU\)的硬件最小系統。核心構件設計的目標是:凡是使用該\(MCU\)進行硬件系統設計時,核心構件能夠直接「組裝」到系統中,無需任何改動。code

在進行接口設計時,須要將全部可能使用到的引腳都標註上接口網標。若同一引腳具備不一樣的功能,則接口網標依據第一功能命名。

3. 中間構件設計規則

設計中間構件時,須要考慮的問題是:」中間構件須要接受哪些信號,以及提供哪些信號?

一箇中間構件應具備明確的且相對獨立的功能,它既要有接受其餘構件提供的服務的接口,即需求接口,又要有爲其餘構件提供服務的接口,即供給接口。描述需求接口採用接口註釋,處於虛線框內,描述供給接口採用接口網標,處於虛線框外。

將構件的需求接口放置在構件實體的左側,供給接口放置在右側。接口網標的命名規則是:構件名稱-引腳信號/功能名稱。

4. 終端構件設計規則

設計終端構件時,須要考慮的問題是:」終端構件須要什麼信號才能工做?

它僅有與上一級構件交互的需求接口,於是街廓標識均爲斜體標註的接口註釋。

使用硬件構件化思想設計嵌入式硬件系統的過程與步驟以下:

  1. 根據系統的功能劃分出若干個硬件構件。
  2. 將全部的硬件構件原理圖」組裝「在一塊兒
  3. 爲中間構件和終端構件添加接口網標。

嵌入式底層驅動構件的概念與層次模型

嵌入式系統中,驅動程序是直接工做在各類硬件設備上的軟件,是硬件和高層軟件之間橋樑。

嵌入式底層驅動構件的概念

  • 構件\((Component)\)是可重用的實體,它包含合乎規範的接口和功能實現,可以被獨立部署和被第三方組裝。

  • 軟件構件是指,在軟件系統中具備相對獨立功能、能夠明確辨識的構件實體。
  • 嵌入式軟件構件是實現必定嵌入式系統功能的一組封裝的、規範的、可重用的、具備嵌入式特性的軟件構件單元。是組織嵌入式系統功能的基本單位。
  • 嵌入式底層驅動構件,簡稱底層驅動構件或硬件驅動構件,是直接面向硬件操做系統的程序代碼及使用說明。規範的底層驅動構件由頭文件及源程序文件構成。頭文件是底層驅動構件簡明且完備的使用說明,也就是說,不須要查看源程序文件,就可以使用該構件進行下一層程序的開發。

嵌入式硬件構件和軟件構件的層次模型

在硬件構件層中,相對於核心構件而言,中間構件和終端構件是核心構件的」外設「。由這些」外設「的驅動程序封裝而成的軟件構件成爲底層外設構件。

由上圖能夠看出,底層外設構件能夠調用底層內部構件,如\(LCD\)構件能夠調用\(GPIO\)驅動構件。而高層構件能夠調用底層外設構件和底層內部構件中的功能構件,而不能直接調用\(GPIO\)驅動構件。另外,幾乎全部的底層內部構件都涉及\(MCU\)各類寄存器額使用,所以將\(MCU\)的全部寄存器定義組織在一塊兒,造成\(MCU\)頭文件。

底層驅動構件的封裝規範

構件設計的基本思想與基本原則

  1. 構件設計的基本思想

    底層構件被組織成具備必定獨立性的功能模塊,由頭文件和源程序文件兩部分組成。構件的頭文件名和源程序名一致,且爲構件名。

    構件的頭文件中,主要包含必要的引用文件、描述構件功能特性的宏定義語句以及聲明對外接口函數。

    構件的源程序文件中包含構件的頭文件,內部函數聲明、對外接口函數的實現。

    儘可能作到:當一個底層構件應用到不一樣系統中時,僅需修改構件的頭文件,對於構件的源程序文件則沒必要要修改或改動很小。

  2. 構件設計的基本原則

    良好的底層驅動具備如下特性:

    • 封裝性。即內部實現的調整不會影響構件調用者的使用。

    • 描述性。構件必須提供規範的函數名稱、接口信息,參數含義與範圍、必要的注意事項等。

    • 可移植性。一樣功能的構件,作到不改動或少改動,而方便的移植到同系列及不一樣系列芯片內。

    • 可複用性。高層調用者對構件的使用不會因底層實現的變化而有所改變。

    一、層次化原則

    • 針對應用場景和服務對象,分層組織構件。設計底層驅動構件的過程當中,有一些與處理器相關的、描述了芯片寄存器映射的內容,這些是全部底層驅動構件都須要使用的,將這些內容組織成底層驅動的公共內容,做爲底層驅動構件的基礎。

    • 在構件的層次模型中,上層構件能夠調用下層構件提供的服務,同一層次的構件不存在相互依賴關係,不能相互調用。

    二、易用性原則

    • 函數名簡潔且達意;接口參數清晰,範圍明確,使用說明語言精煉規範,避免二義性。

    三、魯棒性原則

    • 再明確函數輸入輸出的取值範圍,提供清晰接口描述的同時,在函數實現內部要有對輸入輸出參數的檢測,對超出合法範圍的輸入參數進行必要的處理。

    四、內存可靠使用原則

    • 優先使用靜態分配內存。
    • 謹慎使用變量。
    • 檢測空指針。
    • 檢測緩衝區溢出,併爲內存中的緩衝區預留不小於\(20\%\)的冗餘。

編碼風格基本規範

命名基本原則:

  • 命名清晰明瞭,有明確含義,使用完整單詞或約定俗稱的縮寫。

  • 命名風格要自始至終保持一致。

  • 爲了代碼的複用,命名中應避免使用與具體項目相關的前綴。

  • 爲了便於管理,對程序實體的命名要體現出所屬構件的名稱。

  • 使用英文命名。

  • 除宏命名外,名稱字符所有小寫,以」_」做爲單詞的分隔符。

    一、文件的命名

    • 底層驅動構件在具體設計時分爲兩個文件,頭文件,源文件,命名格式爲 <硬件模塊名稱> .後綴。

    二、函數的命名

    • 底層驅動構件的函數從屬於驅動構件,驅動函數的命名除了要體現函數功能外,還須要使用命名前綴和後綴標識其所屬的構件及不一樣的實現方式。
    • 函數名前綴:底層驅動構件中定義的所用函數均使用」 <構件名> _「前綴標識其所屬的驅動構件模塊。
    • 函數名後綴:對同一服務的不一樣方式的實現,使用後綴加以區分。

    三、函數形參變量與函數內局部變量的命名

    • 函數形參變量:函數形參變量名應直觀代表參數意義,若傳入的參數是指針類型應使用\(「\_prt」\)後綴加以標識。
    • 局部變量:局部變量的命名與函數形參變量類型。注意通常不取單個字符\((i,j,k)\)進行命名。

    四、宏常量及宏函數的命名

    • 宏常量和宏函數的命名所有使用大寫字符,使用下劃線爲分隔符。

    五、結構體類型的命名、類型定義與變量聲明

    • 結構體類型名稱使用小寫字母命名,定義結構體類型變量時,所有使用大寫字母命名。
    • 對結構體內部字段所有使用大寫字母命名。
    • 定義類型時,同時聲明一個結構體變量和結構體指針變量。

註釋

​ 在程序代碼中使用註釋,說明程序在「作什麼」,解釋代碼的目的,功能和採用的方法。

​ 一、 文件頭註釋

二、函數頭註釋

公共要素文件

爲某一款芯片編寫驅動構件時,不一樣的構件存在公共使用的內容,將這些內容以構件的形式組織起來,稱爲構件公共要素。全部底層驅動都包含對構件公共要素的引用。

  1. 芯片寄存器映射文件

    每一個底層驅動構件都是以硬件模塊的特殊功能寄存器爲操做對象,所以,在\(common.h\)文件中包含描述芯片寄存器映射的頭文件。

    還須要將內核及芯片相關文件引用到公共要素中。

  2. 移位操做的宏函數

  3. 重定義基本數據類型

    在編寫嵌入式時要明確使用變量的字長,所以,需根據具體編譯器從新定義嵌入式基本數據類型。有利於軟件的移植。

頭文件的設計規範

  1. 編碼框架

    編寫每一個構件的頭文件時,應使用#ifndef……#define……#endif編碼結構,防止對頭文件的重複包含。

  2. 使用宏定義

    使用宏定義標識構件中的常量,爲常量提供有意義的別名。

    使用宏函數實現構件對外部請求服務的接口映射。

  3. 聲明對外接口函數,包含對外接口函數的使用說明

源程序文件設計規範

  1. 只容許一處使用#include包含自身頭文件。
  2. 合理設計與實現對外接口函數與內部函數。
  3. 不使用全局變量
相關文章
相關標籤/搜索