1,在有些M4 单片机中,存在多核cpu,那么我们如何绑定需要用到的cpu呢,M4有4个core,core0-core3。
在freertos_config.h里面有配置configUSE_CORE_AFFINITY = 1才能使用vTaskCoreAffinitySet绑定cpu.,rtos不叫绑cpu,而叫核心亲和性(Core Affinity),是指在一个多核处理器的计算机系统中,将特定的任务或线程绑定到特定的处理器核心上运行的能力。
#include "FreeRTOS.h"
#include "task.h"
void vATaskFunction( void *pvParameters )
{
// 任务代码
}
void vAnotherTaskFunction( void *pvParameters )
{
// 另一个任务代码
}
int main( void )
{
// 创建任务
TaskHandle_t xTaskHandle1 = NULL;
TaskHandle_t xTaskHandle2 = NULL;
// 创建两个任务
xTaskCreate( vATaskFunction, "Task1", STACK_SIZE, NULL, TASK_PRIORITY, &xTaskHandle1 );
xTaskCreate( vAnotherTaskFunction, "Task2", STACK_SIZE, NULL, TASK_PRIORITY, &xTaskHandle2 );
// 假设我们的系统有4个核心,编号为0, 1, 2, 3
// 设置Task1只在核心0上运行
vTaskCoreAffinitySet( xTaskHandle1, 0x01 ); // 0x01的二进制表示是0001,意味着只允许在核心0上运行
// 设置Task2只在核心1和核心2上运行
vTaskCoreAffinitySet( xTaskHandle2, ( 0x1 << 1 ) | ( 0x1 << 2 ) ); // 0x06的二进制表示是0110,意味着只允许在核心1和核心2上运行
// 启动调度器
vTaskStartScheduler();
// 如果一切正常,以下代码不会被执行
for( ;; );
}
void vApplicationIdleHook( void )
{
// 获取Task1的核心亲和力
UBaseType_t uxCoreAffinityMask;
vTaskCoreAffinityGet( xTaskHandle1, &uxCoreAffinityMask );
// uxCoreAffinityMask 现在包含了Task1的核心亲和力设置
// 可以根据uxCoreAffinityMask的值来执行一些操作,比如打印或者做进一步的核心亲和力调整
}
我们通常可以把不同时间片轮转的任务设置不同的核亲和力,比如像时间片轮转的设置一个cpu0核亲和力,抢占级的设置另一个cpu1核亲和力,这里只是举例说明。具体的资源管理根据实际场景来设计。
linux都提供了设置线程或进程核心亲和性的接口。用的是taskset
命令和pthread_setaffinity_np
函数 。