tls_os_task_create(&tpd_task, "tpd_scan_task", tpd_scan_task, NULL, NULL, sizeof(tpd_stk), 1, 0);
我在编写ft6236电容触摸芯片驱动时,使用tls_os_task_create()函数创建任务,任务正常工作,该函数的第一个参数返回的应该是freertos的task handle(也就是TCB块地址)。该函数创建的任务能正常运行,但是有bug,使用动态创建栈的形式时,返回的任务控制块不对。
问题出在tls_os_task_create的参数1,返回的任务块地址。
对于xTaskCreate而言,定义task_hanle变量,把该变量地址以参数形式传递就行了。但是tls_os_task_create定义pTask,并分配内存。 然后把pTask指针传给vTaskCreate函数,这就导致pTask的前4个字节保存的是Task Handle地址。
tls_os_status_t tls_os_task_create(tls_os_task_t *task,
const char* name,
void (*entry)(void* param),
void* param,
u8 *stk_start,
u32 stk_size,
u32 prio,
u32 flag){
tls_os_status_t os_status;
StaticTask_t *pTask = NULL;
xTaskHandle xHandle;
BaseType_t xreturn;
pTask = tls_mem_alloc(sizeof(StaticTask_t));
if(pTask == NULL)
{
return TLS_OS_ERROR;
}
stk_size /= sizeof(StackType_t);
if (stk_start)
{
// 这里是对的,因为pTask就是tcb,静态分配的
xHandle = xTaskCreateStatic(entry, name, stk_size, param,
configMAX_PRIORITIES - prio, (StackType_t *)stk_start, pTask);
xreturn = (xHandle==NULL) ? pdFALSE:pdTRUE;
}
else
{
// 这里是错的,因为tcb内部动态分配,他返回tcb地址,保存在pTask
// 即pTask前4字节保存了task handle的指针
// 后面的*task = *pTask(取前4字节转为指针类型,赋值给*task)
// 如果是前面的静态分配,*task=pTask就是对的的
// 在这个else分支下,就是错的。
xreturn = xTaskCreate( entry, name, stk_size, param,
configMAX_PRIORITIES - prio, (TaskHandle_t * const)pTask);
}
//printf("configMAX_PRIORITIES - prio:%d\n", configMAX_PRIORITIES - prio);
if (xreturn == pdTRUE)
{
printf("xhandle:%p, taskhandle:%d\n", xHandle, pTask);
*task = pTask;
os_status = TLS_OS_SUCCESS;
}
}
为什么会发现这个问题?我把freertos的源码删了换成最新的。可以用task notification机制,任务死活收不到通知,然后查了半天发现的。请验证后,并追踪源码后做出修改。
你们还是弄一个github 或者gitee仓库吧。你这么一回答,我查了一下网盘,确实有10的新源码。