0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Tricore架构的RTThread多核实现

RTThread物联网操作系统 ? 来源:未知 ? 2023-09-12 18:40 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在《基于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

往期精彩回顾




Autosar往期精彩文章汇总:1~70
Autosar往期精彩文章汇总:71~100
Autosar往期精彩文章汇总:101~150

Autosar往期精彩文章汇总:151~200

Autosar往期精彩文章汇总:201~251

CAN通信:Busoff问题知多少

NVM基础:解读"切页"的头部信息

诊断基础:Event内存管理

Autosar通信模块COM:Update-Bits详解

Lin总线基础:为什么Master节点需要外接上拉电阻


点击下方关注,一起聊聊Autosar/嵌入式,如果需要,联系作者进群,给你更专业的解答


———————End——————



点击阅读原文报名


原文标题:基于Tricore架构的RTThread多核实现

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    32

    文章

    1427

    浏览量

    42174

原文标题:基于Tricore架构的RTThread多核实现

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    TC3XX /TC1.6.2OCDS如何通过软件启用核心调试控制器?

    如何通过软件启用核心调试控制器?也就是说可以通过软件读取DBGSR.DE =1。参考TriCore? TM TC1.6.2 核心架构手册第 1 卷。
    发表于 07-30 06:27

    移植rtthread_NANO之后SPI通讯不了怎么解决?

    1、我的裸板程序是一个SPI例程,没有移植rtthread_NANO之前SPI值正常的; 2、按照官方MDK的方法移植了rtthread_NANO之后,什么都没有增加,就是移植完了就不正常; 3
    发表于 07-24 06:41

    rtthread studio的编辑器如何开启自动换行功能?

    rtthread studio的编辑器如何开启自动换行功能?
    发表于 06-13 08:16

    Art-Pi2的BootLoader用rtthread有什么特殊的作用吗?

    我的基础不太好,在创建artpi2的bootloader的例程的时候发现bootloader编译完好像不小,然后发现bootloader里面也用上了rtthread的系统,不太明白这里使用rtthread有没有什么特殊的作用。
    发表于 05-27 06:08

    热成像仪为何都在疯狂卷多核处理器?“多核大战”背后的真相你知道吗?

    热成像仪进入“多核”时代,这不是噱头,而是需求在变。 从黑夜中识别生命体,到复杂地形中实现热源追踪,过去主要用于军事和工业的热成像仪,如今正越来越多地进入民用市场。而随着使用场景的复杂化,“看得见
    的头像 发表于 04-27 15:41 ?292次阅读

    三种蓝牙架构实现方案(蓝牙协议栈方案)

    蓝牙架构实现方案有哪几种?我们一般把整个蓝牙实现方案叫做蓝牙协议栈,因此这个问题也可以这么阐述:蓝牙协议栈有哪些具体的架构方案?在蓝牙协议栈中,host是什么?controller是什
    的头像 发表于 04-08 15:35 ?761次阅读
    三种蓝牙<b class='flag-5'>架构</b><b class='flag-5'>实现</b>方案(蓝牙协议栈方案)

    【迅为电子】10路UART、1TOPS的NPU、2路网口、异构多核架构、超高性价比!RK3562核心板强烈推荐

    【迅为电子】10路UART、1TOPS的NPU、2路网口、异构多核架构、超高性价比!RK3562核心板强烈推荐
    的头像 发表于 03-27 11:04 ?581次阅读
    【迅为电子】10路UART、1TOPS的NPU、2路网口、异构<b class='flag-5'>多核</b><b class='flag-5'>架构</b>、超高性价比!RK3562核心板强烈推荐

    请问移植rtthread nano版时官网里面系统时钟函数在哪里实现的?

    我在已有的华大HC32开发板的LED例程里我找不到官网移植教程里的这三个函数,文档也没说明这三个函数的移植步骤?到底在哪里找的?是rtthread里的实现还是需要用户自己找函数实现
    发表于 03-10 06:16

    QorIQ?T1042多核处理器

    QorIQ?T1042多核处理器T1042 QorIQ高级多核处理器综合了数据网络、电信/数据通讯、无线网络基础设施和国防军事/航天工程应用所需要的性能卓越数据线路加速及网络和外围总线接口
    发表于 01-10 08:48

    TMS320F2837xD双核实时微控制器技术参考手册

    电子发烧友网站提供《TMS320F2837xD双核实时微控制器技术参考手册.pdf》资料免费下载
    发表于 11-08 14:10 ?37次下载
    TMS320F2837xD双<b class='flag-5'>核实</b>时微控制器技术参考手册

    rtthread支持nandflash挂载fatfs文件系统吗?

    rtthread支持nandflash挂载fatfs文件系统吗
    发表于 09-27 09:45

    如何更新rtthread studio自带的默认库?

    我用rtthread studio创建了一个RTThread工程后,再用STM32CubeMAX配置外设,并生成代码。但我发现工程使用的HAL库并不是STM32CubeMAX提供的库,而是
    发表于 09-27 07:02

    rtthread5.0.2使用时仅使能外部rtc,会遇到获取时间一直不变的现象,为什么?

    rtthread5.0.2使用时仅使能外部rtc,在使用上会遇到获取时间(gettimeofday)一直不变的现象 rtthread5的框架有所变化,其中c库中gettimeofday等函数的实现
    发表于 09-26 06:36

    请问AURIX TC3xx tricore架构下浮点运算和将浮点数小数点去掉变成整数来计算哪种方式更加节省算力?

    AURIX TC3xx tricore架构下浮点运算和将浮点数小数点去掉变成整数来计算哪种方式更加节省算力? 比如一个浮点数12.89V,如果将其写成12890mV,再参与计算,哪种方式更加节省算力
    发表于 08-26 06:54

    多核CPU的优势是什么

    多核CPU(Central Processing Unit,中央处理器)作为现代计算机技术的重要里程碑,其优势在于显著提升了计算性能、多任务处理能力、系统稳定性以及能效比等多个方面。以下将详细阐述多核CPU的几大优势,并结合相关数据和背景进行说明。
    的头像 发表于 08-22 14:30 ?5537次阅读