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的新源碼。