毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 论文 >> 正文

arm嵌入式系统设计论文 第8页

更新时间:2009-4-12:  来源:毕业论文
arm嵌入式系统设计论文 第8页
μC/OS-Ⅱ的任务管理 
4.2.1μC/OS-Ⅱ的任务管理
每个任务在被创建的时候,一个称为任务控制块TCB(task control blocks)的数据结构将被初始化。如下所示为μC/OS-II的任务控制块结构。
typedef struct os_tcb
{OS_STK*OSTCBStkPtr;
#if OS_TASK_CREATE_EXT_EN//控制是否允许在外部对任务控制块进行扩充void*OSTCBExtPtr;//指向用户定义的数据(实现对任务控制块扩展)
OS_STK*OSTCBStkBottom ;//指向任务堆栈的底部
INT32U OSTCBStkSize;//任务堆栈的大小
INT16U OSTCBOpt;//存放创建任务时的参数
INT16U OSTCBId;//任务的表示ID
#endif
struct os_tcb*OSTCBNext;//实现任务控制块双链表
struct os_tcb*OSTCBPrev;
#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN||OS_SEM_EN//是否采用消息机制
OS_EVENT*OSTCBEventPtr;//指向事件控制块
#endif
#if(OS_Q_EN&&(OS_MAX_QS>=2))||OS_MBOX_EN//是否采用消息机制
void*OSTCBMsg;//指向从消息队列或邮箱接收的消息
#endif
INT16U OSTCBDly;//任务的延时时钟滴答数
INT8U OSTCBStat;//任务的状态
INT8U OSTCBPrio;//任务的优先级
//以下四个用于加速任务进入就绪态的过程或进入等待事件发生状态的过程
INT8U OSTCBX;//保存优先级的前3位
INT8U OSTCBY;//保存优先级的后3位
INT8U OSTCBBitX;//任务优先级在就绪表中的横向偏移位置
INT8U OSTCBBitY;//任务优先级在就绪表中的纵向偏移位置
#if OS_TASK_DEL_EN//宏定义:是否允许删除任务
BOOLEAN OSTCBDelReq;//指示任务是否需要删除自己
#endif
}OS_TCB;
与大多数操作系统的进程控制块相似,μC/OS-II的TCB中包含了任务运行和管理的信息,同时μC/OS-II的TCB有如下特点:
1.包含受宏定义控制的条件编译,允许用户根据具体应用对TCB进行裁减,节省内存空间。
2.具有单独的任务堆栈并对其进行管理。
3.包含为任务状态转换而保存的任务信息,提高任务调度效率。μC/OS-II初始化的时候将所有可用的任务控制块通过指针*OSTCBNext和*OSTCBPrev连成一个可用任务双向链表,并将指针*OSTCBFreelist从可用任务双向链表获取一个TCB。
μC/OS-II的任务通常如下所示,与普通C函数一样,有函数返回类型,有形式参数变量,但是任务是不会返回的,故返回参数必须定义成void。
void YourTask(void*pdata)
{
Do something;
waiting;
……}
μC/OS-II可以管理多达64个任务,每个任务的优先级都必须不一样,因此共有64个优先级,并且从中保留了四个最高优先级和四个最低优先级的任务供自己使用,所以用户可以使用的只有56个任务。任务的优先级越高,反映优先级的值则越低。μC/OS-II下每个任务可以有如下五种状态,见图4-1。
 
