溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

AliOS Things SMP系統(tǒng)及其在esp32上實(shí)現(xiàn)的示例分析

發(fā)布時(shí)間:2021-11-15 17:17:06 來(lái)源:億速云 閱讀:310 作者:柒染 欄目:云計(jì)算

AliOS Things SMP系統(tǒng)及其在esp32上實(shí)現(xiàn)的示例分析,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

AliOS Things實(shí)現(xiàn)了基本的SMP調(diào)度框架,支持多CPU體系的系統(tǒng)運(yùn)行和調(diào)度機(jī)制。任務(wù)可以動(dòng)態(tài)在多核間進(jìn)行切換或者綁定運(yùn)行;高優(yōu)先級(jí)任務(wù)可以最大化利用空閑資源核運(yùn)行?;诖丝蚣埽梢钥焖賹?shí)現(xiàn)AliOS Things在各種不同多核CPU架構(gòu)下的移植。

AliOS Things實(shí)現(xiàn)了基本的SMP調(diào)度框架,支持多CPU體系的系統(tǒng)運(yùn)行和調(diào)度機(jī)制。多CPU之間對(duì)用戶系統(tǒng)運(yùn)行無(wú)區(qū)別,能平等訪問(wèn)共享內(nèi)存、外設(shè)等共享資源;任務(wù)可以動(dòng)態(tài)在多核間進(jìn)行切換或者綁定運(yùn)行;高優(yōu)先級(jí)任務(wù)可以最大化利用空閑資源核運(yùn)行。


基于此框架,可以快速實(shí)現(xiàn)AliOS Things在各種不同多核CPU架構(gòu)下的移植;對(duì)于上層應(yīng)用,可以不需要關(guān)注任務(wù)的運(yùn)行核以及底層實(shí)現(xiàn),也可以指定某任務(wù)在特定核運(yùn)行。此實(shí)現(xiàn)框架,最大化地提高SMP功能在不同CPU上的移植效率,并保證上層應(yīng)用使用SMP系統(tǒng)的簡(jiǎn)潔性。
 

1、 AliOS Things SMP基礎(chǔ)特性


特性1:多CPU公平的任務(wù)切換機(jī)制,平等訪問(wèn)共享資源
特性2:高優(yōu)先級(jí)任務(wù)合理利用空閑CPU資源
特性3:支持任務(wù)綁定核運(yùn)行
特性4:支持不同CPU下快速移植
特性5:兼容單核接口并提供SMP內(nèi)核擴(kuò)展接口

AliOS Things SMP系統(tǒng)及其在esp32上實(shí)現(xiàn)的示例分析

2、 AliOS Things SMP特性移植框架


使用AliOS Things的SMP框架,可以快速在不同CPU體系下移植,以快速實(shí)現(xiàn)SMP功能。以下列出移植需要實(shí)現(xiàn)項(xiàng),即可完成對(duì)應(yīng)CPU的SMP功能:
2.1 核啟動(dòng)加載
目前的啟動(dòng)順序是,系統(tǒng)默認(rèn)開(kāi)始啟動(dòng)0核,在0核的主任務(wù)入口內(nèi)啟動(dòng)其他核的加載,使其都進(jìn)入任務(wù)調(diào)度,并完成多核啟動(dòng)階段的同步工作:核進(jìn)入idle任務(wù)作為核啟動(dòng)完成的標(biāo)志。
2.2 核間中斷
主要作用:觸發(fā)其他核進(jìn)行調(diào)度。在任務(wù)加入ready任務(wù)隊(duì)列或者任務(wù)超時(shí)到期后,如果此任務(wù)綁定到其他核,或者比其他核正在執(zhí)行的任務(wù)優(yōu)先級(jí)高,則會(huì)觸發(fā)對(duì)應(yīng)核進(jìn)行任務(wù)切換。
2.3 核間鎖
由于多核之間的同步互斥問(wèn)題,需要實(shí)現(xiàn)核間鎖功能,用于訪問(wèn)共享資源,如任務(wù)隊(duì)列、內(nèi)存等資源時(shí),核內(nèi)的資源互斥采用開(kāi)關(guān)中斷來(lái)實(shí)現(xiàn)。目前任務(wù)相關(guān)的資源調(diào)度和內(nèi)存管理分別采用兩把核間鎖,該鎖的實(shí)現(xiàn)必須支持核內(nèi)的可重入性,而能達(dá)到核間互斥的目的。
以上功能需要在不同CPU/MCU架構(gòu)下進(jìn)行移植實(shí)現(xiàn),即可完成SMP需要的底層接口支持。OS已經(jīng)提供了標(biāo)準(zhǔn)的實(shí)現(xiàn)接口,參考下面esp32的SMP移植示例。

3、 Esp32上支持SMP移植示例


