一、介绍
本文主要通过创建一个LED任务,并将该任务绑定至不同的核上,验证多核调度的任务分配。
二、实验
(1)初始化LED管脚
#define LED0 &MODULE_P13,3
void LED0_Init(void)
{
/* Initialize GPIO pins for LEDs */
IfxPort_setPinMode(LED0, IfxPort_Mode_outputPushPullGeneral);
IfxPort_setPinState(LED0, IfxPort_State_high);
}
void LED0_Blink(void)
{
IfxPort_togglePin(LED0);
}
(2)创建LED任务,并将LED Blink任务绑定到CORE0上
void task_led0_blink(void* pvParameters)
{
while (1)
{
LED0_Blink();
vTaskDelay(500);
}
}
void APP_LedTask(void)
{
xTaskCreateAffinitySet(task_led0_blink, "led0_blink", 512, NULL, 10, 1 << 0, NULL);
}
创建任务使用的是
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上运行,请将 uxCoreAffinityMask 设置为 0x01。
(3)启动调度器
APP_LedTask();
vTaskStartScheduler();
(4)仿真调试
在仿真中,在void task_led0_blink(void* pvParameters)中打上断点,运行到断点处时
显示在core0上运行
(5)将task_led0_blink任务绑定到CORE1上
void task_led0_blink(void* pvParameters)
{
while (1)
{
LED0_Blink();
vTaskDelay(500);
}
}
void APP_LedTask(void)
{
xTaskCreateAffinitySet(task_led0_blink, "led0_blink", 512, NULL, 10, 1 << 1, NULL);
}
启动debug调试,通过断点观察
运行到断点处时,显示 task_led0_blink在core1上运行。
(6)实验结论
通过以上实验初步验证将任务绑定到指定core的运行的可能。