4.1任务状态
休眠态(dormant):指任务驻留在程序空间中,还没有交给内核管理。把任务交给内核是通过调用OSTaskCreate()或OSTakCreateExt()两个函数实现的,这些调用用于告诉内核,任务的起始地址在哪里,任务建立时用户给任务赋予了什么样的优先级,任务要使用多少栈空间等。
就绪态(Ready):当任务一旦建立,这个任务处于就绪态准备运行,就绪态的任务都放在就绪列表中。在任务调度时,指针OSTCBHightdy指向优先级最高的就绪任务,一个任务可以通过调用OSTaskDel()返回到睡眠态,或通过调用该函数让另一个任务进入睡眠态。
运行态(Running):准备就绪的最高优先级的任务获得CPU的控制权从而处于运行态。调用OSStart()可以启动多任务,OSStart()函数只能在启动时调用一次,任何时候只能有一个任务处于运行态。
等待或挂起(Pending):正在运行的任务由于调用延时或等待事件信号量的来临而将自身挂起而处于等待或挂起态,是由OSTimeDly()和OSTimeDlyHMSM()这两函数实现的,一直到函数中定义的延迟时间到。
中断态(Interrupt):除非将中断关闭正在运行的任务可以被中断。
4.2.2 μC/OS-II中的任务调度
当就绪任务的数目多于CPU数目时,它们就要争夺CPU资源。任务调度的功能就是按照一定的原则把CPU动态的分配给某个就绪任务。任务调度工作是通过任务调度程序来完成的,它是操作系统的真正核心。由于任务调度程序负责在就绪任务间转换对处理机的使用,所以对它的调用相当频繁,有时每秒钟要执行很多次。引起任务调度的条件和时机与操作系统的类型有关,也与操作系统内核的具体实现方法有关,通常在下述情况下进行任务重新调度:
1.正在执行的任务正常结束执行或因发生某种事件而不能继续进行时,要重新调度一个任务去占用CPU。
2.执行中的任务因提出I/O请求而暂停执行时,要重新调度。
3.在任务通讯或同步过程中,执行了某种原语操作,需要重新调度。
4.在可剥夺式调度中,有一个比当前任务优先级更高的任务进入就绪队列时,为保证其立即占用CPU,要重新调度。
5.在时间片轮转法中,每次时间片完成,要重新调度。一旦转入任务调度程序,它将完成下列工作:
(1)保护当前正在执行任务的现场,将程序状态寄存器、指令寄存器及所有通用寄存器的内容放到特定单元保存起来。
(2)根据一定的算法,如优先级最高算法,从就绪任务队列中选择一个,并把CPU分配给它。
(3)恢复被调度到的任务的原来现场,从而使它按上次放弃CPU时的状态继续运行。μC/OS-II是剥夺型实时多任务内核,采用基于优先级的调度,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。μC/OS-II不支持时间片轮转调度(当两个或两个以上的任务有同样优先级,内核允许一个任务运行事先确定的一段时间,叫做时间额度,然后切换给另一个任务,也叫做时间片调度),μC/OS-II中每个任务的优先级都是不一样的,并且是唯一的。μC/OS-II的任务调度包括任务级的调度和中断级的调度,它们调度算法实现是一样的。
1.任务级的调度
任务级的调度是由函数OSSched()完成的。下面通过具体分析OSSched()的实现来看看μC/OS-II的任务调度的特点。应用程序可以直接调用这个函数。相比之下,Linux内核中进程调度则总是隐藏在别的系统调用中[9]。如图4-2所示,整个任务调度都在临界段区中(见①⑧),首先是在②判断任务调度的时机,在ISR或调度被禁止时不允许进行调度,否则执行③从就绪表中找到最高优先级级的就绪任务,如果它不是当前任务(见④)就需要进行⑥上下文切换,上下文切换由OS_TASK_SW()实现,OS_TASK_SW()会在移植时再详细介绍。如果当前任务就是就绪表中的最高优先级的就绪任务,不进行切换操作则直接返回退出调度函数。
2.中断级的调度
中断级的调度是由另一个函数OSIntExt()完成的。在调用μC/OS-II的其他服务之前,μC/OS-II首先调用系统初始化函数OSInit()。调用OSInit()后,一些μC/OS-II变量和数据结构之间的关系。图中两个任务的控制块用双向链表链接,OSTCBList指向这个链表的起始处。当系统建立一个任务时,这个任务总是被放在链表的起始处。链表的终点指向空字符NULL。因为这两个任务都处于就绪态,所以就绪表OSRdyTbl[]中的相应位是设为1的。又因为这两个任务的相应位在OSRdyTbl[]的同一行上,即属同一组,故OSRdyGrp只有一位是设为1的。μC/OS-II还初始化了4个空数据缓冲区。每个缓冲区都是单向链表,允许μC/OS-II从缓冲区迅速得到或释放一个单元。μC/OS-II自动安排系统总的任务数,控制块OS_TCB的数目也就自动确定了。多任务的启动是用户通过调用OSStart()实现的。在启动μC/OS-II前用户至少要建立一个应用任务。当调用OSStart()时,OSStart()从任务就绪表中找出优先级最高的任务的任务控制块,然后,OSStart()调用最高优先级就绪任务启动函数OSStartHighRdyO使这个任务运行。μC/OS-II是严格按照优先级进行调度,μC/OS-II总是运行进入就绪态任务中优先级最高的任务,因此必须确定任务优先级最高就绪任务。在Linux中这一过程并不简单,而在μC/OS-II中却很简单,也是μ

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

arm嵌入式系统设计论文 第8页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。