打印
[通用 MCU]

英飞凌TC397 FreeRTOS SMP多核移植

[复制链接]
42|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kxsi|  楼主 | 2024-11-30 15:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
前言
主要介绍在英飞凌多核平台TC397上进行FreeRTOS SMP的移植及使用。

一、英飞凌TC397介绍
英飞凌的AURIX系列的MCU在市场上的应用比较多,尤其是在汽车电子行业广泛应用。以下是对TC397的简单介绍:

6个CPU核的高性能微控制器
6个32位超标量体系结构的TriCore CPUs (TC1.6.2P),具有以下特性:
——超高的实时性能

——强大的位处理能力

——超强集成DSP能力

——乘法累加(Multiply Accumulate)单元,每周期可维持2次MAC(Multiply Accumulate)操作

——完全流水线的浮点运算单元(Floating point unit-FPU)

——在温度范围内最高支持300MHz操作

——Data Scratch-Pad RAM (DSPR)最高支持240/96K字节

——Instruction Scratch-Pad RAM (PSPR)最高支持64K字节

——Data RAM (DLMU)最高支持64K字节

——32K字节的指令缓存(Instruction Cache-ICACHE)

——16K字节的数据缓存(Data Cache-DCACHE)

二、FreeRTOS介绍
1.什么是FreeRTOS
FreeRTOS是指小型实时操作系统内核。作为一个轻量级的操作系统,其功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。

2.FreeRTOS SMP
在FreeRTOS 11.0版本映引入了SMP支持。

SMP 并入主线:  虽然 FreeRTOS 在 2017 年引入了非对称
  多处理(AMP)支持,而 FreeRTOS 11.0.0 版则是第一个将对称多处理(SMP)支持并入主线的版本。
  首次将对称多处理(SMP)支持并入主线
  版本中。SMP 可让 FreeRTOS 内核的一个实例在多个相同的处理器内核之间调度任务
  在多个相同的处理器内核上调度任务。 我们感谢 XMOS 的 Mike Bruno 和 Jerry
  McCarthy 以及 Espressif Systems 的 Darian Liang、Sudeep Mohanty 和 Zim Kalinowski 所做的贡献。
  Espressif Systems 的 Darian Liang、Sudeep Mohanty 和 Zim Kalinowski 所做的贡献。
+ 将 MISRA 合规性检查从 PC Lint 切换到 Coverity,并将 MISRA C:2004 更新为 MISRA C:2004。
  MISRA C:2004 更新至 MISRA C:2012。
+ 添加 FreeRTOSConfig.h 模板,其中包含对每个配置项的简短解释。
  每个配置项的简短解释。应用程序编写者可以使用此模板作为
  作为起点,为其应用程序创建 FreeRTOSConfig.h 文件。
+ 添加一个 FreeRTOS port 模板,作为开发新的 FreeRTOS port 的起点。
  开发新的 FreeRTOS 移植的起点。

二、TC397 FreeRTOS SMP移植
1.多核接口移植



2.调度移植



void vPortReclaimCSA (unsigned long *pxTCB)
{
    unsigned long pxHeadCSA, pxTailCSA, pxFreeCSA;
    unsigned long *pulNextCSA;

    /* A pointer to the first CSA in the list of CSAs consumed by the task is
     stored in the first element of the tasks TCB structure (where the stack
     pointer would be on a traditional stack based architecture). */
    pxHeadCSA = (*pxTCB) & portCSA_FCX_MASK;

    /* Mask off everything in the CSA link field other than the address.  If
     the        address is NULL, then the CSA is not linking anywhere and there is
     nothing        to do. */
    pxTailCSA = pxHeadCSA;

    /* Convert the link value to contain just a raw address and store this
     in a local variable. */
    pulNextCSA = portCSA_TO_ADDRESS(pxTailCSA);

    /* Iterate over the CSAs that were consumed as part of the task.  The
     first field in the CSA is the pointer to then next CSA.  Mask off
     everything in the pointer to the next CSA, other than the link address.
     If this is NULL, then the CSA currently being pointed to is the last in
     the chain. */
    while (0UL != (pulNextCSA[0] & portCSA_FCX_MASK))
    {
        /* Clear all bits of the pointer to the next in the chain, other
         than the address bits themselves. */
        pulNextCSA[0] = pulNextCSA[0] & portCSA_FCX_MASK;

        /* Move the pointer to point to the next CSA in the list. */
        pxTailCSA = pulNextCSA[0];

        /* Update the local pointer to the CSA. */
        pulNextCSA = portCSA_TO_ADDRESS(pxTailCSA);
    }

    __disable();
    {
        /* Look up the current free CSA head. */
        __dsync();
        pxFreeCSA = __mfcr( CPU_FCX);

        /* Join the current Free onto the Tail of what is being reclaimed. */
        portCSA_TO_ADDRESS( pxTailCSA )[0] = pxFreeCSA;

        /* Move the head of the reclaimed into the Free. */
        __dsync();
        __mtcr( CPU_FCX, pxHeadCSA);
        __isync();
    }
    __enable();
}

