线程调度与管理
线程运行状态
- 线程通过调用函数rt_thread_create/init进入初始状态(RT_THREAD_INIT);
- 再通过调用函数rt_thread_startup进入到就绪状态(RT_THREAD_READY);
- 当处于运行状态的线程调用rt_thread_delay,rt_sem_take,rt_mb_recv等函数或获取不到资源时,将进入挂起状态(RT_THREAD_SUSPEND);
- 处于挂起状态的线程,如果等待超时依然未能获取资源或由于其他线程释放了资源,那麽他将重新变为就绪状态;
- 挂起状态的线程,如果调用rt_thread_delete/detach将更改为关闭状态(RT_THREAD_CLOSE);
- 而运行状态下的线程,结束会在线程最后部分执行rt_thread_exit函数而更改为关闭状态(RT_THREAD_CLOSE)。
注意事项
idle线程
- 空闲线程中不能死循环,需要留出时间用于系统处理僵尸线程的系统资源回收
- 该线程不能挂起,保证至少有一个线程能够运行
中断服务例程 - 运行在非线程环境下(一般为特权模式),在这个上下文环境中不能使用挂起当前线程的操作,因为当前线程不存在,执行相关的操作会有类似:
FUNCTION[abd_func]shall not used in ISR
(abc_func即你不应在中断服务函数中调用的函数) - 中断服务函数需要精简,因为中断服务是一种高于任何线程的存在
普通线程
做为优先级明确的实时操作系统,如果一个线程的程序执行了死循环操作那麽比他优先级低的线程将不能够得到执行包括idle线程。这是在实时操作系统中必须注意到的一点
线程设计要点
上下文环境
对于键盘事件,在32的Radio中,由于硬件的限制,系统需要自行查询按键状态,即不能够在中断服务的上下文中执行,所以应该单独开辟一个key线程进行处理按键
线程的状态跃迁
线程运行中状态的变化,实时系统作为一款优先级的系统,如果一个线程只有就绪态而无阻塞态,势必会影响到其他低优先级现成的运行。所以在线程设计时应该保证线程在不活跃的时候必须让出cpu,即主动让出资源。这就要求我们明确需要在什么情况下让线程送就绪态跃迁到阻塞态。
线程运行时间长度
线程由阻塞态跃迁为就绪态执行设定的工作,再从就绪态跃迁为阻塞态所需要的时间(一般还应加上这段时间内,这个线程不会被其他线程所抢占的先决条件)。