最近freertos已支持SMP,项目需要将它移植到英飞凌tc27x。发现任务没有绑定核,总是会crash。搞很久才找到原因。修正后,运行效果如下图,原因如下下图:(源码群477134729)
运行效果:

主要代码如下:
printf(" Starting core0\n");
xQueue = xQueueCreate(5, sizeof(qdata_t));
xQueue1 = xQueueCreate(5, sizeof(qdata_t));
int p0 = 0;
xTaskCreate(taskFunc, "t0", 1024, &p0,
mainQUEUE_RECEIVE_TASK_PRIORITY, &th0);
vTaskCoreAffinitySet(th0, 1 << 0);
int p9 = 9;
xTaskCreate(taskFunc00, "t00", 1024, &p9,
mainQUEUE_RECEIVE_TASK_PRIORITY, &th00);
vTaskCoreAffinitySet(th00, 1 << 0);
#if 1
int p1 = 1;
xTaskCreate(taskFunc1, "t1", 1024, &p1,
mainQUEUE_RECEIVE_TASK_PRIORITY, &th1);
vTaskCoreAffinitySet(th1, 1 << 1|1<<2);
#endif
int p2 = 2;
xTaskCreate(taskFunc2, "t2", 1024, &p2,
mainQUEUE_RECEIVE_TASK_PRIORITY, &th2);
vTaskCoreAffinitySet(th2, 1 << 2|1<<1);
vTaskStartScheduler();
原因:

这是官方datasheet,如上所示,只能在core1和core2之间任务可以在俩个核上调度,任务在core1或core2上跑后,不能再被core0调度,否者会crash。
因此,可以将某些任务绑定到core0,某些任务同时绑定core1和core2俩个核。
printf(" Starting core0\n");
xQueue = xQueueCreate(5, sizeof(qdata_t));
xQueue1 = xQueueCreate(5, sizeof(qdata_t));
int p0 = 0;
xTaskCreate(taskFunc, "t0", 1024, &p0,
mainQUEUE_RECEIVE_TASK_PRIORITY, &th0);
vTaskCoreAffinitySet(th0, 1 << 0);
int p9 = 9;
xTaskCreate(taskFunc00, "t00", 1024, &p9,
mainQUEUE_RECEIVE_TASK_PRIORITY, &th00);
vTaskCoreAffinitySet(th00, 1 << 0);
#if 1
int p1 = 1;
xTaskCreate(taskFunc1, "t1", 1024, &p1,
mainQUEUE_RECEIVE_TASK_PRIORITY, &th1);
vTaskCoreAffinitySet(th1, 1 << 1|1<<2);
#endif
int p2 = 2;
xTaskCreate(taskFunc2, "t2", 1024, &p2,
mainQUEUE_RECEIVE_TASK_PRIORITY, &th2);
vTaskCoreAffinitySet(th2, 1 << 2|1<<1);
vTaskStartScheduler();
本文介绍将FreeRTOS移植到英飞凌tc27x平台,并解决SMP环境下任务核绑定导致系统崩溃的问题。通过合理设置任务亲和性,确保任务能在正确的核上运行,避免系统错误。
&spm=1001.2101.3001.5002&articleId=123794093&d=1&t=3&u=d6df6452de9f43e095d5aef825836857)
397

被折叠的 条评论
为什么被折叠?



