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 的新源码.