陈 海 陈宇珂 潘泽森 丁效军 张兴安
基于实时操作系统的ATmega128串行通信驱动程序设计*
陈 海①陈宇珂②*潘泽森②丁效军②张兴安③
目的:基于实时操作系统uCOS-II进行ATmega128串行通信驱动程序设计,作为智能化静脉麻醉靶控模块通信的一部分,与药物注射机械控制系统协同运行,以提高整个药代动力学目标控制注射系统的运行效率和实时性。方法:根据ATmega128微处理器USART特点,采用信号量、消息邮箱及环形缓冲队列,设计串口通信驱动模块。结果:串口驱动通信模块采用信号量、消息邮箱及环形缓冲区解决CPU快速处理和外部慢速通信接口的速度配合问题,并利用信号量和消息邮箱,实现串口通信中断服务与数据处理任务间数据传输的同步性和实时性。结论:通过实验验证了在多种不同通信速率下串行通信驱动模块数据传输的可靠性,该传输模块数据传输具有误码率低、传输稳定可靠的特点。
实时操作系统uCOS-II;信号量;消息邮箱;串行通信;驱动程序;静脉麻醉输注系统
[First-author’s address] Department of Radiation Oncology, General Hospital of Guangzhou Military Command of PLA, Guangzhou 510010, China.
医疗设备在嵌入式应用中,使用实时操作系统(real time operator system,RTOS)可以加快系统程序的开发速度,更加合理和有效地使用系统各类资源,缩短系统开发时间,使得整个系统的实时性、可靠性得到极大的保证。据EEtimes杂志统计,目前嵌入式市场常用的RTOS有FreeRTOS、Microsoft XP Embedded、VxWorks、Linux以及RTX等数十种,其中uCOS是一个轻量级的实时操作系统内核,具有任务管理、时间管理、信号量及内存管理等功能,可以根据系统开发需要移植裁剪,方便地移植到各种嵌入式系统上使用[1-3]。为此,本研究基于实时操作系统uCOS-II进行ATmega128串行通信驱动程序设计。
1.1实时操作系统uCOS-II
根据相关微处理器的特点对实时操作系统uCOSII的源代码根据功能需要进行合适的裁减,设置与处理器及编译器相关代码,可以非常快捷地在不同框架微处理器、微控制器和数字信号处理器上应用。自1992年以来,uCOS以其高度的可靠性、鲁棒性以及安全性,在家用电子设备、医疗仪器及航空航天电子产品各种应用中被广泛使用[4-6]。
1.2串口通信驱动模块设计
随着嵌入式系统的发展,系统间的数据通信越来越频繁和重要,尤其是串口通信所需接口数少,接线简单,可实现远距离通信。但是uCOS-II仅是一个实时多任务操作系统内核,需要根据嵌入式微处理器与各种外设扩展的实际情况,利用实时内核提供的功能,结合硬件特点,编写应用程序接口函数,进行硬件接口驱动模块程序设计。ATmega128通用异步同步串行通信接口USART是单片机与外部设备进行串行信息交换的重要组件,基于USART的RTOS串口通信驱动模块,需结合uCOS-II嵌入式操作系统,基于信号量、消息邮箱,利用环形缓冲区数据结构特点进行设计。
本研究组以临床国人静脉麻醉药代动力学参数研究为基础,结合微机电、嵌入式新技术设计便携式静脉麻醉智能仪器。系统主要从嵌入式系统的硬件设计、系统软件设计和应用层软件设计三个方面开展研发工作,系统硬件结构如图1所示。
2.1系统构建
2.1.1ATmega128微处理器及其USART硬件模块
美国ATMEL公司ATmega128是一款基于AVR RISC(精简指令集)结构的CMOS微处理器,具有低成本、低功耗及高性能的特点[7-8]。ATmega128单片机稳定性极高,应用非常广泛,在工业控制电子设备领域、通信网络设备以及智能化电子医疗仪器等嵌入式领域中得到广泛应用[9-16]。
ATmega128具有2个可编程的通用同步、异步串行接收器和转发器:USART0和USART1,USART0和USART1具有不同的I/O寄存器。ATmega128串行通讯硬件的主要特点有:①串行接收寄存器和发送寄存器互相独立,可以非常方便地进行全双工操作;②可灵活选择异步传输和同步传输模式,支持多个数据位;③奇偶校验操作、数据过速及帧错误检测得到硬件支持,可提高数据传输的准确性;④硬件提供发送结束中断、发送数据寄存器空中断和接收结束中断[17]。
2.1.2uCOS-II实时操作系统
uCOS-II是开放的占先式实时系统内核,通过已经准备就绪的高优先级任务,剥夺正在运行的低优先级任务的CPU使用权,保证了高优先级任务的实时运行。uCOS-II将信号量、消息队列、消息邮箱、事件标志组和互斥信号量统一看作事件,系统根据以上事件发生与否决定各个任务的状态,事件可以是系统中断发出的,也可以由其他任务发出。uCOS-II事件来自中断服务函数、系统延时时间到达设置时间值和其他任务发送三个方面,信号量和消息邮箱是系统设计中常用的事件,在中断与任务和任务与任务同步以及数据传递过程中应用最为广泛[18-19]。
2.1.3信号量
uCOS-II的信号量(semaphores)广泛用于任务间对共享资源的互斥访问,任务与中断服务程序间、任务与任务间的同步,其提供了行为同步时刻的信息。uCOS-II的信号量包括互斥信号量和计数信号量两种:①互斥信号量是一个二值信号,只能是0或1,用于资源同步,在程序中实现对共享资源的互斥访问;②计数信号量取值是一个16位无符号整形数,计数范围为0~65535,计数信号量不仅可用于资源同步,还可实现任务之间、中断与任务之间的同步。计数信号量标志同步事件的发生次数或者已发生事件的数量,表达资源的可用数量。
图1 ATmega128微处理器和uCOS-II实时操作系统硬件结构图
uCOS-II信号量相关函数包括OSSemCreate()、OSSemPend()和OSSemPost()3个。OSSemCreate()函数初始化信号量,OSSemPend()函数由于任务中等待信号量,OSSemPost()函数在任务或中断服务程序中发送信号量。信号量最好在系统初始化过程中创建,并根据需要给信号量赋初值。
2.1.4消息邮箱
消息用于任务之间传递信息,当同步过程中需要传输具体内容时就不能使用信号量,可以选择消息邮箱通过内核服务发送消息。uCOS-II的消息邮箱(message mail boxes)基于事件控制块结构OS_ EVENT,是事先定义好的数据结构,包含需要传递的参数,一个邮箱存放一条信息。uCOS系统中OSMboxCreate()进行邮箱初始化(initialize),或者称为建立邮箱(create),初始值为NULL,也可以包含一条信息,使其最开始就初始化为包含一条消息;OSMboxPost()函数将消息放入邮箱,如果该邮箱已有数据,则返回邮箱已满错误码;如果邮箱为空,有任务在等待消息邮箱的消息,则马上通过内核服务将消息传递给等待消息的任务列表中优先级最高的任务,然后进行任务调度,判断当前运行的任务是否仍为处于最高优先级就绪态,否则将消息发送给最先等待的任务。OSMboxPend()函数允许用户定义超时等待时间,避免无休止等待。
2.1.5环形队列缓冲区
在计算机语言中队列是常用的一种数据结构,在数据传输和处理中应用广泛,将队列采用环形缓冲技术构造为首尾相互连接的结构形式,形成环形缓冲区。环形缓冲区在嵌入式系统中具有重要作用,尤其是在多任务系统中,运用信号量实现缓冲区的互斥访问,可以有效提高程序效率,避免任务间竞争,防止数据读写错误[20]。
2.2串口通信模块软件设计
在完成uCOS-II实时系统基于ATmega128移植的基础上,根据静脉麻醉靶控模块与输注控制模块之间以串行通信进行数据交换的需求,进行USART设备驱动程序设计。由于uCOS-II作为实时内核,提供了实时操作系统内核基本功能,但在进行项目系统整体设计时,需要根据硬件结构和功能需求进行驱动及应用程序设计[21-22]。
在实时操作系统中,串行通信接口是一种异步通讯设备,在进行接收发送程序设计时,加入软件缓冲区,在串口发送和接收数据时,系统有更重要任务需要处理时,来不及处理这些数据,可先将数据存入缓冲区,使数据不会发生丢失。为此,从内存中开辟2个定义为环形队列的数据结构作为缓冲区,分别作为串口数据收发的发送缓冲区和接收缓冲区。发送和接收环形缓冲区由首尾相接的数据队列、环形缓冲区字节计数器、指向环形缓冲器中将被放置下个字节的指针和指向环形缓冲区将被读取的下一字节的指针4个要素。
本研究采用uCOS-II实时操作系统信号量实现串口通信发送、接收任务和中断服务程序的同步,用户任务使用串口通信时不必关心串口的实现,只需将需要发送的数据写入发送缓冲区,串口自行从发送缓冲区取出数据,调用中断发送程序送出数据。串口接收到的数据通过接收中断服务程序接收存入接收缓冲区中,每接收到一个字节,向等待接收缓冲区数据的应用程序发信号。
2.2.1USART初始化
实时系统中USART通信模块初始化包括了模块中所有变量的初始值设置,在系统调用用户任务创建函数前的调用,一般可以在串口任务创建时调用。初始化时环形缓冲区读写指针一般初始化为0,指向环形缓冲区队列头部。数据接收任务中的接收信号量在初始化时设置为0,数据发送信号量初始化值可以根据发送环形缓冲队列的大小进行设置。
完成所有相关变量的初始化后,进行USART硬件初始化设置,设定传输模式、波特率、数据帧格式以及开启发送接收中断。USART0的控制和状态寄存器有UCSR0A,UCSR0B,UCSR0C,波特率寄存器为UBRR0,即UBRR0H和UBRR0L,数据收发寄存器为UDR0。初始化时,或者在改变USART的设置时必须在无数据传输的情况下进行,TXC标志位检验一个数据帧发送是否完成,RXC标志位检验接收缓冲器是否还有数据未读出,在每次发送数据即写发送数据寄存器UDR前,TXC标志位必须清零。
2.2.2USART串行通信模块读取操作
串口通信数据接收过程包括:USART接收器接收到一个数据帧后触发接收中断,中断服务程序ISR读取接收到的内容并保存,经过一次或若干次ISR完成通信帧的接收(拼装数据帧),发送信号触发处理和解释通信内容的任务,然后根据处理结果触发其他相关任务。
ATmega128启动USART接收器通过置位UCSRB寄存器的接收允许标志位RXEN完成,如果USART接收器接收检测到有效起始位,便启动数据接收,直到接收到一帧数据的第一个停止位为止,然后将接收到的数据传入接收移位寄存器。如有第二个停止位,则会被接收器忽略。这时移位寄存器中的内容将转移到USART硬件接收缓冲器中。USART接收器通过接收结束标志RXC表明硬件接收缓冲器中是否含有未读出的数据。RXC为1时,缓冲器中有数据,为0时接收缓冲器为空。在USART硬件初始化中置位UCSRB的接收结束中断使能位RXCIE后,只要RXC标志位置1,在全局中断使能的情况下,将产生USART接收结束中断,在中断服务程序中读取UDR寄存器就可以获得接收缓冲器的内容并清除RXC标志。ATmega128微处理器USART接收器具有的帧错误FE、数据溢出DOR、奇偶检验错UPE标志位于寄存器UCSRA中,在中断服务程序中必须在接收缓冲区读取之前先读取,通过这3个错误标志位的判断,可以更好地保证接收数据的准确性。
基于uCOS-II的串口读写模块由接收数据读取任务和接收中断服务程序两部分组成。在串口硬件接收数据完成后,串口数据接收中断服务程序ISR首先读取寄存器UCSRA后,再读取数据寄存器UDR中接收到的数据。判断有无数据帧、奇偶检验及溢出错误,同时通过比较环形队列缓冲区中当前字节数的变量RxBuffer,判断环形队列接收缓冲区是否已存满。如果未满,则将接收数据写入串口通信模块数据接收环形缓冲区写入指针指向的位置,数据写入后环形缓冲区写入指针和指示变量RxBuffer加1,如果写入指针等于缓冲区大小,则置0。完成上述操作后,通过发送接收完成信号量启动接收数据读取任务。接收数据读取任务启动后处于等待状态,等候数据接收完成信号量的到来,此时OSSemPend()函数中的超时等待量设为0,表示无限期等待。任务接收到接收完成信号量后,将环形缓冲区当前读取指针指向的数据读出,随后指针加1,如果指针数等于缓冲区大小,则重新置0,重新指向环形缓冲区头。串行通信数据读取任务流程和中断服务程序如图2、图3所示。
图2 串行通信数据读取任务流程图
图3 读取中断服务程序流程图
在整个接收过程中,USART一旦接收到数据,硬件将触发接收中断,如果这个时候环形缓冲区数据已满,需要丢弃接收到的字符,所以在缓冲区的大小设置时,需要根据实际合理设置,这样可以降低数据丢失,又避免设置太大导致内部存储空间的浪费,增加系统开销。
2.2.3USART串行通信模块发送操作
ATmega128微处理器通过置位UCSRB寄存器的发送允许位TXEN使能USART数据发送,任务根据需要写入数据到发送缓冲器,启动数据发送。USART在移位寄存器空闲或前一帧数据的最后一个停止位传送结束,将发送缓冲器中的数据加载到移位寄存器,完成数据发送。
USART发送器有数据寄存器空标志UDRE和数据传输结束标志TXC,这2个标志位都可以产生中断,在进行发送模块设计时,本研究通过数据传输结束中断发送数据。带环形缓冲区和超时信号量的串口发送模块包括串口数据发送任务TxTask和串口数据发送中断服务程序TxISR两部分。在初始化时将发送信号量值设为缓冲区大小,环形队列缓冲区中无数据,并且关闭发送中断。系统功能模块启动TxTask任务用于发送数据时,串口数据发送任务在信号量上等待。如果发送信号量不为零表示缓冲区未满,用户任务可以向发送缓冲区中写入数据。如果写入的是发送缓冲区中的第一个字节,则UCSRB中TXCIE标志置1,允许发送中断,并将数据写入UDR寄存器。ATmega128串口数据发送完成后自动置位TXC,触发数据传输结束中断。然后,数据传输结束中断服务程序TxISR通过OSSemPost()发送信号量。当信号量事件块中信号量计数小于环形缓冲区设置值减1时,将发送缓冲区当前读取指针位置的数据写入UDR,否则结束数据传输,关闭中断。数据写入UDR后环形缓冲区读取指针加1,如果指针到达环形缓冲区尾端,则指针置为0重新指向缓冲区首端。TxISR从发送缓冲区中取出数据字节输出至UDR,数据传输完成操作,缓冲区中有数据的话将触发了下一次的发送中断,这样循环下去直到发送缓冲区中最后一个字节被发送任务取走。在TxISR服务程序向USART输出数据的同时,向发送信号量发信号,发送任务通过信号量事件块中的计数值,可以判断环形队列发送缓冲区中是否还有空间可写入数据。串行通信发送任务和中断服务程序如图4、图5所示。
图4 串行通信发送任务流程图
图5 发送中断服务程序流程图
基于uCOS-II实时操作系统的ATmega128串口通信模块,通过利用实时内核的任务调度功能以及信号量机制,实现串口收发接口模块化封装,使用方便,其设计思路和方法可以用于ATmega128其他外围硬件接口程序设计。该串口通信模块已作为智能化静脉麻醉靶控模块通信的一部分,与药物注射机械控制系统协同运行,可提高整个药代动力学目标控制注射系统的运行效率和实时性[22]。
[1]张文君,陈香兰,李曦.嵌入式实时操作系统的分析评测方法[J].计算机系统应用,2014,24(1):28-34.
[2]吕阿璐.基于RTX的大容量实时数据管理系统设计[J].计算机与现代化,2013(7):235-238.
[3]潘应进,朱子元.基于ThreadX实时操作系统的USB设备驱动开发[J].工业控制计算机,2016,29(2):30-32.
[4]郝玉胜,逯玉兰.基于嵌入式网络通信模块[J].计算机与现代化,2014(2):142-146.
[5]李化云.嵌入式实时操作系统在航天器软件中的应用研究[J].微计算机信息,2012,28(8):73-74.
[6]谢檬,张一宁,王娟.基于AVR单片机的电动执行器控制模块检测仪的设计[J].计算机测量与控制,2015,23(10):3570-3573.
[7]李运堂,吴进田,梁宏民,等.基于AVR的静压气体轴承性能检测装置控制系统设计[J].计算机测量与控制,2015,23(1):113-114.
[8]赵春雷,孙会琴.基于AVR单片机的肌电信号生物反馈测试仪的设计[J].医学装备,2012,25(12):6-9.
[9]刘晓军,蔡玉文,蔡玉武,等.基于AVR左心室磁悬浮辅助装置的转子测量系统[J].北京生物医学工程,2014,33(4):412-414.
[10]陈倩,严荣国,葛斌,等.基于玻意耳定律的模拟肺及其温度补偿系统[J].中国医学物理学杂志,2016,33(1):83-87.
[11]陈晓艳,高娜娜,黄华芳.数字式生物电阻抗与电阻抗断层成像测量系统[J].生物医学工程学杂志,2015,32(3):575-580.
[12]陈宇珂,张兴安,张延武,等.智能化静脉麻醉靶控系统的研制[J].中国医学装备,2005,2(8):22-23.
[13]潘佚,邱蕾.国产便携式血糖仪功能改进及低功耗设计[J].现代仪器与医疗,2013,19(1):38-40.
[14]孟倩,郑利星,郭红蕊,等.胎心声音存储回放系统设计[J].生物医学工程与临床,2013,17(2):184-186.
[15]吴北江,王洋,孙文桥,等.网络化平战两用数字心电信息系统的设计与实现[J].医疗卫生装备,2010,31(6):48-50.
[16]耿德根,宋建国,马潮,等.AVR高速嵌入式单片机原理与应用[M].北京:北京航空航天大学出版社,2003.
[17]晨风.嵌入式实时多任务软件开发基础[M].北京:清华大学出版社,2004.
[18]罗蕾.嵌入式实时操作系统及应用开发[M].北京:北京航空航天大学出版社,2005.
[19]林锐,韩永泉.高质量C程序设计指南[M].2版.北京:电子工业出版社,2003.
[20]袁家栋,殷兴辉.基于串口的高速信号传输[J].微电脑应用,2015,31(12):1-2.
[21]刘亚兵,马瑞卿,张庆超,等.基于FIFO的串口通信模式研究[J].计算机测量与控制,2014,22(7):2301-2303.
[22]陈宇珂,李爽,袁凯,等.基于LPC2478的三通道静脉麻醉输注系统设计[J].中国医学装备,2014,11(9):6-8.
Design of serial communication driver of ATmega 128 based on RTOS
CHEN Hai, CHEN Yu-ke, PAN Ze-sen, et al// China Medical Equipment,2016,13(11):98-103.
Objective: Based on real-time OS uCOS II, to design the serial communication driver module of ATmega128. Methods: Based on the characteristics of microprocessor ATmega128 USART, we use semaphores, message mailbox and circular buffer queue to design serial communication module. Results: serial port driver communication module use semaphores, message mailbox and circular buffer solution to handle the problems of speed matching between CPU and external communication interface, and also use the semaphores, mailbox to realize synchrony and real time between serial communication interrupt service and data processing tasks. Conclusion: Experiments verify the reliability of data transmission of the driver module for serial communication in a variety of different communication rate. The experiment shows that the transmission module with the characteristics of low error rate, stable and reliable transmission of data transmission.
Real time operation system uCOS-II; Semaphores; Message mailbox; Serial communication; Driving program; Intravenous anesthesia infusion system
陈海,男,(1968- ),本科学历,主管技师。解放军广州总医院放射肿瘤科,从事医疗设备维修及研发工作。
1672-8270(2016)11-0098-06
R197.324
A
10.3969/J.ISSN.1672-8270.2016.11.029
广东省科技计划(2012A032200023)“HL7标准三通道静脉麻醉输注系统关键技术研究”;广东省科技计划(2013B090500113)“智能化静脉麻醉靶控输注工作站的研制及产业化”
①解放军广州总医院放射肿瘤科 广东 广州 510010
②解放军广州总医院医学工程科 广东 广州 510010
③解放军广州总医院麻醉科 广东 广州 510010
chenyuke@hotmail.com
2016-08-30