LiteOS學習筆記[01]-weharmonyos-基礎知識

炽杨發表於2024-11-06

雙向連結串列

  1. 為什麼LOS_ListHeadInsert的實現是從頭部節點的後面也就是第二個節點的位置插入新節點,而不是直接將頭部節點更新為插入的節點?

    頭部節點的作用:在雙向連結串列中,頭部節點(通常稱為頭結點或啞結點)通常不儲存實際的資料,而是作為連結串列的起始點和操作的輔助節點。它使得連結串列的操作(如插入、刪除、遍歷等)更加統一和方便。

  2. 為什麼LiteOS後面還有一個-A?

    OpenHarmony LiteOS-A 核心是基於 Huawei LiteOS 核心演進發展的新一代核心,Huawei LiteOS是面向IoT領域構建的輕量級物聯網作業系統。在IoT產業高速發展的潮流中,OpenHarmony LiteOS-A核心能夠帶給使用者小體積、低功耗、高效能的體驗以及統一開放的生態系統能力,新增了豐富的核心機制、更加全面的POSIX標準介面以及統一驅動框架HDF(OpenHarmony Driver Foundation)等,為裝置廠商提供了更統一的接入方式,為OpenHarmony的應用開發者提供了更友好的開發體驗。

原始碼結構

  1. 讀原始碼最需要的東西:架構圖和原始碼結構

    img

    /kernel/liteos_a
    ├── apps                   # 使用者態的init和shell應用程式
    ├── arch                   # 體系架構的目錄,如arm等
    │   └── arm                # arm架構程式碼
    ├── bsd                    # freebsd相關的驅動和適配層模組程式碼引入,例如USB等
    ├── compat                 # 核心介面相容性目錄
    │   └── posix              # posix相關介面
    ├── drivers                # 核心驅動
    │   └── char               # 字元裝置
    │       ├── mem            # 訪問物理IO裝置驅動
    │       ├── quickstart     # 系統快速啟動介面目錄
    │       ├── random         # 隨機數裝置驅動
    │       └── video          # framebuffer驅動框架
    ├── fs                     # 檔案系統模組,主要來源於NuttX開源專案
    │   ├── fat                # fat檔案系統
    │   ├── jffs2              # jffs2檔案系統
    │   ├── include            # 對外暴露標頭檔案存放目錄
    │   ├── nfs                # nfs檔案系統
    │   ├── proc               # proc檔案系統
    │   ├── ramfs              # ramfs檔案系統
    │   └── vfs                # vfs層
    ├── kernel                 # 程序、記憶體、IPC等模組
    │   ├── base               # 基礎核心,包括排程、記憶體等模組
    │   ├── common             # 核心通用元件
    │   ├── extended           # 擴充套件核心,包括動態載入、vdso、liteipc等模組
    │   ├── include            # 對外暴露標頭檔案存放目錄
    │   └── user               # 載入init程序
    ├── lib                    # 核心的lib庫
    ├── net                    # 網路模組,主要來源於lwip開源專案
    ├── platform               # 支援不同的晶片平臺程式碼,如Hi3516DV300等
    │   ├── hw                 # 時鐘與中斷相關邏輯程式碼
    │   ├── include            # 對外暴露標頭檔案存放目錄
    │   └── uart               # 串列埠相關邏輯程式碼
    ├── security               # 安全特性相關的程式碼,包括程序許可權管理和虛擬id對映管理
    ├── syscall                # 系統呼叫 
    ├── testsuites             # 單元測試用例 
    ├── tools                  # 構建工具及相關配置和程式碼
    └── zzz                    # 中文註解版新增目錄
    

