天天看點

【文獻心得】關于核心在不同晶片平台移植的相關整理

[1]張中前.基于STM32單片機的uC/OS-Ⅱ作業系統移植[J].機電元件,2020,40(06):57-61.

所謂移植,就是一個實時作業系統能夠在某個微處理器平台上或微控制器平台上運作。

[1]王浩天,汲偉明.基于SOPC的華為鴻蒙LiteOS作業系統移植[J].科技經濟導刊,2021,29(12):19-21.

相較于直接操作底層硬體,嵌入式實時作業系統能夠更合理、更有效地利用系統資源,其在方案制定和實作階段有着低成本,短開發周期的特點。

SOPC(System on Programmable Chip,可程式設計片上系統),即用可程式設計邏輯技術将整個系統內建到一塊晶片上。SPOC 通常是指 FPGA 的帶 1 個或多個軟核或者硬核微處理器以及一些外圍裝置的片上系統。目前主流的嵌入式軟核處理器有:Nios Ⅱ處理器和 MicroBlaze 處理器以及ARM公司提供的軟核(如Cortex-M3)。

[1]趙娜靖,佟志勇,李超然,李勇,楊自恒.基于裝置樹平台下Exynos4412嵌入式Linux系統移植[J].黑龍江大學工程學報,2020,11(04):75-80.

裝置樹功能子產品能夠精煉重構核心代碼架構,實作核心啟動過程的優化透明,将核心和硬體資源描述相對獨立,有利于規範化的硬體描述,精簡驅動代碼,極大簡便了核心的移植以及調試。裝置樹的引入有利于底層硬體規範化描述,使代碼不再備援;核心鏡像能支援多種平台,即隻需要更換裝置樹檔案便可以實作不同主機闆之間的無差異支援。

裝置樹包含DTC、DTS 和 DTB。

  • DTS:dts 檔案是對裝置樹的描述,放置在核心的​

    ​/arch/arm/boot/dts​

    ​​ 目錄下。一個​

    ​*.dts​

    ​ 檔案對應一個 ARM 的 machine。dts 檔案描述了目标闆的硬體資源。
  • DTC:DTC 為編譯工具,它将​

    ​*.dts​

    ​​ 編譯成​

    ​*.dtb​

    ​ 檔案。
  • DTB:二進制檔案,bootloader 在引導核心時,會預先讀取​

    ​*.dtb​

    ​ 檔案到記憶體,進而由核心解析。
  • DTSI:由于同一個 SOC 可能有多個不同的電路闆,每個電路闆擁有一個​

    ​*.dts​

    ​​ ,這些​

    ​*.dts​

    ​​ 會存在許多共通的部分,為了減少代碼的備援,裝置樹将這些共同部分凝煉儲存在​

    ​*.dtsi​

    ​​檔案中,供不同的​

    ​*.dts​

    ​ 共同使用。
【文獻心得】關于核心在不同晶片平台移植的相關整理

裝置樹的作用:1. 平台(闆級)識别,讓核心識别目前使用的是哪個開發闆,識别方式是 root 節點下的 compatible 字段;2. 核心啟動時啟動參數的配置(bootargs 的配置、ramdisk 的起時和結束位址);3. 裝置資訊集合,集合了各種裝置控制器。

【文獻心得】關于核心在不同晶片平台移植的相關整理

嵌入式系統移植需要搭建硬體和軟體交叉開發環境、移植引導加載程式、移植核心、裝置樹、根檔案系統、項目需要的移植和開發相關的裝置驅動程式移植。

額外補充:

【文獻心得】關于核心在不同晶片平台移植的相關整理

普通節點:

DTS 檔案中,裝置用節點來表示,格式為:

[label:]node-name[@unit-address]{
  [properties definitions]
  [child nodes]
};      
  • node-name:裝置節點名稱,根節點用 / 表示。
  • unit-address:一般指代裝置位址或寄存器首位址。
  • label:裝置别稱,用于便捷通路節點。如一個名稱slcr@f8000000的節點,正常要通路的話,需要用名稱slcr@f8000000去通路,如果給這個節點加上标簽 slcr1:slcr@f8000000,通路節點隻需要使用&slcr1即可。
  • {} 的是節點的内容,節點内容有兩類,[properties definitions]是節點屬性,[chile nodes]是挂在在這個裝置節點上的子節點。

