前言
主要介绍在英飞凌多核平台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
|