雙向連結串列
-
為什麼
LOS_ListHeadInsert
的實現是從頭部節點的後面也就是第二個節點的位置插入新節點,而不是直接將頭部節點更新為插入的節點?頭部節點的作用:在雙向連結串列中,頭部節點(通常稱為頭結點或啞結點)通常不儲存實際的資料,而是作為連結串列的起始點和操作的輔助節點。它使得連結串列的操作(如插入、刪除、遍歷等)更加統一和方便。
-
為什麼LiteOS後面還有一個-A?
OpenHarmony LiteOS-A
核心是基於Huawei LiteOS
核心演進發展的新一代核心,Huawei LiteOS
是面向IoT
領域構建的輕量級物聯網作業系統。在IoT
產業高速發展的潮流中,OpenHarmony LiteOS-A
核心能夠帶給使用者小體積、低功耗、高效能的體驗以及統一開放的生態系統能力,新增了豐富的核心機制、更加全面的POSIX
標準介面以及統一驅動框架HDF
(OpenHarmony Driver Foundation)等,為裝置廠商提供了更統一的接入方式,為OpenHarmony
的應用開發者提供了更友好的開發體驗。
原始碼結構
-
讀原始碼最需要的東西:架構圖和原始碼結構
/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 # 中文註解版新增目錄
計時單位
-
各種不同的週期概念:
- 時鐘週期 這裡的時鐘指的就是晶振,也叫晶振週期/振盪週期。它是計算機的最小時間單元,其他週期只能是它的倍數。
- 機器週期 一個機器週期等於多個時鐘週期。它是
CPU
完成一個基本操作的時間單元。比如: 取指、譯碼、儲存器讀/寫、運算等等操作。 - 指令週期 它是
CPU
完成一條指令的時間。不同的機器分解指令週期的方式也不同,有的處理器對每條指令分解出相同數量的機器週期,另一些處理器根據指令的複雜程度分解出不同數量的機器週期。 - 匯流排週期 它是
CPU
操作匯流排裝置的時間,由於存貯器和I/O
埠是掛接在匯流排上的,對它們的訪問,是透過匯流排實現的。通常將進行一次訪問所需時間稱為一個匯流排週期。這種訪問速度較慢,因硬體發展的原因,各個裝置的工作頻率無法同步,甚至相差幾個數量級,就出現了分頻概念,將高頻訊號變成低頻訊號。 - 從時間長短角度總結下 時鐘週期 < 機器週期 < 指令週期 < 匯流排週期
優雅的宏
-
volatile
關鍵字的作用究竟是什麼?以前只知道是防止CPU從暫存器或快取中讀取臨時值,而是直接從記憶體中讀取新的值,這次一步到位徹底理解它:- 防止編譯器最佳化
- 編譯器在進行程式碼最佳化時,可能會將變數的值儲存在暫存器中,以減少對記憶體的訪問次數,從而提高程式的執行效率。然而,對於一些特殊的變數,如外部裝置暫存器、中斷服務程式中的共享變數等,每次訪問都需要實時讀寫記憶體,不能依賴暫存器中的快取值。使用volatile關鍵字可以告訴編譯器不要對該變數進行最佳化,確保每次對該變數的讀寫都直接操作記憶體。
- 保證變數的可見性
- 在多執行緒程式設計中,當一個執行緒修改了被宣告為volatile的變數後,其他執行緒能夠立即看到這個變數的最新值,而不是看到可能被快取的舊值。這是因為volatile變數會直接從主記憶體讀取,而不是從執行緒的本地快取中讀取。這一特性有助於避免執行緒之間的資料競爭,並確保多執行緒環境下變數的值是最新的。
- 保證指令的有序性
- 使用volatile關鍵字可以防止編譯器對程式碼進行指令重排序。在多執行緒環境中,指令重排序可能會導致資料不一致或難以預測的行為。volatile關鍵字可以確保對volatile變數的寫入在所有前面的操作完成後才能被執行,從而保持指令的順序性。
- 防止編譯器最佳化
-
緩衝區(cache)
寫緩衝是為了提高儲存器的總體訪問效率而設的,但它會帶出來一個副作用就是同步問題,會導致寫記憶體的指令被延遲幾個週期執行,因此對儲存器的設定不能即刻生效,這會導致緊臨著的下一條指令仍然使用舊的儲存器設定——但程式設計師的本意顯然是使用新的儲存器設定。這種紊亂危象是後患無窮的,常會破壞未知地址的資料,有時也會產生非法地址訪問。
除錯的時候經常遇到這種問題......現在遇到那種現象比較詭異的問題,一般都先加兩條重新整理Cache的程式碼看看有沒有效果。
-
流水線
常常看到流水線的概念,也大致瞭解其是什麼,但由於還沒學用FPGA實現RISC-V核心,到現在還是不太理解流水線是怎麼實現的,CPU什麼時候決定使用流水線,還是說由編譯器決定?在此記錄以後追究。
點陣圖管理
-
什麼是點陣圖,之前在檔案系統原始碼中看到過,現在又在優先順序模組中看到?
如其名,點陣圖是一種位元陣列或矩陣。點陣圖管理器就是對其中位的各種操作。
POSIX
-
CMSIS,好久不用ARM架構的晶片 ,對這個東西都有些生疏。
ARM的硬體抽象層
CMSIS
( Cortex Microcontroller Software Interface Standard)縮寫,中文為Cortex系列微控制器軟體介面標準。此標準是ARM公司,晶片供應商以及軟體供應商共同制定的。