摘要: 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