點(diǎn)擊藍(lán)字 ╳ 關(guān)注我們
開源項目 OpenHarmony是每個人的 OpenHarmony冷欽街
軟通動力
以下內(nèi)容來自嘉賓分享,不代表開放原子開源基金會觀點(diǎn)一、背景
OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)輕量系統(tǒng)面向MCU類處理器例如ARM Cortex-M、RISC-V 32位的設(shè)備,硬件資源極其有限,支持的設(shè)備最小內(nèi)存為128KiB,可以提供多種輕量級網(wǎng)絡(luò)協(xié)議,輕量級的圖形框架,以及豐富的IOT總線讀寫部件等。可支撐的產(chǎn)品如智能家居領(lǐng)域的連接類模組、傳感器設(shè)備、穿戴類設(shè)備等。 在輕量系統(tǒng)內(nèi)核中,由于可用內(nèi)存資源少,一般的數(shù)據(jù)資源都是小批量的,所以其資源管理方式都比較簡單且相似,本文重點(diǎn)講解在輕量系統(tǒng)內(nèi)核中,典型的資源的存儲和訪問方式。這些典型的資源包括互斥鎖,信號量、消息隊列、事件、定時器等。 本文以互斥鎖為例來探究其內(nèi)核資源的主要管理方式。 互斥鎖軟件模塊相關(guān)的代碼在如下位置 https://gitee.com/openharmony/kernel_liteos_m/blob/master/kernel/src/los_mux.c https://gitee.com/openharmony/kernel_liteos_m/blob/master/kernel/include/los_mux.h二、模塊使能和容量
互斥鎖軟件模塊是編譯可裁剪模塊,可以通過編譯配置宏來打開或者關(guān)閉具體的編譯配置宏定義在https://gitee.com/openharmony/kernel_liteos_m/blob/master/kernel/include/los_config.h文件中 ? 通過這個文件可知,liteos_m內(nèi)核默認(rèn)是使能互斥鎖功能的,但我們根據(jù)具體產(chǎn)品可以對其進(jìn)行設(shè)置,如某產(chǎn)品對應(yīng)的配置文件https://gitee.com/openharmony/device_qemu/blob/master/arm_mps2_an386/liteos_m/board/target_config.h ? ? 這里明確看到此產(chǎn)品使用了互斥鎖功能,如果需要將其關(guān)閉,直接修改成0值即可。 互斥鎖支持的最大數(shù)目不同產(chǎn)品可以不同,當(dāng)前這個產(chǎn)品為24,如果產(chǎn)品沒有定義容量限制,那么使用默認(rèn)容量限制(見los_config.h中)。 ? ?1.數(shù)據(jù)保存方式 由于容量較小,采用數(shù)組這種簡單和原始的數(shù)據(jù)保存方式,在系統(tǒng)初始化的時候申請數(shù)組內(nèi)存。如下(los_mux.c中) ?三、數(shù)據(jù)訪問方式
由于輕量系統(tǒng)的計算資源相對受限,因此需要在算法上斤斤計較。目前提供了ID方式(數(shù)組下標(biāo)訪問)和鏈表訪問2種方式,如下進(jìn)行詳細(xì)說明。1.通過ID訪問 在los_mux.h中,定義了通過id訪問互斥鎖的方法,其實(shí)質(zhì)就是數(shù)組下標(biāo)訪問,獲取具體互斥鎖資源的地址 ?2.通過空閑鏈表訪問 隨著互斥鎖的申請和釋放,系統(tǒng)中當(dāng)前正在使用的互斥鎖數(shù)目是動態(tài)變化的。由于采用了數(shù)組存儲以及內(nèi)存預(yù)留的策略,所以數(shù)組中的互斥鎖有些是空閑的,有些是正在使用的,并且其狀態(tài)隨著系統(tǒng)的運(yùn)行過程而無規(guī)律地變化。 若僅依賴于數(shù)組方式訪問互斥鎖,則查詢空閑互斥鎖是一個稍耗時的算法,因?yàn)橐闅v數(shù)組。 為了加快空閑互斥鎖的查詢,本系統(tǒng)采用了將所有空閑互斥鎖組織成鏈表的方法。這樣每次取出鏈表第一個節(jié)點(diǎn)即可,可以極大提升性能。 在los_mux.h中,通過增加muxList字段將所有空閑的互斥鎖組織成鏈表 ? 在los_mux.c中,系統(tǒng)初始化時,所有互斥鎖都為空閑狀態(tài),放入空閑鏈表 ? ? 在los_mux.c中,創(chuàng)建互斥鎖時,從空閑鏈表取下空閑狀態(tài)的互斥鎖 ? ? 在los_mux.c中,釋放互斥鎖時,將互斥鎖放入空閑鏈表 ? ?四、健壯性考慮
1.空閑狀態(tài)雙保險 除了通過判斷是否在空閑鏈表上來判斷描述符是否空閑以外,在結(jié)構(gòu)體中也保存了是否空閑的狀態(tài),這樣可以增加空閑狀態(tài)判斷的健壯性;另外,通過直接判斷狀態(tài)也比判斷是否在鏈表中性能更高。如下(los_mux.c中): ?2.中斷上下文保護(hù) 由于在中斷上下文中不允許有睡眠操作,而互斥鎖獲取邏輯就是典型的具有睡眠操作的邏輯,所以,互斥鎖的獲取和釋放不能在中斷上下文中,如下(los_mux.c中)。 ?3.任務(wù)切換保護(hù) IPC操作有時會需要任務(wù)切換,如果當(dāng)前任務(wù)切換功能被臨時關(guān)閉,則不允許進(jìn)行IPC操作,互斥鎖獲取操作也是IPC操作的一種。 代碼如下(los_mux.c): ?4.關(guān)鍵任務(wù)不允許切換 一些系統(tǒng)關(guān)鍵任務(wù)運(yùn)行后,不允許執(zhí)行IPC邏輯,比如軟件定時器任務(wù):其監(jiān)控多個定時器的超時。假定其執(zhí)行IPC邏輯導(dǎo)致任務(wù)等待某資源比較長的時間,會導(dǎo)致后續(xù)部分定時器定時功能失效(不準(zhǔn)確)。代碼如下(los_mux.c): ?五、總結(jié)
輕量系統(tǒng)中內(nèi)核資源多采用數(shù)組與空閑鏈表相結(jié)合的方式。除了OpenHarmony輕量系統(tǒng),其他嵌入式系統(tǒng)中這類的數(shù)據(jù)存儲方式也比較常見。這種方式有如下幾個突出的優(yōu)點(diǎn)●簡單易懂●讀寫效率高
●代碼緊湊
原文標(biāo)題:OpenHarmony輕量系統(tǒng)中內(nèi)核資源主要管理方式
文章出處:【微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
OpenHarmony
+關(guān)注
關(guān)注
25文章
3753瀏覽量
16669
原文標(biāo)題:OpenHarmony輕量系統(tǒng)中內(nèi)核資源主要管理方式
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論