赞
踩
FreeRTOS SMP是FreeRTOS为了适应多核MCU的开发而推出的SMP对称多核调度方式,一般应用在具有相同架构的对称多核上,通过统一的调度管理来实现多核的调度。
FreeRTOS 内核中的 SMP 支持可使一个 FreeRTOS内核实例在多个相同的处理器内核上调度任务。 这些内核架构必须相同,并共享相同的内存。
FreeRTOS SMP多核代码位于github上的
FreeRTOS/FreeRTOS-Kernel at smp (github.com)https://github.com/FreeRTOS/FreeRTOS-Kernel/tree/smp本专栏主要通过移植FreeRTOS SMP来实现TC397的多核调度 。
FreeRTOS API 单核和 SMP 版本之间基本上保持相同,除了以下SMP中特定的API。因此,为尽量减少或不增加任何工作量,应同时编译 FreeRTOS 单核 与 SMP 版本。但是, 一些适用于单核应用的设计假设可能不适用于多核应用, 因此可能会存在一些功能问题。
以下附加 API 可用于 FreeRTOS-SMP 内核:
- 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。
- 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 设置
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 );
- }
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 ) );
- }
- }
以下附加配置选项可用于 FreeRTOS-SMP 内核:
设置可用的处理器内核数。
在单核 FreeRTOS 应用程序中, 如果存在能够运行的较高优先级任务,则较低优先级任务永远不会运行。 在 SMP FreeRTOS应用程序中, RTOS 内核将运行与可用内核数量一样多的任务,在一个内核上运行优先级较低的任务的同时, 较高优先级的任务可能同时 在另一个内核上运行。 如果您的应用程序或库 为单核环境编写,并且因此对任务执行的顺序做出假设, 这可能会导致问题。 因此,提供 configRUN_MULTIPLE_PRIORITIES 来 控制此行为。
如果 configRUN_MULTIPLE_PRIORITIES
定义 0
,则多个任务 只有在具有相同优先级时才能同时运行, 保持这样的范例:如果存在能够运行的较高优先级任务,则较低优先级任务永远不会运行。 如果 configRUN_MULTIPLE_PRIORITIES
定义 1
, 则具有不同优先级的多个任务可以同时运行,因此,较高和较低优先级的任务可以同时 在不同的内核上运行。
应用程序编写者可以控制任务在哪些内核上运行。 如果 configUSE_CORE_AFFINITY
定义为 1
,则 vTaskCoreAffinitySet
可 控制任务在哪些内核上运行,vTaskCoreAffinityGet
可 用于查询任务在哪些内核上运行。 如果 configUSE_CORE_AFFINITY
为 0, 则 FreeRTOS 调度器可以在任何可用内核上自由运行任何任务。
在单核 FreeRTOS 应用程序中,可以将 FreeRTOS 调度器配置为 抢占式或合作式——请参阅 configUSE_PREEMPTION 的定义。 在 SMP FreeRTOS 应用程序中,如果 configUSE_TASK_PREEMPTION_DISABLE
定义为 1
, 则可使用 vTaskPreemptionDisable
和 vTaskPreemptionEnable
API 函数将单个任务设置为抢占式或协作式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。