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
    +关注

    关注

    31

    文章

    1149

    浏览量

    38900

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

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

收藏 人收藏

    评论

    相关推荐

    risc-v多核芯片在AI方面的应用

    RISC-V多核芯片在AI方面的应用主要体现在其低功耗、低成本、灵活可扩展以及能够更好地适应AI算法的不同需求等特点上。 首先,RISC-V适合用于高效设计实现,其内核面积更小,功耗更低,使得它能
    发表于 04-28 09:20

    多核架构高性能电机控制芯片

    基于传统单核架构的电机控制芯片已无法应对新出现的严峻挑战,多核架构的控制芯片应运而生。双核架构芯片已在许多领域成功应用,并显示出其独特的优势,可以利用无传感器技术
    的头像 发表于 04-19 14:46 1306次阅读
    <b class='flag-5'>多核</b><b class='flag-5'>架构</b>高性能电机控制芯片

    DAS能显示TriCore,UDE或Memtool无法连接的原因?

    打开DAS Device Scanner,列表里显示了TriCore-Family(点击其右边的Start Client,显示DAS Error:DEVICE_LOCKED),用UDE或Memtool连接却提示Can\'t connect target。大家有知道为什么吗
    发表于 02-19 07:19

    hightec新建工程的向导页面没有TriCore板可选,是否安装失败了?

    hightec新建工程的向导页面没有TriCore板可选,是否安装失败了(已添加license)
    发表于 02-06 07:05

    “tc1.3”编译报错不允许使用向量表编号TriCore™怎么解决?

    “tc1.3” TriCore™ 不允许使用矢量表编号
    发表于 01-22 08:33

    在linux下搭建rtthread_qemu系统

    RT-Thread源码的获取方式有多种,可以是官网浏览器下载、云盘下载、git获取,强烈推荐git,因为使用git可以很方便的切换各种版本的rtthread
    的头像 发表于 11-21 14:40 595次阅读
    在linux下搭建<b class='flag-5'>rtthread</b>_qemu系统

    AUTOSAR架构下的多核通信介绍

    随着汽车ECU迅速的往域控制器方向发展,ECU要处理的任务越来越多,单核CPU的负载越来越大,多核ECU势在必行。AUTOSAR架构下OS支持多核处理,本系列文章将详细介绍AUTOSAR架构
    的头像 发表于 11-13 09:24 789次阅读
    AUTOSAR<b class='flag-5'>架构</b>下的<b class='flag-5'>多核</b>通信介绍

    基于Tricore芯片的AUTOSAR架构下的多核Shutdown介绍

    当ECU满足休眠条件时,根据ECU的硬件设计会走Sleep或者Shutdown的过程。
    的头像 发表于 11-06 09:09 1126次阅读
    基于<b class='flag-5'>Tricore</b>芯片的AUTOSAR<b class='flag-5'>架构</b>下的<b class='flag-5'>多核</b>Shutdown介绍

    基于Tricore芯片的AUTOSAR架构下的多核启动

    随着汽车ECU迅速的往域控制器方向发展,ECU要出来任务越来越多,单核CPU的负载越来越大,多核ECU势在必行。AUTOSAR架构下OS支持多核处理,本系列文章将详细介绍AUTOSAR架构
    的头像 发表于 10-23 10:15 1219次阅读
    基于<b class='flag-5'>Tricore</b>芯片的AUTOSAR<b class='flag-5'>架构</b>下的<b class='flag-5'>多核</b>启动

    FreeRTOS内核实现与应用开发实战指南

    本书是野火嵌入式教学丛书“RTOS 内核实现与应用开发实战指南的”FreeRTOS 版本,其中机械工业出版社出版的《RT-Thread 内核实现与应用开发实战指南—基于 STM32》是该书的姐妹篇
    发表于 09-28 08:05

    英飞凌AURIX TC297微控制器简介

    AURIX™是英飞凌全新的微控制器系列。其创新的多核架构基于多达三个独立的32位TriCore CPU,旨在满足最高安全标准,同时显著提高性能。TC29xTX系列具有高达300 MHz的Triple
    发表于 09-19 10:03 620次阅读
    英飞凌AURIX TC297微控制器简介

    Linux内核实现内存管理的基本概念

    本文概述Linux内核实现内存管理的基本概念,在了解基本概念后,逐步展开介绍实现内存管理的相关技术,后面会分多篇进行介绍。
    发表于 06-23 11:56 523次阅读
    Linux内<b class='flag-5'>核实现</b>内存管理的基本概念

    中国首颗ARM+RISC-V异构多核MCU伴随IAR在上海国际嵌入式展亮相

    ARM+RISC-V异构多核MCU硬件平台。“嵌入式多核系统可分为同构多核和异构多核,航顺芯片HK32U3009采用ARM+RISC-V异构多核
    发表于 06-15 18:32

    在 IAR Embedded Workbench中进行ARM+RISC-V多核调试

    在之前的文章中,我们介绍了如何在IAR Embedded Workbench for Arm中进行多核调试,其中所有的CPU内核都是基于ARM架构。近些年来,随着RISC-V的兴起,不少芯片集成
    发表于 06-14 16:55

    多核CPU的SoC缓存一致性设计概述

    玄铁C910处理器是同构多核架构,支持双核;(开源版本为双核,预留四核接口),主要特征有。
    的头像 发表于 06-08 15:58 732次阅读
    <b class='flag-5'>多核</b>CPU的SoC缓存一致性设计概述