TC397 FreeRTOS SMP多核开发(一):FreeRTOS SMP介绍

一、TC397 多核介绍

  • AURIX TC3xx微控制器架构具有多达6个独立的处理器内核CPU0…CPU5, 可在一个统一平台上无缝托管多个应用程序和操作系统.
  • 由于实现了具有独立读取接口的多个程序Flash模块, 该架构支持进一步的实时处理.
  • AURIX专为性能,安全性和安全性而设计,具有并行执行流程,锁步核心和进一步增强的硬件安全机制的功能

二、FreeRTOS SMP介绍

FreeRTOS SMP是FreeRTOS为了适应多核MCU的开发而推出的SMP对称多核调度方式,一般应用在具有相同架构的对称多核上,通过统一的调度管理来实现多核的调度。

FreeRTOS 内核中的 SMP 支持可使一个 FreeRTOS内核实例在多个相同的处理器内核上调度任务。 这些内核架构必须相同,并共享相同的内存。

FreeRTOS SMP多核代码位于github上的

FreeRTOS/FreeRTOS-Kernel at smp (github.com)icon-default.png?t=N7T8https://github.com/FreeRTOS/FreeRTOS-Kernel/tree/smp本专栏主要通过移植FreeRTOS SMP来实现TC397的多核调度 。

三、FreeRTOS SMP与FreeRTOS的区别

FreeRTOS API 单核和 SMP 版本之间基本上保持相同,除了以下SMP中特定的API。因此,为尽量减少或不增加任何工作量,应同时编译 FreeRTOS 单核 与 SMP 版本。但是, 一些适用于单核应用的设计假设可能不适用于多核应用, 因此可能会存在一些功能问题。

(1)SMP 特定 API

以下附加 API 可用于 FreeRTOS-SMP 内核:

xTaskCreateAffinitySet
BaseType_t xTaskCreateAffinitySet( TaskFunction_t pxTaskCode,
                                    const char * const pcName,
                                    const configSTACK_DEPTH_TYPE usStackDepth,
                                    void * const pvParameters,
                                    UBaseType_t uxPriority,
                                    UBaseType_t uxCoreAffinityMask,
                                    TaskHandle_t * const pxCreatedTask );

此函数是 xTaskCreate 的扩展, 用于创建一个带有关联掩码的新任务,并将其添加到准备运行的任务列表中。 configUSE_CORE_AFFINITY 必须定义为 1,才可使用此函数。

参数:

  • uxCoreAffinityMask - 一个按位值,指示可以 运行任务的内核。内核编号从 0 到 (configNUMBER_OF_CORES - 1)。例如, 为确保任务能在内核 0 和内核 1 上运行,请将 uxCoreAffinityMask 设置为 0x03。

xTaskCreateStaticAffinitySet
TaskHandle_t xTaskCreateStaticAffinitySet( TaskFunction_t pxTaskCode,
                                           const char * const pcName,
                                           const uint32_t ulStackDepth,
                                           void * const pvParameters,
                                           UBaseType_t uxPriority,
                                           StackType_t * const puxStackBuffer,
                                           StaticTask_t * const pxTaskBuffer,
                                           UBaseType_t uxCoreAffinityMask );

此函数是 xTaskCreateStatic 的扩展, 用于创建一个带有关联掩码的新任务,并将其添加到准备运行的任务列表中。 configUSE_CORE_AFFINITY 必须定义为 1,才可使用此函数。

参数:

  • uxCoreAffinityMask - 一个按位值,指示可以 运行任务的内核。内核编号从 0 到 (configNUMBER_OF_CORES - 1)。例如, 可以在内核 0 和内核 1 上运行,请将 uxCoreAffinityMask 设置

vTaskCoreAffinitySet
void vTaskCoreAffinitySet( const TaskHandle_t xTask, UBaseType_t uxCoreAffinityMask ); 

configUSE_CORE_AFFINITY 必须定义为 1,才可使用此函数。

设置任务的内核关联掩码,即可以运行任务的内核

参数:

  • xTask:内核关联掩码所要执行任务的句柄。传递 NULL 将为 调用任务设置内核关联掩码。

  • uxCoreAffinityMask - 一个按位值,指示可以 运行任务的内核。内核的编号范围为 0 到 (configNUMBER_OF_CORES - 1)。例如,为确保任务 可以在内核 0 和内核 1 上运行,请将 uxCoreAffinityMask 设置 为 0x03

用法示例:

/* The function that creates task. */
void vAFunction( void )
{
TaskHandle_t xHandle;
UBaseType_t uxCoreAffinityMask;

    /* Create a task, storing the handle. */
    xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &( xHandle ) );

    /* Define the core affinity mask such that this task can only run on core 0
     * and core 2. */
    uxCoreAffinityMask = ( ( 1 << 0 ) | ( 1 << 2 ) );

    /* Set the core affinity mask for the task. */
    vTaskCoreAffinitySet( xHandle, uxCoreAffinityMask );
}
 vTaskCoreAffinityGet
UBaseType_t vTaskCoreAffinityGet( const TaskHandle_t xTask ); 

configUSE_CORE_AFFINITY 必须定义为 1,才可使用此函数。

设置任务的内核关联掩码,即可以运行任务的内核。

