打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于Tricore架构的RTThread多核实现
在《基于Hightec+TC375TP的RT-Thread移植详解》一文中,基于Tricore实现了单核RTThread的移植。最近,花了些时间完成遗留的任务:基于Tricore的多核移植。目前,多数项目中的单片机都具备多核,多核单片机似乎已经是项目的标配。如果搞汽车电子,不理解OS(Operating System),似乎感觉少了什么,就好像吃面不吃蒜的感觉。对于多核,又分为同构(homogeneous)多核和异构(heterogeneous)多核。
  • 同构(homogeneous)多核:单片机中,多个Core的结构相同,各个Core用的指令集相同。
  • 异构(heterogeneous)多核单片机中,多个Core的结构不同,不同的Core架构,使用不同的指令集。

本文基于TC397+Tasking实现SMP(Symmetric Multi-Processing,对称多处理),这里的多核属于同构多核。相对于SMP,AMP(Asymmetric Multi-Processing,非对称多处理)主要用于异构多核处理。

本文,主要记录RTThread多核实现过程中的"雷区"。

1、RTThread多核实现细节

(一)各Core实现硬件初始化

由于各个Core所使用的硬件资源不同,因此,各个Core在初始化时,需要实现对应的外设。eg:提供心跳的系统定时器(System Timer),本文Core1的外设初始化在Core1_init()中完成。从核除了初始化自身的硬件以外,还需要调用rt_system_scheduler_start()接口启动调度表,代码示意如下所示:

提示:上述代码中,从核(Core1)初始化了一个线程。当然,在主核(Core0)完成所有核的线程初始化也可以。

(二)任务初始化

在Tricore架构中,虽然不同Core使用的CSA(Context Save Areas)不同,但是,线程Thread(等同Task)的初始化可以在主核中完成,之后通过rt_thread_control()接口,为线程静态分配控制的Core,eg:分配Core1调度led_thread_thread线程,代码示意如下:

(三)线程间任务切换

如果不是systick触发的线程切换,即:由于线程状态挂起触发的线程切换时,需要判断线程是否上锁,如果已经解锁,则需要解锁之后在进行线程切换,避免死锁。多核rt_hw_context_switch()的接口实现如下所示:

(四)中断切换标志置位时机

每次程序进入系统心跳中断服务例程时,需要先置位中断切换标志Flag,完成系统心跳的累加后复位。注意:不同于单核处理,多核处理中,此处还需要对中断切换进行处理,即:判断程序是否超时,如果超时,则对应的pcpu->irq_switch_flag置位,需要进行中断线程切换处理。代码实现如下所示:

(五)线程上锁/解锁操作

上锁处理,对应代码实现如下所示:

解释:__cmpswapw((address), ((unsigned long)value), (condition) ),上锁处理时,如果address处的值==condition,则将value值赋写到address位置。在Tricore架构中,__cmpswapw操作是原子操作,可以避免多核的并行访问。

解锁处理,对应的代码实现如下所示:

注意:上锁/解锁必须成对出现。如上代码中,上锁/解锁处理中都有一个while操作,这也是为什么过多的spinlock会影响CPU效率的原因。
(六)主核(Core0)与从核(Core1)同步时机
主核(Core0)与从核(Core1同步时机可以选择在各自硬件初始化完成后进行,否则,从核可能会访问到空地址,进而进入Trap。完成同步后,主/从核进行线程操作,代码示意如下:

(七)空闲线程时间片设置
本文修改了空闲线程的默认时间片,由默认的32tick修改为10个tick,目的:保证调度的准确性。为什么这样改?暂时未细查,留给未来。

(八)确认线程是否在目标Core运行

如果想确认线程是否在目标Core运行,在目标线程设置一个断点(Breakpoint)即可,如下所示:

2、RTThread任务调度

本文Core0创建了一个主线程main_thread(周期:50ms),一个空闲线程idle[0];Core1创建了两个线程led_thread_thread(周期:20ms)、core1_thread_1(周期:30ms),以及一个空闲线程idle[1]。
(一)main_thread运行周期

(二)led_thread_thread运行周期

(三)core1_thread_1运行周期

提示:本文所有线程,静态创建。

2、源码链接

多核与单核的切换,在rtconfig.h文件中,使能或者关闭宏RT_USING_SMP即可打开/禁用SMP。

本文的RTThread中,启用了2个Core(主核Core0,一个从核Core1),如果需要启用更多的从核,可以在本文的基础上打开其余从核,其余从核的处理与Core1类似。

受限于时间和我的水平,本文在零零碎碎的时间里整理完,实现未必最优。而且,我并未严格的按照RTThread的架构处理,写的稍微有些随心所欲。大家可以基于我的工程进行调试和二次开发,以便于达到理解OS内核、任务切换等相关知识。

源码链接地址如下:

https://github.com/Kaixinguo2021/Tasking_TC397_MultiCore_RTThread.git

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
8代Core U系列也要凑热闹,全面升级4核8线程
基于 RISC 架构的Intel 8核528线程CPU
英特尔介绍Thread Director:硬件层面上让混合架构完美运行
关于RT-Thread的启动问题
RT
RT-thread内核原理_rtthread
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服