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

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

1 个回答

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览