計時單位

  1. 各種不同的週期概念:

    • 時鐘週期 這裡的時鐘指的就是晶振,也叫晶振週期/振盪週期。它是計算機的最小時間單元,其他週期只能是它的倍數。
    • 機器週期 一個機器週期等於多個時鐘週期。它是CPU完成一個基本操作的時間單元。比如: 取指、譯碼、儲存器讀/寫、運算等等操作。
    • 指令週期 它是CPU完成一條指令的時間。不同的機器分解指令週期的方式也不同,有的處理器對每條指令分解出相同數量的機器週期,另一些處理器根據指令的複雜程度分解出不同數量的機器週期。
    • 匯流排週期 它是CPU操作匯流排裝置的時間,由於存貯器和I/O埠是掛接在匯流排上的,對它們的訪問,是透過匯流排實現的。通常將進行一次訪問所需時間稱為一個匯流排週期。這種訪問速度較慢,因硬體發展的原因,各個裝置的工作頻率無法同步,甚至相差幾個數量級,就出現了分頻概念,將高頻訊號變成低頻訊號。
    • 從時間長短角度總結下 時鐘週期 < 機器週期 < 指令週期 < 匯流排週期

優雅的宏

  1. volatile關鍵字的作用究竟是什麼?以前只知道是防止CPU從暫存器或快取中讀取臨時值,而是直接從記憶體中讀取新的值,這次一步到位徹底理解它:

    1. 防止編譯器最佳化
      • 編譯器在進行程式碼最佳化時,可能會將變數的值儲存在暫存器中,以減少對記憶體的訪問次數,從而提高程式的執行效率。然而,對於一些特殊的變數,如外部裝置暫存器、中斷服務程式中的共享變數等,每次訪問都需要實時讀寫記憶體,不能依賴暫存器中的快取值。使用volatile關鍵字可以告訴編譯器不要對該變數進行最佳化,確保每次對該變數的讀寫都直接操作記憶體。
    2. 保證變數的可見性
      • 在多執行緒程式設計中,當一個執行緒修改了被宣告為volatile的變數後,其他執行緒能夠立即看到這個變數的最新值,而不是看到可能被快取的舊值。這是因為volatile變數會直接從主記憶體讀取,而不是從執行緒的本地快取中讀取。這一特性有助於避免執行緒之間的資料競爭,並確保多執行緒環境下變數的值是最新的。
    3. 保證指令的有序性
      • 使用volatile關鍵字可以防止編譯器對程式碼進行指令重排序。在多執行緒環境中,指令重排序可能會導致資料不一致或難以預測的行為。volatile關鍵字可以確保對volatile變數的寫入在所有前面的操作完成後才能被執行,從而保持指令的順序性。
  2. 緩衝區(cache)

    寫緩衝是為了提高儲存器的總體訪問效率而設的,但它會帶出來一個副作用就是同步問題,會導致寫記憶體的指令被延遲幾個週期執行,因此對儲存器的設定不能即刻生效,這會導致緊臨著的下一條指令仍然使用舊的儲存器設定——但程式設計師的本意顯然是使用新的儲存器設定。這種紊亂危象是後患無窮的,常會破壞未知地址的資料,有時也會產生非法地址訪問。

    除錯的時候經常遇到這種問題......現在遇到那種現象比較詭異的問題,一般都先加兩條重新整理Cache的程式碼看看有沒有效果。

  3. 流水線

    常常看到流水線的概念,也大致瞭解其是什麼,但由於還沒學用FPGA實現RISC-V核心,到現在還是不太理解流水線是怎麼實現的,CPU什麼時候決定使用流水線,還是說由編譯器決定?在此記錄以後追究。

點陣圖管理

  1. 什麼是點陣圖,之前在檔案系統原始碼中看到過,現在又在優先順序模組中看到?

    如其名,點陣圖是一種位元陣列或矩陣。點陣圖管理器就是對其中位的各種操作。

POSIX

  1. CMSIS,好久不用ARM架構的晶片 ,對這個東西都有些生疏。

    ARM的硬體抽象層CMSIS( Cortex Microcontroller Software Interface Standard)縮寫,中文為Cortex系列微控制器軟體介面標準。此標準是ARM公司,晶片供應商以及軟體供應商共同制定的。

相關文章