问题描述:
项目使用rt_thread 系统,在入口函数main中调用main_task_creat()函数,然后创建default任务,main_task_creat()中创建了各个业务功能task,最后一个task 是chrg_task,chrg_task中调用了一个hal_delay函数硬延时1.5s,这个延时函数会影响default任务的启动,把延时函数拿掉或缩短延时时间,default启动正常,否则系统都上电20s default任务都不启动。
排查1.放大chrg_task任务堆栈到2k,问题能解决,但是实际上chrg_task堆栈消耗才30%不到;
排查2.放到default 任务堆栈到2k,问题依然。
排查3:拿掉chrg_task,或者拿到task中的那个延时函数,或缩短延时,或者延时函数使用rt_thread_mdelay,都可以正常启动。
百思不得其解:最后分析应该是创建default task这块都没有走到,所以default task没启动,为什么没走到是因为有硬延时函数时main主函数阻塞,而其他功能任务都开始运行了,而且任务优先级都比较高,main主函数的优先级比较低,一直得不到执行,所以在main主函数中创建的default任务得不到执行。当阻塞时间比较短时或者延时函数时rt_thread_mdelay时,最后一个任务是可以得到创建的。
知识点:rt_thread系统中,main函数是在rt_thread的main_thread_entry任务中调用的,所以要考虑该任务的堆栈和优先级分配情况,分配不合理会导致其中创建任务的执行出现异常。