论文部分内容阅读
摘要:随着嵌入式技术的不断发展,嵌入式软件开发也越来越重要。现代实时系统是在多任务和任务间通信的基础上建立起来的。该文介绍了在VxWorks嵌入式实时操作系统下的多任务软件开发,阐述了多任务的特点及任务调度算法、任务间通信机制。并给出了实时多任务在信号处理软件的设计思路。
关键词:嵌入式系统;任务优先级;实时多任务;任务调度
中图分类号:TP316 文献标识码:A 文章编号:1009-3044(2013)17-4009-04
1 VxWorks操作系统简介
VxWork操作系统是美国风河公司推出的高性能实时多任务操作系统,已经成功的应用在航天、航空、通信、军事、医疗等领域中。
VxWorks系统的特点:
1)高性能的微内核设计
微内核设计使VxWorks缩减了系统开销并加速了对外部事件的反应。VxWorks内核最小为8KB。
2)高效的任务管理
具有256个优先级;具有优先级抢占和时间片轮转调度;快速、准确的上下文切换;快速灵活的任务间通信;三种信号量,包括二进制、计数、有优先级继承特性的互斥信号量;POSIX管道、消息队列和信号。
3)良好的可移植性
VxWorks将依赖于硬件的低级代码设计成板级支持包(BSP),移植高级代码时,只要改变相应的板级支持包即可,无需修改操作系统和应用程序。
4)良好的可裁剪性
VxWorks系统由上百个模块组成,各个模块短小精炼且相对独立,用户可以自由裁剪和配置系统,以适用自己的需求。
5)网络组件
VxWorks系统支持工业标准TCP/IP网络协议族,支持可选的WindNet产品,包括SNMP、OSPF、STREAMS等。
6)支持POSIX 1003.1b标准,还支持POSIX 1003.1b的实时扩展
7)灵活和快速的I/O文件特性
2 多任务
多任务机制允许一组独立的任务按照所设定的调度关系“并行”运行,每个任务运行在自己的线程,并且拥有一套自己的系统资源。VxWorks的内核Wind就提供了这样的多任务环境。
2.1 多任务的特点
其实多任务的各个线程并非是真正意义上的并行运行,而是按照所设定的一套调度方案交替运行的。每个任务都拥有自己的系统资源、占用各自的CPU,这些就是任务的上下文,任务交替时,任务上下文将保存到任务控制块中。
任务的上下文就是任务执行的位置、在CPU中使用的各种寄存器、任务中使用的所有堆栈等内容。
2.2 任务调度
要使多任务中各个任务都能得到有效的执行,就需要一套严格的调度算法来分配CPU的使用权。Wind内核提供了优先级抢占式算法和轮转调度算法,VxWorks的内核Wind默认使用优先级抢占式算法。
Wind内核提供了0~255共256个优先级,0为最高,255为最低。
1)基于优先级的抢占式任务调度算法
多任务中的每个任务都设定了不同的优先级,处于就绪状态的任务中,具有最高优先级的任务将被优先执行。如果有更高优先级的任务进入了就绪状态,则系统内核将立刻将当前正在执行的任务的上下文保存的任务控制块中,并从任务控制块中取出更高优先级的任务的上下文。
此算法保证了具有更高优先级的任务被执行,但当多个相同优先级的任务需要共享一台处理器时将可能会导致有些任务一直不能被执行。如果某个执行的任务永不阻塞,那么它将一直独占CPU,其它相同优先级的任务就没有机会执行。可以采用轮转式调度算法解决这一问题。
2)轮转式调度算法
轮转式调度算法为每个具有相同优先级且处于就绪状态的任务分配一个相同的时间片去运行。
可以通过调用函数kernelTimeSlice()来设置时间片的长度。
3)抢占上锁
在有些情况下,一个低优先级的任务中的某段代码须連续执行完毕,即执行这段代码时不允许其它任务抢占,可以通过调用函数taskLock()来禁止使用调度程序,等到该段代码执行完毕后调用函数taskUnlock()启用调度程序。
2.3 任务控制
3 任务间通信
VxWorks提供了一套多样的任务间通信方式,包括:
1)共享内存,主要是数据的简单共享。
2)信号量,用于基本的互斥和任务同步。
3)消息队列和管道,单CPU的消息传递。
4)Socket和远程过程调用,用于网络任务消息传送。
5)信号,用于异常处理。
实践中最常用的通信方式是信号量。信号量占用系统资源最少,是最快的任务间通信机制,也是解决任务间的互斥和同步的最主要的手段。
VxWorks提供了三种类型的信号量:
1)二进制信号量:使用得最多、最广,主要用于任务的同步和互斥;
2)互斥信号量:主要用于解决优先级继承、互斥问题、安全删除和回溯;
3)计数器信号量:用于资源的数目较多的情况。
二进制信号量能有效的对共享资源的访问进行互锁,来实现互斥,初始信号量为可用;当信号量用于同步时,等待信号量可用作任务继续执行的一个条件,信号量初始设为不可用,其它任务或中断服务程序通过释放信号量来表明本任务继续执行的条件已经满足。
互斥信号量主要用来保护共享资源。
计数器信号量可以统计信号量被释放的数量。如果一个计数器信号量被释放了N(N>0)次,那么这个计数器信号量就可以被获取N次。 4 软件设计
4.1 嵌入式软件开发模型
嵌入式实时软件开发流程与一般的软件开发过程基本一致。只不过将软件设计阶段分为了软件模型建立、任务分析、调度设计。
在模型建立阶段,应根据软件需求为系统建立一个结构模型。任务划分则是在这个模型的基础上按照系统功能或任务性质把系统分解为相对独立的任务集合。
任务调度也就是实现多个任务间的同步与互斥,根据系统的各个任务的约束条件或执行规则,选择适合的任务调度算法和实现任务间的同步与互斥的手段。
语言实现阶段就是编码阶段,即用指定的编程语言实现每个软件单元或软件模块。
软件编码完成后,则进入软件测试阶段,通过了单元测的软件模块方可进行软件集成,所有软件模块集成完毕后,进行软件集成测试,验证软件的功能、性能及接口。
在软件开发的每个阶段结束时,都要进行状态确认,即要对每个阶段的工作产品进行评审或会签确认,确认通过后方可进入下一阶段。
4.2 信号处理软件设计
本系统采用八通道信号采集,实现实时信号处理,最终通过网络及时将数据发送出去。所以本软件主要考虑多通道信号的实时采集、海量数据实时并行处理、数据实时传输。
通过任务划分,将本软件划分了以下几个任务:信号采集任务、信号处理任务、数据输出任务、键盘处理任务及显示任务。采集信号采用了中断方式通知软件信号采集完成。信号采集任务、信号处理任务、数据输出任务设置相同的优先级,键盘任务优先级最高,实时处理用户键盘操作,显示任务优先级最低。用信号量实现任务同步。信号处理软件设计模型如图2所示。
系统通过一块多通道采集板来采集信号,每采集一帧数据就产生一个中断,在中断服务程序中,释放一个二进制信号量(实现同步),信号采集任务接收到此信号量后,任务解除阻塞开始从采集板中读取数据,并将数据存入一个环形缓存,然后释放一个计数信号量,信号处理任务解除阻塞开始执行,从环形缓存中获取数据,进行信号处理,将处理的最终数据放到一段共享内存,释放一个二进制信号量(实现同步),数据传输任务解除阻塞,从共享内存中取得最终数据,按照规定的网络通信协议将数据打包,通过网络发送出去。这段共享内存采用二进制信号量进行互斥保护,避免访问冲突。显示任务实现状态监控,主要显示信号采集及处理过程中的一些状态变化;键盘处理任务能够实时响应用户的键盘操作。处理流程图见图3。
5 結束语
嵌入式实时系统软件设计的重要工作是多任务软件设计,做好任务划分、任务同步与互斥、任务间通信是多任务软件设计的关键环节。VxWorks系统提供的任务管理体制大大简化了多任务软件开发的难度,使它广泛的应用在各个领域。本设计已成功的应用在了工程实践中,实践表明软件运行可靠、性能稳定。
参考文献:
[1] 孔详营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社,2001.
[2] 王学龙.嵌入式VxWorks系统开发与应用[M].北京:人民邮电出版社,2003.
[3] WindRiver Systems Inc.VxWorks Programmer’s Guide 5.4[DB].1999.
[4] 刘尉悦.VxWorks操作系统及实时多任务程序设计[J].单片机及嵌入式系统应用,2001(5):12-14.
关键词:嵌入式系统;任务优先级;实时多任务;任务调度
中图分类号:TP316 文献标识码:A 文章编号:1009-3044(2013)17-4009-04
1 VxWorks操作系统简介
VxWork操作系统是美国风河公司推出的高性能实时多任务操作系统,已经成功的应用在航天、航空、通信、军事、医疗等领域中。
VxWorks系统的特点:
1)高性能的微内核设计
微内核设计使VxWorks缩减了系统开销并加速了对外部事件的反应。VxWorks内核最小为8KB。
2)高效的任务管理
具有256个优先级;具有优先级抢占和时间片轮转调度;快速、准确的上下文切换;快速灵活的任务间通信;三种信号量,包括二进制、计数、有优先级继承特性的互斥信号量;POSIX管道、消息队列和信号。
3)良好的可移植性
VxWorks将依赖于硬件的低级代码设计成板级支持包(BSP),移植高级代码时,只要改变相应的板级支持包即可,无需修改操作系统和应用程序。
4)良好的可裁剪性
VxWorks系统由上百个模块组成,各个模块短小精炼且相对独立,用户可以自由裁剪和配置系统,以适用自己的需求。
5)网络组件
VxWorks系统支持工业标准TCP/IP网络协议族,支持可选的WindNet产品,包括SNMP、OSPF、STREAMS等。
6)支持POSIX 1003.1b标准,还支持POSIX 1003.1b的实时扩展
7)灵活和快速的I/O文件特性
2 多任务
多任务机制允许一组独立的任务按照所设定的调度关系“并行”运行,每个任务运行在自己的线程,并且拥有一套自己的系统资源。VxWorks的内核Wind就提供了这样的多任务环境。
2.1 多任务的特点
其实多任务的各个线程并非是真正意义上的并行运行,而是按照所设定的一套调度方案交替运行的。每个任务都拥有自己的系统资源、占用各自的CPU,这些就是任务的上下文,任务交替时,任务上下文将保存到任务控制块中。
任务的上下文就是任务执行的位置、在CPU中使用的各种寄存器、任务中使用的所有堆栈等内容。
2.2 任务调度
要使多任务中各个任务都能得到有效的执行,就需要一套严格的调度算法来分配CPU的使用权。Wind内核提供了优先级抢占式算法和轮转调度算法,VxWorks的内核Wind默认使用优先级抢占式算法。
Wind内核提供了0~255共256个优先级,0为最高,255为最低。
1)基于优先级的抢占式任务调度算法
多任务中的每个任务都设定了不同的优先级,处于就绪状态的任务中,具有最高优先级的任务将被优先执行。如果有更高优先级的任务进入了就绪状态,则系统内核将立刻将当前正在执行的任务的上下文保存的任务控制块中,并从任务控制块中取出更高优先级的任务的上下文。
此算法保证了具有更高优先级的任务被执行,但当多个相同优先级的任务需要共享一台处理器时将可能会导致有些任务一直不能被执行。如果某个执行的任务永不阻塞,那么它将一直独占CPU,其它相同优先级的任务就没有机会执行。可以采用轮转式调度算法解决这一问题。
2)轮转式调度算法
轮转式调度算法为每个具有相同优先级且处于就绪状态的任务分配一个相同的时间片去运行。
可以通过调用函数kernelTimeSlice()来设置时间片的长度。
3)抢占上锁
在有些情况下,一个低优先级的任务中的某段代码须連续执行完毕,即执行这段代码时不允许其它任务抢占,可以通过调用函数taskLock()来禁止使用调度程序,等到该段代码执行完毕后调用函数taskUnlock()启用调度程序。
2.3 任务控制
3 任务间通信
VxWorks提供了一套多样的任务间通信方式,包括:
1)共享内存,主要是数据的简单共享。
2)信号量,用于基本的互斥和任务同步。
3)消息队列和管道,单CPU的消息传递。
4)Socket和远程过程调用,用于网络任务消息传送。
5)信号,用于异常处理。
实践中最常用的通信方式是信号量。信号量占用系统资源最少,是最快的任务间通信机制,也是解决任务间的互斥和同步的最主要的手段。
VxWorks提供了三种类型的信号量:
1)二进制信号量:使用得最多、最广,主要用于任务的同步和互斥;
2)互斥信号量:主要用于解决优先级继承、互斥问题、安全删除和回溯;
3)计数器信号量:用于资源的数目较多的情况。
二进制信号量能有效的对共享资源的访问进行互锁,来实现互斥,初始信号量为可用;当信号量用于同步时,等待信号量可用作任务继续执行的一个条件,信号量初始设为不可用,其它任务或中断服务程序通过释放信号量来表明本任务继续执行的条件已经满足。
互斥信号量主要用来保护共享资源。
计数器信号量可以统计信号量被释放的数量。如果一个计数器信号量被释放了N(N>0)次,那么这个计数器信号量就可以被获取N次。 4 软件设计
4.1 嵌入式软件开发模型
嵌入式实时软件开发流程与一般的软件开发过程基本一致。只不过将软件设计阶段分为了软件模型建立、任务分析、调度设计。
在模型建立阶段,应根据软件需求为系统建立一个结构模型。任务划分则是在这个模型的基础上按照系统功能或任务性质把系统分解为相对独立的任务集合。
任务调度也就是实现多个任务间的同步与互斥,根据系统的各个任务的约束条件或执行规则,选择适合的任务调度算法和实现任务间的同步与互斥的手段。
语言实现阶段就是编码阶段,即用指定的编程语言实现每个软件单元或软件模块。
软件编码完成后,则进入软件测试阶段,通过了单元测的软件模块方可进行软件集成,所有软件模块集成完毕后,进行软件集成测试,验证软件的功能、性能及接口。
在软件开发的每个阶段结束时,都要进行状态确认,即要对每个阶段的工作产品进行评审或会签确认,确认通过后方可进入下一阶段。
4.2 信号处理软件设计
本系统采用八通道信号采集,实现实时信号处理,最终通过网络及时将数据发送出去。所以本软件主要考虑多通道信号的实时采集、海量数据实时并行处理、数据实时传输。
通过任务划分,将本软件划分了以下几个任务:信号采集任务、信号处理任务、数据输出任务、键盘处理任务及显示任务。采集信号采用了中断方式通知软件信号采集完成。信号采集任务、信号处理任务、数据输出任务设置相同的优先级,键盘任务优先级最高,实时处理用户键盘操作,显示任务优先级最低。用信号量实现任务同步。信号处理软件设计模型如图2所示。
系统通过一块多通道采集板来采集信号,每采集一帧数据就产生一个中断,在中断服务程序中,释放一个二进制信号量(实现同步),信号采集任务接收到此信号量后,任务解除阻塞开始从采集板中读取数据,并将数据存入一个环形缓存,然后释放一个计数信号量,信号处理任务解除阻塞开始执行,从环形缓存中获取数据,进行信号处理,将处理的最终数据放到一段共享内存,释放一个二进制信号量(实现同步),数据传输任务解除阻塞,从共享内存中取得最终数据,按照规定的网络通信协议将数据打包,通过网络发送出去。这段共享内存采用二进制信号量进行互斥保护,避免访问冲突。显示任务实现状态监控,主要显示信号采集及处理过程中的一些状态变化;键盘处理任务能够实时响应用户的键盘操作。处理流程图见图3。
5 結束语
嵌入式实时系统软件设计的重要工作是多任务软件设计,做好任务划分、任务同步与互斥、任务间通信是多任务软件设计的关键环节。VxWorks系统提供的任务管理体制大大简化了多任务软件开发的难度,使它广泛的应用在各个领域。本设计已成功的应用在了工程实践中,实践表明软件运行可靠、性能稳定。
参考文献:
[1] 孔详营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社,2001.
[2] 王学龙.嵌入式VxWorks系统开发与应用[M].北京:人民邮电出版社,2003.
[3] WindRiver Systems Inc.VxWorks Programmer’s Guide 5.4[DB].1999.
[4] 刘尉悦.VxWorks操作系统及实时多任务程序设计[J].单片机及嵌入式系统应用,2001(5):12-14.