tls_os_task_create好像有bug

發布於 2023-02-14 21:38:53

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機制,任務死活收不到通知,然後查了半天發現的。請驗證後,並追蹤源碼後做出修改。

查看更多

關注者
0
被浏覽
2.3k
ZYQ
ZYQ 2023-02-15
我已不再支持W80X任何相關問題的回複,請大家不要私信,有問題找 isme 謝謝

請使用最新的SDK V1.10,該問題早就修複了
image.png

1 個回答

撰寫答案

請登錄後再發布答案,點擊登錄

發布
問題

分享
好友

手機
浏覽

掃碼手機浏覽