AliOS Things SMP系統及其在esp32上實現示例

摘要: AliOS Things實現了基本的SMP調度框架,支持多CPU體系的系統運行和調度機制。任務能夠動態在多核間進行切換或者綁定運行;高優先級任務能夠最大化利用空閒資源核運行。基於此框架,能夠快速實現AliOS Things在各類不一樣多核CPU架構下的移植。ios

AliOS Things實現了基本的SMP調度框架,支持多CPU體系的系統運行和調度機制。多CPU之間對用戶系統運行無區別,能平等訪問共享內存、外設等共享資源;任務能夠動態在多核間進行切換或者綁定運行;高優先級任務能夠最大化利用空閒資源核運行。git


基於此框架,能夠快速實現AliOS Things在各類不一樣多核CPU架構下的移植;對於上層應用,能夠不須要關注任務的運行核以及底層實現,也能夠指定某任務在特定核運行。此實現框架,最大化地提升SMP功能在不一樣CPU上的移植效率,並保證上層應用使用SMP系統的簡潔性。
 github

一、 AliOS Things SMP基礎特性數組


特性1:多CPU公平的任務切換機制,平等訪問共享資源
特性2:高優先級任務合理利用空閒CPU資源
特性3:支持任務綁定核運行
特性4:支持不一樣CPU下快速移植
特性5:兼容單核接口並提供SMP內核擴展接口架構

二、 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移植示例。測試

三、 Esp32上支持SMP移植示例ui


目前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上對應實現。orm

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實現。

四、SMP相關內核接口
多核SMP機制下,kernel兼容全部單核的對外接口,並提供必要的SMP擴展接口供用戶使用。

上述接口將任務和核綁定,使其固定在某核運行。若是使用非綁定接口,則任務運行的核是隨機的。

五、esp32上SMP運行示例
下圖爲Alios Things在esp32上實現SMP的任務狀態圖:


Cpu_binded列表示任務是否綁定核,cpu_num表示任務當前運行核,cur_exc表示當前任務運行狀態。
Smp特性移植完成後,一樣須要經過內核用例的測試認證。kernel測試認證請參考:https://github.com/alibaba/AliOS-Things/wiki/Manual-API

原文連接

相關文章
相關標籤/搜索