嵌入式操作系统初探(二)
一:线程结构体包含内容
线程编号:唯一识别线程的编号
栈底指针和栈顶指针:栈底指针是线程的起始地址,栈顶指针用来索引栈中的内容。
线程的时间片长度和剩余节拍数:支持API的修改,可用于时间片调度。
线程的基本优先级和当前优先级:可用于优先级继承策略。
线程状态:方便事件的询问。
主函数入口:记录函数运行的位置
主函数参数:从外部引入参数,对参数进行判断。
线程节点:方便和其他线程联结组成线程队列。
线程队列指针:记录当前线程在线程队列中的位置 。
IPC结构体:记录包括信号量,互斥量,邮箱,消息队列,事件标记的信息
线程定时器:实现线程延时和阻塞时限的释放。
线程管理的授权节点:控制线程请求调度的时候有用。
二:线程的状态
休眠态:初始化线程后的状态,需要激活。
就绪态:状态良好,可以进行调度的状态。
阻塞态:条件不满足,需要等待条件满足继而进入就绪态的状态。
挂起态:被手动忍到一边,直到唤醒才可以参加调度的状态。
延时态:手动延时,一定时间后可以自动进入就绪态参与调度。
三:线程的栈,函数,数据,优先级
线程栈:分为内核栈和用户栈,两者可以共用。
线程函数:循环结构,可以带入参数。
线程数据:包括栈数据,全局数据(互斥访问),动态数据。
四:线程的队列
线程队列处于内核中,共包括线程就绪队列(1),线程阻塞队列(1),线程辅助队列(IPC个数)。
三种线程队列的基本结构:
PriorityMask用来记录不同优先级上是否有线程,Handle[]数组中的每个元素存放一个双向链表,每个链表上的所有线程优先级相同。
五:线程的调度
模型:主要是进出就绪队列时的调度和就绪队列内部的调度
六:线程的管理
初始化,激活和唤醒,挂起和唤醒,主动调度,延时,优先级管理,时间片管理,管理授权。
1.线程初始化:堆栈设置,时间片设置,优先级设置,编号设置,线程定时器设置,节点设置,IPC清空,加入辅助队列,设为休眠态。
2.线程激活:条件:休眠态,过程:队列变换,状态变换,检查优先级并申请占用内核。
3.线程休眠:条件:配置成可休眠状态,过程:变换队列,设置状态,检查是否为就绪态并申请退出内核,否则退出当前状态设置为休眠态。
4.线程挂起:条件:线程可以被挂起,过程变换队列,设置状态,检查是否为就绪态的当前线程并申请退出内核,否则退出当前状态设置为休眠态。
5.线程解挂:条件:挂起状态下,过程变换队列,设置状态,判断优先级并抢占内核线程。
6.线程延时:条件:就绪态,过程:变换队列,设置状态,启动定时器,判断是否为就绪当前线程并申请离开内核。
7.延时取消:条件:线程已经延时,过程:变换队列,设置状态,停止定时器,判断该线程是否优先级高于当前线程,申请调度。
8.主动调度:条件:支持主动放弃处理器并允许线程调度,过程:判断同优先级的存在,指针下移,申请调度。
9.优先级设定:条件:优先级可以被修改,过程:判断是否处于就绪态,若改变为最高优先级,并且最高优先级大于当前线程的优先级,申请线程调度。
10.时间片修改:条件:允许修改,过程:对新时间大于和小于老时间两种不同的情况分别处理。
11.守护线层:作用:初始化线程,定时器守护线程。
七:线程的应用
1.通过线程的主动调动完成小灯的亮灭
两个线程,每个线程都可以操作,延时,转让控制权,以此轮流控制实现亮灭。