目前AliOS Things在esp32上完成了SMP的實(shí)現(xiàn),后續(xù)將繼續(xù)支持其他多核CPU比如cortex-A9等系列的多核CPU。參考下面的移植描述點(diǎn)進(jìn)行移植:
3.1 SMP編譯宏
對(duì)于某多核CPU,OS通過(guò)單版本不同編譯宏來(lái)同時(shí)支持單核和多核的框架。在Makefile中指定-DRHINO_CONFIG_CPU_NUM=X(核數(shù)目),或者修改k_config.h內(nèi)RHINO_CONFIG_CPU_NUM宏來(lái)指定核數(shù)目。推薦第一種方式。
3.2 多核加載接口
按照2.1章節(jié)描述,系統(tǒng)的啟動(dòng)順序?yàn)槟J(rèn)先啟動(dòng)0核,在0核主任務(wù)內(nèi)啟動(dòng)其他從核并實(shí)現(xiàn)同步。
需要實(shí)現(xiàn)加載其他核接口:void os_load_slavecpu(void);
內(nèi)部實(shí)現(xiàn)需要完成剩余核的復(fù)位啟動(dòng)、必要硬件的初始化,并在從屬核初始化完后,同樣進(jìn)入cpu_first_task_start開(kāi)始進(jìn)入調(diào)度;此階段,0核需要執(zhí)行os_wait_allcore接口來(lái)等待所有核的啟動(dòng)完成,以所有核都能進(jìn)入idle任務(wù)為啟動(dòng)完成標(biāo)志。os_wait_allcore為通用實(shí)現(xiàn)接口,cpu_first_task_start同單核實(shí)現(xiàn)。
3.3 核間中斷接口
此部分需要完成三個(gè)接口的適配:
3.3.1初始化:void os_crosscore_int_init();
完成核間中斷的硬件初始化,此接口需要在多核初始化時(shí)調(diào)用。
3.3.2觸發(fā)接口:void cpu_signal(uint8_t cpu_num)
觸發(fā)目標(biāo)核對(duì)應(yīng)的中斷,需要完成內(nèi)部實(shí)現(xiàn)。
3.3.3 核間中斷處理:void os_crosscore_isr(void *arg)
接口內(nèi)部需要調(diào)用krhino_intrpt_exit接口,其通過(guò)cpu_intrpt_switch來(lái)實(shí)現(xiàn)當(dāng)前核的任務(wù)調(diào)度;如果需要清中斷源,則清中斷源。
3.4核間鎖接口
此部分需要完成三個(gè)必要接口的適配,:
3.4.1 初始化:void cpu_spin_lock_init(kspinlock_t *lock);
對(duì)鎖結(jié)構(gòu)體賦初值;用戶可以按照自身需求實(shí)現(xiàn),也可參考esp32實(shí)現(xiàn)代碼。
3.4.2 加解鎖:基本原則是支持核內(nèi)嵌套,核間互斥
void cpu_spin_lock(kspinlock_t *lock);
int32_t cpu_spin_unlock(kspinlock_t *lock);
鎖實(shí)現(xiàn)可以參考在esp32上對(duì)應(yīng)實(shí)現(xiàn)。

AliOS Things SMP系統(tǒng)及其在esp32上實(shí)現(xiàn)的示例分析

3.5 SMP目錄結(jié)構(gòu)
參考esp32,在platform/mcu/esp32下新建smp目錄。smp_port.h列出上述描述的需要移植的接口,smp_load.c為核加載實(shí)現(xiàn),smp_int.c為核間中斷實(shí)現(xiàn),smp_sync.c為核間同步接口實(shí)現(xiàn)。

AliOS Things SMP系統(tǒng)及其在esp32上實(shí)現(xiàn)的示例分析

將上述接口對(duì)接后,對(duì)應(yīng)文件加入編譯體系內(nèi),即可完成SMP移植適配。
3.6 其他注意事項(xiàng)
在實(shí)現(xiàn)任務(wù)和中斷切換匯編portXX.S時(shí),需要考慮到兼容單核和多核,主要是對(duì)于g_current_task等多核數(shù)組的訪問(wèn),可以參考esp32中portasm.S實(shí)現(xiàn)。

4、SMP相關(guān)內(nèi)核接口
多核SMP機(jī)制下,kernel兼容所有單核的對(duì)外接口,并提供必要的SMP擴(kuò)展接口供用戶使用。

AliOS Things SMP系統(tǒng)及其在esp32上實(shí)現(xiàn)的示例分析

上述接口將任務(wù)和核綁定,使其固定在某核運(yùn)行。如果使用非綁定接口,則任務(wù)運(yùn)行的核是隨機(jī)的。

5、esp32上SMP運(yùn)行示例
下圖為Alios Things在esp32上實(shí)現(xiàn)SMP的任務(wù)狀態(tài)圖:

AliOS Things SMP系統(tǒng)及其在esp32上實(shí)現(xiàn)的示例分析
Cpu_binded列表示任務(wù)是否綁定核,cpu_num表示任務(wù)當(dāng)前運(yùn)行核,cur_exc表示當(dāng)前任務(wù)運(yùn)行狀態(tài)。
Smp特性移植完成后,同樣需要通過(guò)內(nèi)核用例的測(cè)試認(rèn)證。

關(guān)于AliOS Things SMP系統(tǒng)及其在esp32上實(shí)現(xiàn)的示例分析問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI