赞
踩
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,其本质是将复杂的应用(一个进程)分解成多个小的、可调度的、序列化的程序单元,当合理的划分任务并正确执行时,能够让系统满足实时系统的性能及时间的要求。
如下图所示,嵌入式系统执行任务A,该任务是系统通过传感器采集数据,然后输出到显示屏显示出来,在多线程实时系统中,可以将任务A分解成两个子任务。
在RT-Thread中,与上述子任务的程序实体就是线程,它描述了一个任务执行的运行环境,也描述了这个任务所处的优先等级,重要的任务可设置相对较高的优先级,非重要的任务可以设置较低的优先级,不同的任务还可以设置相同的优先级,轮流运行。
上下文:当线程运行时,它会认为自己是以独占CPU的方式运行,线程执行时的运行环境即为上下文,包括所有的寄存器变量、堆栈、内存信息等。
在 RT-Thread 中,线程控制块由结构体 struct rt_thread 表示,线程控制块是操作系统用于管理线程的一个数据结构,它会存放线程的一些信息,例如优先级、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构,线程等待事件集合等。详细定义可参考RT-Thread-线程管理
RT-Thread 最大支持 256 个线程优先级 (0~255),数值越小的优先级越高,0 为最高优先级。
线程控制块中的 entry 是线程的入口函数,它是线程实现预期功能的函数。线程的入口函数由用户设计实现,一般有以下两种代码形式:
void thread_entry(void* paramenter)
{
while (1)
{
/* 等待事件的发生 */
/* 对事件进行服务、进行处理 */
}
}
static void thread_entry(void* parameter)
{
/* 处理事务 #1 */
…
/* 处理事务 #2 */
…
/* 处理事务 #3 */
}
RT-Thread提供一系列的操作系统调用接口,使得线程的状态在这五个状态之间来回切换。几种状态间的转换关系如下图所示:
下图所示描述了线程的相关操作,包含:创建/初始化线程、启动线程、删除/脱离线程。
可以使用 rt_thread_create() 创建一个动态线程,使用 rt_thread_init() 初始化一个静态线程,动态线程与静态线程的区别是:动态线程是系统自动从动态内存堆上分配栈空间与线程句柄(初始化 heap 之后才能使用 create 创建动态线程),静态线程是由用户分配栈空间与线程句柄。
创建线程(动态线程,在使能了RT_USING_HEAP才有效):
rt_thread_t rt_thread_create(const char* name,
void (*entry)(void* parameter),
void* parameter,
rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick);
初始化线程:
rt_err_t rt_thread_init(struct rt_thread* thread,
const char* name,
void (*entry)(void* parameter), void* parameter,
void* stack_start, rt_uint32_t stack_size,
rt_uint8_t priority, rt_uint32_t tick);
删除线程:
rt_err_t rt_thread_delete(rt_thread_t thread);
脱离线程:
rt_err_t rt_thread_detach (rt_thread_t thread);
将初始化/创建成功后的线程通过启动线程接口进入就绪态:
rt_err_t rt_thread_startup(rt_thread_t thread);
rt_thread_t rt_thread_self(void);
当前线程的时间片用完或者该线程主动要求让出处理器资源时,它将不再占有处理器,调度器会选择相同优先级的下一个线程执行。
rt_err_t rt_thread_yield(void);
在实际应用中,我们有时需要让运行的当前线程延迟一段时间,在指定的时间到达后重新运行,这就叫做 “线程睡眠”。
rt_err_t rt_thread_sleep(rt_tick_t tick);
rt_err_t rt_thread_delay(rt_tick_t tick);
rt_err_t rt_thread_mdelay(rt_int32_t ms);
挂起线程:
处于挂起状态的线程,如果其等待的资源超时(超过其设定的等待时间),那么该线程将不再等待这些资源,并返回到就绪状态;或者,当其他线程释放掉该线程所等待的资源时,该线程也会返回到就绪状态。
rt_err_t rt_thread_suspend (rt_thread_t thread);
恢复线程:
让挂起的线程重新进入就绪状态,并将线程放入系统的就绪队列中;如果被恢复线程在所有就绪态线程中,位于最高优先级链表的第一位,那么系统将进行线程上下文的切换。
rt_err_t rt_thread_resume (rt_thread_t thread);
rt_err_t rt_thread_control(rt_thread_t thread, rt_uint8_t cmd, void* arg);
空闲钩子函数是空闲线程的钩子函数,如果设置了空闲钩子函数,就可以在系统执行空闲线程时,自动执行空闲钩子函数来做一些其他事情,比如系统指示灯。设置 / 删除空闲钩子的接口如下:
rt_err_t rt_thread_idle_sethook(void (*hook)(void));
rt_err_t rt_thread_idle_delhook(void (*hook)(void));
void rt_scheduler_sethook(void (*hook)(struct rt_thread* from, struct rt_thread* to));
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。