![]() |
广嵌科技 广嵌教育 English | |
|
一种时间触发的多任务调度器设计
来源:中电网 作者: 时间:2008-07-08 发布人:林逸
引 言
定时队列TmrQue[]和定时索引队列TmrIdx[]一一对应。其中,定时队列中存放定时消息的延时时间;而相对应的TmrIdx[]项则指向定时消息在消息队列中的位置。 要发送消息时,使用函数vdStrtTmrTsk(INT16UTmValue,struct Msg*pOutMsg),将pOutMsg指向的消息结构放入队列MsgQue[]中。具体的做法是:从数组的第一项开始查找,找到空闲项放入新消息并将该项的状态设置成BUFF-USED;然后将此消息项对应的索引值放入RdIdx[]的第一个空闲项中等待调度。如果发送的是延时消息,则要使用vdStrtTmrTsk(INT16U TmValue,structMsg*pOutMsg)将延时时间放入TmrQue[]中,并使用对应的TmrIdx[]项指向对应的消息。 ![]() 图1中MSG5对应的任务正在执行,MSG9是刚到期的定时消息,当前任务结束后就可以处理该消息。MSG7是未到期的定时消息,其他2个都是已就绪待处理的消息。 2.2 定时器的设计 调度器必须先设定一个默认的时间片,这并不是件简单的事。时间片过长会导致系统对交互行为的响应表现欠佳;时间片太短又会明显地增大调度器处理耗时,而留给任务运行的时间却很短。根据V850处理器在车载音响上的实际需要,选择4 ms作为时间片。 在V850处理器中使用TM0定时器来实现4 ms定时功能,可以计算出CR70的初值为156,程序实现如下:
在定时器的中断服务程序中,扫描定时队列TmrQue口。如果有延时到期的任务,则将其从定时队列中删除并放在就绪索引队列RdIdx[]中去。对定时器相关的操作涉及具体的平台,在不同平台上移植调度器时需要修改这一部分。 2.3 周期性任务的处理方法 对于该系统,周期长度必须是4 ms的整数倍。在每次时钟中断以后执行下面的函数,通过将要周期性执行的任务放入函数数组TskPatt[]()中就可以执行周期为8 ms、16 ms、32 ms、64 ms等周期性任务。
3 任务的调度 调度器的算法使用FCFS算法,就绪索引队列RdIdx[]按顺序存储要处理的消息的索引。这里对延时消息做特殊处理,如图1所示,消息MSG9的延时时间刚到,它的索引被插入到当前消息索引的后面(也就是位置RdIdx[1]),它就可以在下一次调度中得到处理。 任务调度由wucExecTsk(void)函数来完成。它取出MsgQue[RdIdx[0]]对应的消息,以该消息的目的模块ID为索引,使用存放各个模块人口函数的函数数组TskTb1[](),就可以将该消息分发到相应的处理模块。 因为该调度器是合作式的,所以每个任务处理函数都必须显示地调用退出任务的函数,否则该任务会永远的执行下去。因此,每个模块的人口函数都调用退出任务的API: ![]() 在vdExtTsk()中,将当前任务在消息数组MsgQue[]中对应的数据项置成BUFF_EMPTY。同时,将就绪索引队列里的数据都向前移动,覆盖当前消息的索引,原来的RdIdx[1]就变成当前任务的消息索引,参与下一轮调度。 4 应用实例 车载音响系统是一个复杂的嵌入式系统,它的微控制器要处理大量的外围设备,如图2所示。为了便于开发,将程序按照硬件的功能划分模块,各个模块之间通过传递消息的方式来完成多任务的处理。使用上面介绍的调度结构既方便了程序的设计和维护,又解决了多个任务之间的调度问题。 针对这个应用,模块入口函数数组TskTb1[]如表1所列,使用函数数组的方式可以增强程序的扩展能力。如果有新的外设,只需在这里添加对应的模块人口,并完成相应的模块就可以增加系统的功能。 系统的周期性任务如表2所列。系统中按键使用的是矩阵键盘,4 ms时间太短不足以检测出键值,这里是通过每次扫描一行的方式来实现的。
系统在NEC公司V850系列微控制器的开发平台上用C语言实现,调度器在车载音响系统中很好地发挥了作用,系统的交互行为良好,输入、输出都感觉不到延迟。该系统已经应用在某型号的汽车上。 结 语 在工程中采用事件触发模式很大程度上会增加系统的复杂性;而商业实时操作系统往往价格昂贵,并且需要很大的操作系统开销。本文设计并实现了基于时间触发的调度器,它通过传递消息的方式完成多任务的切换,可以满足实时、简单、可预测性等工程要求。这种设计还使得系统易于开发和维护,应用于车载音响系统中取得了很好的效果。 ·上一条:离子迁移谱仪嵌入式系统的设计
|
相关信息 |
|||||||||||||||||||||||
| Copyright ©2005-2007 广东省嵌入式软件公共技术中心.All Rights Reserved.版权所有 复制必究 客户服务支持:020-32068395-832 24小时服务热线:13631411558 技术支持与报障:gdesc@midea.com.cn 020-32068395-807/809 粤ICP备05104135号 |