μC/OS-II在总线式数据采集系统中的应用
扫描二维码
随时随地手机看文章
μC/OS-II是一个源代码开放的实时操作系统,可移植、可固化(嵌入到产品中成为产品的一部分)、可裁减,属于占先式实时内核。执行时间可确定(即函数调用与服务的时间是可知的,不依赖于应用程序的多少),支持现有大多数型号的8位、16位、32位MCU/MPU,已被广泛应用于交换机、路由器、过程控制、汽车业、办公自动化、计算机外设以及民用消费类产品等,具有稳定的可靠性。把μC/OS-II应用在总线式数据采集系统中,可使该系统比以往的前后台系统能够更加稳定地工作,而且在一定程度上满足了监控测量实时性的需求。
1 总线式数据采集系统的组成与功能
随着社会信息化程度的提高,人们对重要工业及生活设施智能化监控的要求也越来越高。应这种需求,设计了这套总线式数据采集系统。该系统采用总线巡检方式,对监测对象进行数据采集与处理,系统硬件以模块化结构,实现32/64/128路模拟或数字量的集中监测,适用于各种标准现场一次仪表或二次仪表数据测量与控制。整机采用先进的微机处理技术和通信控制技术,并嵌入实时处理内核,智能化程度较高,工作性能更加稳定,测量精度高,通用性强。
1.1 系统组成
该系统的硬件组成如图1所示。
现场监测通道状态以总线方式,通过总线处理单元传送到中央控制单元进行数据采集与处理,其中MCU采用具有10位A/D转换器的80C196KB。
1.2 系统功能
该系统可以对各通道的工作参数、状态进行即时修改设定,并可以通过面板LED实时显示32/64/128路通道的工作状态,同时各通道的实时参数通过LCD进行逐屏显示。对发生报警的信道可以通过打印处理单元进行打印输出、声光报警及显示。该系统采用总线巡检方式,对各信道工作状态进行远程数据采集并进行集中数据处理。为进一步满足智能化管理的需要,具有和计算机通信的功能,可以实现监测数据的共享。同时,也可以通过计算机对各信道的工作状态进行设置,进一步增强了该系统的智能化管理能力。
2 μC/OS-II在系统中的应用
该系统若采用以往的前后台式工作方式,即后台为主应用程序,前台为中断处理程序;通常情况下执行主程序,若有中断发生时,则转向前台处理中断服务程序。前台需要处理定时显示系统信息子程序,或按键中断处理子程序,然后根据中断程序中所置的状态标志,由主程序判断其状态标志后再进入相应的子程序,也就是主程序采用状态查询方式进行工作。这样在一定程度上不能保证整个系统测量的实时性。因为主程序在执行其它程序时,不可能随时去检测这些状态标志,尤其是处理多信道A/D采样计算时,耗时较多。当工作的信道增加或减少时,这种现象则表现得尤为明显,而且难以实现并行操作的相互通信。在主程序的各个子模块中,有需要横向通信联系交换信息的,这在一般的前后台系统中是很困难的,且存在系统不稳定的隐患。实时内核兼具实时多任务性和稳定性,因此考虑采用实时内核。μC/OS-II是一个源码开放的实时内核,且又有许多成功的先例可供参考,可针对不同的MCU/MPU,通过条件编译裁减其内核的大小,以满足系统要求。μC/OS-II是占先式内核,总是运行就绪条件下优先级最高的任务。最大可以管理64个任务,其中保留8个给系统,故应用程序最多可以有56个任务。鉴于许多成功先例和系统成本,采用了80C196KB作为系统的MCU。通过实验,基本满足了系统所要求的实时性。
2.1 开发实时内核的流程
开发实时内核的流程如图2所示。
[!--empirenews.page--]
2.2 内核的移植
内核的移植也就是使实时内核能够在某个微处理器或微控制器上正常运行。移植工作包括以下几个内容:
(1)在OS_CPU.H中用#define定义三个宏,声明C96中能够识别的数据类型和堆栈的增长方向。
(2)在OS_CPU.C中用C语言重新编写以下几个函数:OSTaskStkInit、OSStartHighRdy、OSTaskCreateHook、OSTaskSwHook、OSTaskDelHook、OSTaskStatHook、OSTimeTickHook。
(3)在OS_CPU.ASM中编写几个汇编语言函数LoadCtx()、OSCtxSw()、OSIntCtxSw()、OSTickISR()。
2.3 实时内核在应用中应注意的问题
一个实时系统的软件由实时操作系统加上应用程序构成。应用程序与操作系统的接口通过系统调用来实现。用80C196KB作为系统的MCU,只能用内部RAM作为TCB和所有系统存储器(含各种控制表)以及各个任务的工作和数据单元。因此一定要注意以下几点:
(1)为各个任务分配各自的堆栈区,该堆栈区既作为任务的工作单元,也作为任务控制块的保护单元。
(2)系统的任务控制块只存放各任务的堆栈指针,而任务的状态均存放于任务堆栈中。在一个任务退出运行时,通过中断把它的状态进栈,然后把它的堆栈指针保存于系统的TCB中;再根据优先级取出优先级最高的已就绪任务的堆栈指针SP映象值送入SP中;最后执行中断返回指令转去执行新任务。
(3)各任务的数据和工作单元尽量用堆栈实现,这样可以允许各任务使用同一个子程序。使用堆栈实现参数传递并作为工作单元,而不使用绝对地址的RAM,可实现可重入子程序。该子程序既可为各个任务所调用,也可以实现递归调用。
2.4 应用μC/OS-II实时内核的主要部分
(1)任务的分配
实时系统中的任务有别于前后台系统中的子程序模块,任务是处理机按程序处理数据的过程,是个动态的概念。一般一个任务对应于一段独立的主程序,它可能调用各种子程序,并使用各种系统资源如中断、外设等,以完成某种选定的功能,且允许多个任务并行。根据该系统的性能指标和技术要求,可对系统进行如下的任务划分:按键中断、LCD显示、串行通信、打印与报警、信道巡检A/D采样与数据处理、系统信息显示、系统工作参数测量、电源切换与充电管理共八个任务。
(2)任务的调度
μC/OS-II的任务调度是按优先级进行的,根据各任务的实时性要求及重要程度,分别置它们的优先级为4、9、8、7、6、11、10、5。其中0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRIO-2、OS_LOWEST_PRIO-1、OS_LOWEST_PRIO这几个优先级保留以被系统使用。优先级号越低,任务的优先级越高。这样程序之间的通信可以通过按键中断置标志来实现,其中按键中断的优先级最高。当其它任务运行时,按键中断将使得系统服务转向运行按键中断处理子程序ISR。当中断处理子程序运行完后,转向判断就绪状态任务的优先级别。如果发现有比中断前任务优先级更高的任务,则转向执行该任务。先判断其运行标志,如果是‘非’,则又等待。再重复上述过程。如果在执行完ISR后发现没有比中断前任务优先级更高的,则转向中断前的子程序继续运行。该系统的软件处理没有采用优先级转换的方法,而是采用状态置位判断的方法,这样可以减少程序的复杂性。
(3)任务间的通信
任务间通信最简便的方法是使用共享数据结构。虽然共享数据区法简化了任务间的信息交换,但是必须保证每个任务在处理共享数据时的排它性,以避免竞争和数据的破坏。通常与共享资源打交道时,使之满足互斥条件最一般的方法有以下几种:
·关中断;
·使用测试并置位;
·禁止任务切换;
·利用信号量。
在本系统中采用了前两种。关中断是一种最简单快捷的方式,也是在中断服务子程序中处理共享数据结构的唯一方法。要注意的是:关中断的时间要尽量短,以免影响操作系统的中断处理。其应用模式如下:
void Function(void)
{
OS_ENTER_CRITICAL();
…… /*在此处理共享数据*/
OS_EXIT_CRITICAL();
}
测试并置位方式需要有一个全局变量,约定好先测试该变量;如果是约定的数值,则执行该任务,否则不执行该任务。这种方法称测试并置位(TEST-AND-SET),或TAS。其应用程序如下:
Disable interrupts /*关中断*/
If ('Access Variable' is 0){ /*若资源不可用,标志为0*/
Set variable to 1; /*置资源不可用,标志为1*/
Reenable interrupts; /*重开中断*/
Access the resource; /*处理该资源*/
Disable interrupts; /*关中断*/
Set the 'Access Variable' back to 0;/*清资源不可使用,标志为0*/
Reenable interrupts; /*重新开中断*/
}else { /*否则*/
Reenable interrupts; /*开中断*/
/*资源不可使用,以后再试*/
}
(4)时钟节拍 [!--empirenews.page--]
时钟节拍是特定的周期性中断,根据本系统的性能指标,取1毫秒。时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。另外,系统信息的定时显示需要系统每隔一定的时钟节拍显示一次。
(5)存储空间的分配
为了减少操作系统的体积,只应用操作系统的任务调度、任务切换、信号量处理、延时及超时服务几部分。这样可使该操作系统的大小减小到3~5KB,再加上应用程序最大可达50KB左右。
因为每个任务都是独立运行的,每个任务都具有自己的栈空间。这样可以根据任务本身的需求(局部变量、函数调用、中断嵌套等)来分配其RAM空间。
3 系统运行的实时性分析
在该系统中应用μC/OS-II实时内核,一是增强了系统运行的稳定性,更重要的是满足了系统测量所需的实时性要求。系统采用12MHz晶振,一条指令的周期是1微秒。以下时间的统计是将C语言编译为汇编语言后,根据其指令的多少而计算出来的。经统计如下:
·中断管理:共需3毫秒;
·内存管理:共需800微秒;
·信号量管理:共约4.5毫秒;
·任务管理:共需8毫秒;
·时钟管理:共需约20毫秒;
·杂项:约需1毫秒。
上述时间均是最大运行时间的大概统计,也就是均考虑有任务切换情况下的时间统计结果。在整个内核的应用上对一些函数进行了裁减,没有用的服务在预编译时屏蔽掉了,因此未计入统计时间。
用户定义函数:按键中断处理15毫秒,LCD显示一屏30毫秒,串行通信10毫秒,打印及声光报警400毫秒,信道巡检A/D采样与数据处理20毫秒,系统信息显示10毫秒,系统工作参数测量150毫秒,电源的切换与充电50毫秒。可见系统各任务中除打印所需时间较长外,其余任务所需时间都比较短。通过采用实时内核,在很大程度上保证了对信道扫描的定时性,即实时性要求。若采用前后台编程,在查询信道扫描的情况下,系统扫描信道的时间不能确定;随着信道数的变化,信道扫描的定时性很难得到保证,各种显示的定时性也比较差。
总之,随着各种应用电子系统的复杂化和系统实时性需求的提高,并伴随应用软件朝着系统化方向发展的加速,μC/OS-II实时内核一定会得到更大的发展。因为它可以使产品更加稳定可靠,开发过程更加规范,且缩短了开发周期。