freertos vTaskCoreAffinitySet绑定cpu

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函数 。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陌上花开缓缓归以

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

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

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

打赏作者

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

抵扣说明:

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

余额充值