rt_thread main函数中创建任务,最后一个任务偶发起不来问题分析解决

问题描述:

           项目使用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任务中调用的,所以要考虑该任务的堆栈和优先级分配情况,分配不合理会导致其中创建任务的执行出现异常。

RT-Thread 操作系统中,当在 `main` 函数创建一个优先级为 9 的线程时,如果出现程序卡死问题,通常与线程调度机制、资源竞争、优先级冲突或初始化顺序有关。以下是对该问题的详细分析解决方法: ### 1. 线程优先级与调度问题 RT-Thread 使用基于优先级的抢占式调度算法,优先级数值越小,优先级越高。如果在 `main` 函数创建的线程优先级为 9,并且此时系统中已有其他更高优先级线程(如优先级 0-8)处于就绪状态,则新创建的线程可能无法立即运行,甚至在某些情况下导致调度器无法切换回低优先级线程[^2]。这种情况下,程序可能表现出“卡死”的现象。 **解决方法:** - 确保在 `main` 函数创建的线程不会与系统中已有的高优先级线程产生冲突。 - 检查系统中是否存在优先级高于 9 的线程长时间占用 CPU,导致新线程无法获得调度机会。 - 可尝试将新线程的优先级设置为稍低(如 10 或 11),观察是否仍存在卡顿现象。 ### 2. 调用 `rt_thread_startup()` 后线程未被正确加入就绪队列 根据 RT-Thread 的线程管理机制,线程创建后必须调用 `rt_thread_startup()` 函数将其加入就绪队列,否则线程将不会被调度执行[^1]。如果该函数调用失败或未正确执行,可能导致程序卡死。 **解决方法:** - 确认 `rt_thread_startup()` 的返回值是否为 `RT_EOK`,若不是,则说明线程启动失败。 - 检查线程控制块(TCB)是否被正确初始化,特别是线程栈的分配和初始化是否正常。 - 避免重复调用 `rt_thread_startup()`,这可能导致未定义行为。 ### 3. 线程栈溢出或内存分配失败 如果线程栈分配过小或动态内存分配失败,可能导致线程运行异常,甚至系统崩溃。 **解决方法:** - 增加线程栈大小,确保其足以支撑线程内函数调用的深度。 - 使用静态线程创建方式(`rt_thread_init()`)以避免动态内存分配失败的风险。 ### 4. 系统初始化未完成时创建线程 在 `main` 函数早期阶段(如硬件初始化未完成时)创建并启动线程,可能导致线程依赖的资源未准备好,从而引发系统卡死。 **解决方法:** - 确保所有必要的系统初始化(如调度器、时钟、中断等)已完成后再创建和启动线程。 - 将线程创建逻辑延迟到系统初始化完成之后,例如通过 `rt_thread_delay()` 延迟启动。 ### 示例代码:正确创建并启动线程 ```c #include <rtthread.h> #define THREAD_PRIORITY 9 #define THREAD_STACK_SIZE 512 #define THREAD_TIMESLICE 10 /* 线程入口函数 */ static void thread_entry(void *parameter) { while (1) { rt_kprintf("Thread is running\n"); rt_thread_mdelay(1000); } } int main(void) { rt_thread_t tid; rt_err_t result; /* 创建线程 */ tid = rt_thread_create("my_thread", thread_entry, RT_NULL, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid != RT_NULL) { /* 启动线程 */ result = rt_thread_startup(tid); if (result != RT_EOK) { rt_kprintf("Failed to start thread\n"); } } else { rt_kprintf("Failed to create thread\n"); } return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值