多任务程序架构的搭建

2011-08-08 12:48虞益龙
电脑与电信 2011年12期
关键词:多任务频度中断

虞益龙

(常州刘国钧高等职业技术学校,江苏 常州 213000)

1.引言

传统的单片机程序设计多为单任务系统,其业务逻辑顺序安排在主函数中,主函数一般为死循环,循环过程中通过调用函数来完成相应的操作,而对于一些较短的实时任务则通过中断方式进行处理。此种程序结构简单、直观,易于实现,但对于较复杂的应用此种结构实现不了,并且不能满足实时性要求较高的场合,因此必须考虑一种新的结构模式。

本文提出的方法也是按时间片切换任务的,但不同的是,执行任务的时间不是由定时器平均分配的,而是按照执行任务中一个完整过程的时间来自动分配的。在单片机系统程式设计中,可按系统的功能或模块划分为任务,而每个任务可按具体作业细分为各个过程。可见任务由过程组成。按时间片分配任务的设计,系统效率就会更高。

2.多任务轮循程序架构

多任务轮循程序架构就是一个系统由多个任务构成,各任务之间相对独立。本文提出一种基于定时器中断的多任务轮循程序架构,如图1所示。在主程序中,根据任务延时量判断任务是否就绪,各任务轮循占用CPU时间,由任务延时量控制任务执行频度及CPU关照度,而任务延时量又由定时器T0中断控制。

图1 定时中断的多任务轮循程序架构流程图

基于定时器中断的多任务轮循架构中,子任务的执行依靠主程序任务调度来实现,子任务不能设计成死循环流程。正因为各任务不抢占CPU,所以程序设计不用考虑现场保护问题,简化了程序设计。程序整体架构有定时器固定节拍中断,该节拍需满足最快任务执行频度需要。定义定时中断频度,由执行频度要求最快的任务确定,太高会降低CPU运行效率,太低任务频度不好分配,一般低于200Hz即可。本文采用50Hz。对于按键扫描程序模块,每秒按50次频度执行即可,LCD1602和实时时钟数据读取模块可以按每秒3次频度执行即可。

2.1 调用函数和宏定义

/*代码说明:这里通过宏定义,在头文件中把易变参数进行定义,这样使得程序容易修改,一改全改,便于移植。*/

2.2 定时器设置及初始化

/*代码说明:定时中断在这里就是心脏,依靠定时中断完成任务延时量的修改,从而实现不同任务运行频度控制。*/

2.3 定时器中断服务

任务执行频度由任务延时量task_delay[ID]控制,各任务延时量在定时中断中减一,直到延时量为零,相关任务就绪。“ID”表示各任务代号。任务调度过程就是对任务延时量检测过程,只有任务延时量为零时,CPU从其它任务中返回后立即执行相应的任务,由于不同任务延时量不同,从而实现不同任务具有不同的执行频度而相互不受时间影响。这里必须满足一个条件,就是每个任务执行一次的时间不能太长,不能超过一次定时中断时间,否则任务之间执行频度会有影响,对于50Hz的中断频率,每个任务执行时间最好不超过20ms,即CPU光顾一次任务时间要在20ms以内,这样就可以保证任务之间相互完全不受影响。

定时器中断服务等待任务就绪代码如下:

/*代码说明:在定时中断服务中,执行的任务必须很简短,重置定时器初值,把大于0的任务延时量减1,该定时中断作为心脏跳动,不断进出运行,为了节省CPU时间,该中断任务越简单越好。*/

2.4 指向函数的指针函数

2.5 任务切换

任务切换在主程序main()中完成,系统初始化之后,在一个大循环中,判断各任务的延时量是否为零,当任务延时量为零时,表示该任务就绪,当前一个任务主动放弃CPU之后,马上启动就绪的新任务。各任务之间不具有抢占功能,因此不用考虑堆栈与保护。

主程序服务及任务切换代码如下:

/*代码说明:根据任务延时量是否为零选择执行就绪任务,任务执行完成后返回再恢复设定的延时量;下划线表示任务执行的频度,即每秒钟执行多少次。各个不同的任务,根据需要,设定不同的延时量,延时量在定时中断中逐步减一归零,每个任务必须主动放弃CPU,正因此,各任务执行时间最好不要超过定时中断节拍时间单位,本文为20ms,否则将影响其它任务运行。*/

2.6 任务过程设计

/*代码说明:任务延时量为零时,就绪任务执行,任务过程可以根据需求设置若干个。例:数码管显示模块可以放在任务0执行,按键扫描程序模块放在任务1执行。*/

由此可见,系统按完整过程(最小作业单元)自动切换任务,不需保留临时现场数据,不需定时被动切换,不需额外的调度表。与单任务编程相比,多任务编程也没有占用系统任何额外资源,其结构和代码的可读性也没有较大的改变。

3. 结语

单片机多任务编程方法可归纳为:(1)在单片机多任务编程中,各任务依次排成队列轮流执行;(2)每次执行任务只调用其一个过程来执行,可保证各任务间最快速地切换;(3)各任务、过程间使用全局变量共享或交换数据,避免各种参数传递。

在过去采用传统方法设计复杂的单片机系统过程中,人们容易发现系统交叉调用多,重复代码多,系统运行效率差,逻辑容易混乱且难以调试。鉴于此,需要探索一个结构清晰,易调试,任务明确且可重用、提高开发效率,无相互调用,无重复代码的系统。采用定时中断的多任务轮循程序架构,与传统设计相比,基于该架构的系统产品消耗硬件资源少,运行效率高,其硬件功能更多以软件取代,所以运行更稳定,易维护,性价比高,取得了更高的经济效益。

[1]刘明路,王亮生,李世煜.基于RTX51的单片机软件设计[J].单片机与嵌入式系统应用,2002(3).

[2]欧伟明.面向嵌入式系统设计的RTX51[J].应用技术研究,2007(5).

[3]周程.RTX51 Tiny在核数据采集系统中的应用[J].核电子学与探测技术,2008,599-610.

[4]刘光德,林莘,王群.基于RTX51嵌入式实时操作系统的智能称重仪表的研究[J].科技应用,2004,7-9.

[5]KEIL Software,Inc.《RTX51 Real-time Kernel》[EB/OL].http://www.keil.com/rtx51,2004.

猜你喜欢
多任务频度中断
基于中心化自动加权多任务学习的早期轻度认知障碍诊断
基于FPGA的中断控制器设计*
跟踪导练(二)(5)
千里移防,卫勤保障不中断
眨眼频度可判断烟瘾大小
基于判别性局部联合稀疏模型的多任务跟踪
基于多任务异步处理的电力系统序网络拓扑分析
一类完全由内积构造的多任务核的几个性质
铜绿假单胞菌MIC分布敏感百分数与抗菌药物使用频度相关性研究
FPGA内嵌PowerPC的中断响应分析