微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 一种时间触发的多任务调度器设计

一种时间触发的多任务调度器设计

时间:06-07 来源:中电网 点击:



  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 © 2017-2020 微波EDA网 版权所有

网站地图

Top