最近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();