您好,登錄后才能下訂單哦!
AliOS Things SMP系統及其在esp32上實現的示例分析,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
AliOS Things實現了基本的SMP調度框架,支持多CPU體系的系統運行和調度機制。任務可以動態在多核間進行切換或者綁定運行;高優先級任務可以最大化利用空閑資源核運行。基于此框架,可以快速實現AliOS Things在各種不同多核CPU架構下的移植。
AliOS Things實現了基本的SMP調度框架,支持多CPU體系的系統運行和調度機制。多CPU之間對用戶系統運行無區別,能平等訪問共享內存、外設等共享資源;任務可以動態在多核間進行切換或者綁定運行;高優先級任務可以最大化利用空閑資源核運行。
基于此框架,可以快速實現AliOS Things在各種不同多核CPU架構下的移植;對于上層應用,可以不需要關注任務的運行核以及底層實現,也可以指定某任務在特定核運行。此實現框架,最大化地提高SMP功能在不同CPU上的移植效率,并保證上層應用使用SMP系統的簡潔性。
1、 AliOS Things SMP基礎特性
特性1:多CPU公平的任務切換機制,平等訪問共享資源
特性2:高優先級任務合理利用空閑CPU資源
特性3:支持任務綁定核運行
特性4:支持不同CPU下快速移植
特性5:兼容單核接口并提供SMP內核擴展接口
2、 AliOS Things SMP特性移植框架
使用AliOS Things的SMP框架,可以快速在不同CPU體系下移植,以快速實現SMP功能。以下列出移植需要實現項,即可完成對應CPU的SMP功能:
2.1 核啟動加載
目前的啟動順序是,系統默認開始啟動0核,在0核的主任務入口內啟動其他核的加載,使其都進入任務調度,并完成多核啟動階段的同步工作:核進入idle任務作為核啟動完成的標志。
2.2 核間中斷
主要作用:觸發其他核進行調度。在任務加入ready任務隊列或者任務超時到期后,如果此任務綁定到其他核,或者比其他核正在執行的任務優先級高,則會觸發對應核進行任務切換。
2.3 核間鎖
由于多核之間的同步互斥問題,需要實現核間鎖功能,用于訪問共享資源,如任務隊列、內存等資源時,核內的資源互斥采用開關中斷來實現。目前任務相關的資源調度和內存管理分別采用兩把核間鎖,該鎖的實現必須支持核內的可重入性,而能達到核間互斥的目的。
以上功能需要在不同CPU/MCU架構下進行移植實現,即可完成SMP需要的底層接口支持。OS已經提供了標準的實現接口,參考下面esp32的SMP移植示例。
3、 Esp32上支持SMP移植示例
目前AliOS Things在esp32上完成了SMP的實現,后續將繼續支持其他多核CPU比如cortex-A9等系列的多核CPU。參考下面的移植描述點進行移植:
3.1 SMP編譯宏
對于某多核CPU,OS通過單版本不同編譯宏來同時支持單核和多核的框架。在Makefile中指定-DRHINO_CONFIG_CPU_NUM=X(核數目),或者修改k_config.h內RHINO_CONFIG_CPU_NUM宏來指定核數目。推薦第一種方式。
3.2 多核加載接口
按照2.1章節描述,系統的啟動順序為默認先啟動0核,在0核主任務內啟動其他從核并實現同步。
需要實現加載其他核接口:void os_load_slavecpu(void);
內部實現需要完成剩余核的復位啟動、必要硬件的初始化,并在從屬核初始化完后,同樣進入cpu_first_task_start開始進入調度;此階段,0核需要執行os_wait_allcore接口來等待所有核的啟動完成,以所有核都能進入idle任務為啟動完成標志。os_wait_allcore為通用實現接口,cpu_first_task_start同單核實現。
3.3 核間中斷接口
此部分需要完成三個接口的適配:
3.3.1初始化:void os_crosscore_int_init();
完成核間中斷的硬件初始化,此接口需要在多核初始化時調用。
3.3.2觸發接口:void cpu_signal(uint8_t cpu_num)
觸發目標核對應的中斷,需要完成內部實現。
3.3.3 核間中斷處理:void os_crosscore_isr(void *arg)
接口內部需要調用krhino_intrpt_exit接口,其通過cpu_intrpt_switch來實現當前核的任務調度;如果需要清中斷源,則清中斷源。
3.4核間鎖接口
此部分需要完成三個必要接口的適配,:
3.4.1 初始化:void cpu_spin_lock_init(kspinlock_t *lock);
對鎖結構體賦初值;用戶可以按照自身需求實現,也可參考esp32實現代碼。
3.4.2 加解鎖:基本原則是支持核內嵌套,核間互斥
void cpu_spin_lock(kspinlock_t *lock);
int32_t cpu_spin_unlock(kspinlock_t *lock);
鎖實現可以參考在esp32上對應實現。
3.5 SMP目錄結構
參考esp32,在platform/mcu/esp32下新建smp目錄。smp_port.h列出上述描述的需要移植的接口,smp_load.c為核加載實現,smp_int.c為核間中斷實現,smp_sync.c為核間同步接口實現。
將上述接口對接后,對應文件加入編譯體系內,即可完成SMP移植適配。
3.6 其他注意事項
在實現任務和中斷切換匯編portXX.S時,需要考慮到兼容單核和多核,主要是對于g_current_task等多核數組的訪問,可以參考esp32中portasm.S實現。
4、SMP相關內核接口
多核SMP機制下,kernel兼容所有單核的對外接口,并提供必要的SMP擴展接口供用戶使用。
上述接口將任務和核綁定,使其固定在某核運行。如果使用非綁定接口,則任務運行的核是隨機的。
5、esp32上SMP運行示例
下圖為Alios Things在esp32上實現SMP的任務狀態圖:
Cpu_binded列表示任務是否綁定核,cpu_num表示任務當前運行核,cur_exc表示當前任務運行狀態。
Smp特性移植完成后,同樣需要通過內核用例的測試認證。
關于AliOS Things SMP系統及其在esp32上實現的示例分析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。