特殊節點 —— aliases

aliases{
  ethernet0 = "&gem0";
  serial0 = "&uart1";
};      

之後便可以使用 &gem 來通路節點 ethernet。

屬性

  1. [label:]property-name; 屬性為空值,如示例代碼中20,26行autorepeat;
  2. [label:]property-name=<arrays of cells>; <> 括起來的值内容是32位資料的合集,第11行。
  3. [label:]property-name=“string”;第5行;
  4. [label:]property-name=[bytestring];用[]括起來的表示字元序列,假設屬性表示為 memory-addr=[0011223344],這個就等同于memory-addr=[00 11 22 33 44],5 個byte型的數組成,byte 型的數是兩位16進制數組成。

标準屬性

compatible 屬性也叫相容性,它的值是字元串清單,是裝置和驅動關聯的關鍵,在驅動代碼中定義一個 OF 比對表和 compatible 屬性對應。如 17 行,節點 gpio-keys 的 compatible=“gpio-keys”,那麼在對應的驅動代碼中,就會有以下定義來與之對應:

static const struct of_device_id gpiokeys_ids[] = {
  {.compatible = "gpio-keys",},
  {/*sentinel*/}
};      

struct of_device_id 是 OF 比對表的資料類型。當驅動程式 OF 比對表中的 compatible 值與裝置樹節點中的 compatible 相對應時,這個節點就會使用這個驅動程式。

根節點中的 compatible 屬性表示這個闆子相容哪些平台,一般有兩個值,前者表示闆子的型号,後者表示使用的晶片。

model 屬性

model 屬性的值也是字元串,一般用來表示闆子的名稱,與根節點中的 compatible 屬性類似。

#address-cells、#size-cells 和 reg 屬性

  • #address-cells 屬性表示目前節點子節點的 reg 屬性中,使用多少個 u32 整數來描述位址 address。
  • #size-cells 屬性表示目前節點子節點的 reg 屬性中,使用多少個 u32 整數來描述大小 length。
  • reg 屬性一般用于描述某個外設的寄存器位址範圍資訊,格式 reg=<address1 length1 address2 length2 address3 length3 …>。
  • 父節點的#address-cells 屬性即指代 reg 屬性中 address 的大小,#size-cells 即指代 reg 屬性中 length 的大小。
【文獻心得】關于核心在不同晶片平台移植的相關整理

子節點 ax-son 的 reg 屬性有 6 個 u32 的資料,父節點 ax-parent 中 #address-cells 等于 2,是以子節點 ax-son 的 reg 屬性的值中表示 address 的有兩個 u32 的數(0x00000001、0x00000002),這兩個資料都是 address 的值,#size-cells等于1,length1的值僅有一個u32的資料(0x00000003),最後三個數是address2和length2的值。

device_type 屬性

這個屬性隻能用于 cpu 節點或者 memory 節點,在 cpu 節點中 device_type=“cpu”,在memory節點中,device_type=“memory”。

phandle屬性

該屬性的取值必須是唯一的,他的作用與 label 标簽類似,用來引用節點。

ax-node-1{
  phandle=<1>;
  interrupt-controller;
}

ax-node-2{
  interrupt-parent = <1>;
}      

在檔案系統中檢視裝置樹

​cd /proc/device-tree​

進入對應的節點中,能檢視到節點的各個屬性。​

​cd memory/​

修改裝置樹

我們在修改裝置樹時,需要遵循标準,可以在核心源碼目錄 ​

​/Documentation/devicetree/bindings​

​ 中檢視說明和指導。

of 函數

Linux 核心提供了 of 函數來擷取裝置樹中的資訊。原型定義在 include/linux/of.h 中。

查找結點的 of 函數

  1. deviec_node 結構體
  2. of_find_node_by_name 函數
  3. of_find_node_by_type 函數
  4. of_find_compatible_node 函數
  5. of_find_node_by_path 函數

提取屬性的 of 函數

  1. property 結構體
  2. of_find_property 函數
  3. of_property_read_u32_array 函數
  4. of_property_read_u32 函數
  5. of_property_read_string 函數
[1]劉長勇,王宜懷,彭濤,孫亞軍,程宏玉.實時作業系統mbedOS的移植方法[J].計算機系統應用,2020,29(05):117-122.

MbedOS 是 ARM 公司于 2014 年開始推出的一款面向隻能終端與物聯網節點的實時作業系統,主要用于對相應時間有較高實時性要求的嵌入式系統。在深入分析 mbedOS 的基本功能、排程機制、延時函數機制、任務間通信機制等基礎上,以可移植的mbedOS工程架構為基礎,分析移植的共性問題,給出具體的移植方法。

本文在深入剖析 mbedOS 的基本功能和實時性要求上,根據嵌入式軟體工程的基本思想,以可擴充、可移植的 mbedOS 工程架構為基礎,分析了移植的共性問題和注意事項,給出了具體的移植方法,解決了 mbedOS 在不同的核心、MCU、開發環境等上的移植關鍵技術問題,為 mbedOS 的應用研究提供了基礎,為 mbedOS 的移植提供了一條簡潔、有效的路徑。

無作業系統工程架構 SD-NOS 和可移植的 SD-mbedOS 工程架構的建構。1. 根據無作業系統軟體最小系統的含義,建立包括說明文檔、核心相關檔案、微控制器相關檔案、使用者闆構件、軟體構件、中斷服務程式和無作業系統主程式等嵌入式系統工程最基本要素的無作業系統工程架構 SD-NOS。2. 提出 RTOS 軟體最小系統的含義,将任務管理、排程管理、記憶體管理、中斷管理、時間管理以及同步與通信等 RTOS 最基本功能要素,以構件的形式添加到無作業系統軟體最小系統上,構成能至少實作對兩個任務進行排程的工程架構。3. 按照“分門别類、各有歸處”的原則,對工程架構的檔案夾和共性檔案進行歸納分類,以編号的形式建立相應的檔案夾存放源程式和頭檔案。

本文涉及到的 MCU 雖然核心不相同、所采用的開發環境也不一樣,但都屬于 ARM Cortex-M 處理器範疇,都遵循微控制器接口标準(CMSIS),當在不同 MCU 上進行 mbedOS 移植時,必須分析開發環境、編譯器和核心等方面的設定和使用問題。

mbedOS 的移植方法。分析 mbedOS 代碼結構,根據應用開發的實際從中抽取相關檔案加入到工程中,然後在工程中編譯,修改相關的錯誤。步驟:1. 建構無作業系統工程架構;2. 複制 mbedOS 檔案;3. 設定核心與 MCU 相關檔案;4. 設定工程屬性;5. 與應用開發相關的内容設定;6. 編譯工程。

mbedOS 移植後的測試。本測試工程涉及到 RTOS 的任務排程、時間滴答、延時函數、事件、消息隊列等基本要素。

[1]王兆濱,韓鵬程.MSP432的RT-Thread作業系統移植[J].單片機與嵌入式系統應用,2021,21(05):39-42.

RT-Thread 是由中國公司開發的開源實時作業系統,易剪裁、支援各類标準接口、支援各種 MCU 架構,并且還具有 AT 指令、TCP/IP 協定棧、圖形使用者界面等多種功能元件。

RT-Thread 系統移植過程:裁剪 RT-Thread 源代碼、修改配置檔案、修改系統時鐘、建立任務等工作。

[1]劉睿洋.ARM平台下Linux嵌入式系統的移植[J].電子技術與軟體工程,2020,{4}(03):40-41.

ARM 的編址上,記憶體與I/O裝置是同時進行的,指令系統得到優化,指令的靈活度比較高,也提高了系統運作效率。ARM 将存儲器使用寄存器代替,系統的運作速度得到提升。在編址的時候,将大端格式和小端格式結合,靈活的組織形式使得操作更加友善。

[1]戈孜榮. 面向ARM架構的HPC系統性能評測及應用移植優化[D].蘭州大學,2020.

ARM 共規劃設計了三類處理器:A 架構,主要針對複雜的計算應用程式領域,比如移動和企業等高性能市場;R 架構,主要針對實時性要求較高的嵌入式市場,比如醫療裝置、車輛轉向等信号處理和制動等;M 架構,主要應用于對能效、功耗和尺寸有所要求的場合,比如小型傳感器,智能穿戴和智能家居的通信子產品等。