3.多核任务创建
    xTaskCreateAffinitySet(TaskLed0Blink, "Led0 Blink", 256, NULL, 10, 1 << 0, NULL);
    xTaskCreateAffinitySet(TaskLed1Blink, "Led1 Blink", 256, NULL, 10, 1 << 1, NULL);
    xTaskCreateAffinitySet(TaskLed2Blink, "Led2 Blink", 256, NULL, 10, 1 << 2, NULL);
    xTaskCreateAffinitySet(TaskLed3Blink, "Led3 Blink", 256, NULL, 10, 1 << 3, NULL);
    vTaskStartScheduler();
总结
在TC397多核平台使用FreeRTOS SMP可以方便的进行多核任务创建,进行多核任务的管理。使用一份FreeRTOS副本即可进行多核的任务管理。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/hello_hellohaha/article/details/143647707

20130517102516207.jpg (112.37 KB )

20130517102516207.jpg

20130517102304589.jpg (50.36 KB )

20130517102304589.jpg

20161105142145111.jpg (58.26 KB )

20161105142145111.jpg

7503660e3f286ebb47.png (19 KB )

7503660e3f286ebb47.png

9850460e3f29524551.png (19 KB )

9850460e3f29524551.png

使用特权

评论回复
沙发
suncat0504| | 2024-12-2 14:41 | 只看该作者
移植过程繁琐吗?

使用特权

评论回复
板凳
suncat0504| | 2024-12-2 14:42 | 只看该作者
在温度范围内最高支持300MHz操作,厉害

使用特权

评论回复
地板
申小林一号| | 2024-12-2 15:13 | 只看该作者
学习一下

使用特权

评论回复
5
kzlzqi| | 2024-12-2 15:31 | 只看该作者
英飞凌TC397是英飞凌AURIX系列微控制器中的一款高性能芯片,广泛应用于汽车电子、工业控制和其他对实时性要求高的嵌入式系统中。TC397采用了TriCore架构,具备超强的计算能力和高度的集成性,适合用于多核实时计算任务。

使用特权

评论回复
6
kzlzqi| | 2024-12-2 15:31 | 只看该作者
6个32位的TriCore CPU核(TC1.6.2P),支持多核并行处理。
超高实时性能:每个CPU核均具备强大的计算能力和处理速度。
强大的浮点运算和DSP能力:具备多个乘法累加(MAC)单元,并支持高效的浮点和定点运算。
大容量内存:
Data Scratch-Pad RAM (DSPR) 支持最高240/96K字节
Instruction Scratch-Pad RAM (PSPR) 支持最高64K字节
Data RAM (DLMU) 支持最高64K字节
32K字节指令缓存、16K字节数据缓存
高达300 MHz的主频,适合处理复杂的计算和实时任务。

使用特权

评论回复
7
kzlzqi| | 2024-12-2 15:31 | 只看该作者
FreeRTOS是一个开源的实时操作系统,为嵌入式系统提供了多任务管理、内存管理、定时器、信号量、消息队列、事件标志等基本实时功能。它小巧、轻便,适用于资源受限的嵌入式平台。由于其高效和易于移植的特性,FreeRTOS被广泛应用于工业、消费电子、汽车电子等多个领域。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

45

主题

3310

帖子

2

粉丝