参数:

  • xTask:内核关联掩码所要执行任务的句柄。传递 NULL 将为 调用任务设置内核关联掩码。

返回:

  • 内核关联掩码,指示可以 运行任务的内核的按位值。内核编号从 0 到 (configNUMBER_OF_CORES - 1)。 例如,如果任务可以在内核 0 和内核 1 上运行,则内核关联掩码 为 0x03

用法示例:

/* Task handle of the networking task - it is populated elsewhere. */
TaskHandle_t xNetworkingTaskHandle;

void vAFunction( void )
{
TaskHandle_t xHandle;
UBaseType_t uxNetworkingCoreAffinityMask;

    /* Create a task, storing the handle. */
    xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &( xHandle ) );

    /* Get the core affinity mask for the networking task. */
    uxNetworkingCoreAffinityMask = vTaskCoreAffinityGet( xNetworkingTaskHandle );

    /* Here is a hypothetical scenario, just for the example. Assume that we
     * have 2 cores - Core 0 and core 1. We want to pin the application task to
     * the core that is not the networking task core to ensure that the
     * application task does not interfere with networking. */
    if( ( uxNetworkingCoreAffinityMask & ( 1 << 0 ) ) != 0 )
    {
        /* The networking task can run on core 0, pin our task to core 1. */
        vTaskCoreAffinitySet( xHandle, ( 1 << 1 ) );
    }
    else
    {
        /* Otherwise, pin our task to core 0. */
        vTaskCoreAffinitySet( xHandle, ( 1 << 0 ) );
    }
}

(2)SMP 特定配置选项

以下附加配置选项可用于 FreeRTOS-SMP 内核:

configNUMBER_OF_CORES

设置可用的处理器内核数。

configRUN_MULTIPLE_PRIORITIES

在单核 FreeRTOS 应用程序中, 如果存在能够运行的较高优先级任务,则较低优先级任务永远不会运行。 在 SMP FreeRTOS应用程序中, RTOS 内核将运行与可用内核数量一样多的任务,在一个内核上运行优先级较低的任务的同时, 较高优先级的任务可能同时 在另一个内核上运行。 如果您的应用程序或库 为单核环境编写,并且因此对任务执行的顺序做出假设, 这可能会导致问题。 因此,提供 configRUN_MULTIPLE_PRIORITIES 来 控制此行为。

如果 configRUN_MULTIPLE_PRIORITIES 定义 0,则多个任务 只有在具有相同优先级时才能同时运行, 保持这样的范例:如果存在能够运行的较高优先级任务,则较低优先级任务永远不会运行。 如果 configRUN_MULTIPLE_PRIORITIES 定义 1, 则具有不同优先级的多个任务可以同时运行,因此,较高和较低优先级的任务可以同时 在不同的内核上运行。

configUSE_CORE_AFFINITY

应用程序编写者可以控制任务在哪些内核上运行。 如果 configUSE_CORE_AFFINITY 定义为 1,则 vTaskCoreAffinitySet 可 控制任务在哪些内核上运行,vTaskCoreAffinityGet 可 用于查询任务在哪些内核上运行。 如果 configUSE_CORE_AFFINITY 为 0, 则 FreeRTOS 调度器可以在任何可用内核上自由运行任何任务。

configUSE_TASK_PREEMPTION_DISABLE

在单核 FreeRTOS 应用程序中,可以将 FreeRTOS 调度器配置为 抢占式或合作式——请参阅 configUSE_PREEMPTION 的定义。 在 SMP FreeRTOS 应用程序中,如果 configUSE_TASK_PREEMPTION_DISABLE 定义为 1, 则可使用 vTaskPreemptionDisable 和 vTaskPreemptionEnable API 函数将单个任务设置为抢占式或协作式。

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
tc397实现smp(对称多处理)的FreeRTOS需要进行以下步骤: 1. 首先,了解TC397处理器的架构和特性。TC397是一种多核处理器,每个核心都可以独立运行任务并拥有自己的寄存器组和内存。因此,需要使用这些特性来设置和管理多核心的任务。 2. 在FreeRTOS的代码中,需要添加对TC397多处理器架构的支持。这可能需要对任务调度和内核抽象层进行一些修改和扩展,以便支持多核心并使用TC397的特性。 3. 针对TC397处理器的特性,可以使用FreeRTOS提供的任务通信机制来实现核间通信。这可以使用FreeRTOS提供的队列、信号量、互斥量等等。 4. 为了实现SMP,需要将需要运行在多个核心上的任务进行分配和调度。可以使用FreeRTOS的任务调度器来对任务进行调度,并确保它们在合适的核心上运行。 5. 同时,还需要考虑任务之间的并发和共享资源的同步。可以使用FreeRTOS提供的锁机制来实现对共享资源的互斥访问,以避免数据竞争和冲突。 6. 最后,需要对系统的性能进行优化和调优。这可以通过合理地分配任务和资源,并使用TC397处理器的特性来实现。 综上所述,tc397实现SMPFreeRTOS需要了解并利用TC397处理器的特性,对FreeRTOS代码进行修改和扩展,并使用FreeRTOS提供的任务通信和同步机制来实现多核心任务的调度和管理。通过合理的任务分配和优化,可以实现高性能的SMP系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huskiey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值