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
被浏览
1. 5k
ZYQ
ZYQ 2023-02-15
我已不再支持 W80X 任何相关问题的回复, 请大家不要私信, 有问题找 isme 谢谢

请使用最新的 SDK V1. 10, 该问题早就修复了
image. png

1 个回答

撰写答案

请登录后再发布答案, 点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览