为解决实时操作系统μC/OS-II串口通信设计中信号量、消息邮箱使用方法的问题,提出了一种以STM32V评估板为硬件平台和μC/OS-Ⅱ的串口通信程序设计方案。该方案采用Cortex-M3架构的ARM处理器STM32F103VB作为主控制芯片,ST3232作为串口通信电平转换器。软件设计部分描述了信号量、消息邮箱的应用场合和基本操作方法,通过信号量和消息邮箱的配合使用保证任务间的数据传输的同步性。给出了整个程序中的设计思路,程序开发使用STM32F103VB处理器自带的固件库,减少了繁琐的寄存器配置,降低了程序开发强度。实验验证了在2种不用通信速率下数据传输具有误码率低、传输稳定可靠的特点,并且若能够配合相应的数据校验算法就可将其应用于工业现场的数据通信。
ARM是目前嵌入式领域中应用最广泛的RISC微处理器结构,以低成本、低功耗、高性能的特点占据了嵌入式系统应用领域的领先地位,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场。STM32F103VB是基于ARM新内核Cortex-M3的通用微处理器,STM32V评估板是基于该芯片的学习板并集成了仿真调试器(Ulink_Me),可以方便用户快速学习和开发用户程序。目前常见的嵌入式系统有:WinCE、Linux、pSoS、VxWorks和μC/OS-II等。μC/OS-Ⅱ是专门为嵌入式系统应用设计的,具有源码公开、实时性好、可移植裁剪、高效稳定和教学科研免费使用等特点,已经成功移植到8、16、32和64位等多种微处理器上,广泛应用于照相摄影、医疗器械、音响设备、工业机器人控制、发动机控制、航空器、高速公路电话系统、自动提款机等众多领域。这里以STM32V评估板为硬件开发平台,结合μC/OS-II嵌入式操作系统,设计了基于信号量、消息邮箱的串口通信应用程序。
1 信号量、消息邮箱
μC/OS-II由事件(Event)驱动,一般事件包括信号量(Semaphores)、互斥信号量(Mutex semaphores)、消息邮箱(Message Mail boxes)、消息队列(Message Query)、事件标志组(Event Flag Group)等。其中信号量和消息邮箱作为一种常见的通信机制,在数据通信过程中应用最为广泛。
1.1 信号量(Semaphores)
μC/OS-II的信号量由2部分组成:一个是信号的计数值(0~65 535);另一个是由等待该信号量的任务组成的等待任务列表。信号量可用于以下场合:允许一个任务与其他任务或中断同步;取得共享资源的使用权(满足互斥条件);标志事件的发生。
对信号量一般可以实施以下3种操作:初始化(INITIALIZE)信号量或者称为创建信号量(CREATE);等待信号量(WAIT)或者称为挂起信号量(PEND);发送信号量(POST)。
信号量在初始化过程中需要给信号量赋初值,等待信号量的任务表(WAWING LIST)应清为空。信号量的使用需要调用相应的函数并配置其相关的宏定义,具体如表1所示。
1.2 消息邮箱(Message Mail boxes)
消息邮箱能使任务或中断服务向另外一个任务发送一个指针型的变量,这个指针指向一个包含指定“消息”的数据结构。消息邮箱发送的不是消息本身,而是消息的地址指针。
消息邮箱可用于通知一个事件发生或作为二值信号量使用。消息邮箱的工作原理是邮箱在初始化时建立一个等待消息的任务列表,当邮箱为空时,等待消息的任务就挂起,并且被加入到等待消息的任务列表中。当邮箱收到消息时,等待任务列表中优先级最高的任务或者最先等待消息的任务得到消息,且转入就绪并从任务列表中清除。
对消息邮箱的操作一般有3种:邮箱初始化(INITIALIZE),或者称为建立邮箱(CREATE);发送消息给邮箱(POST);等待消息进入邮箱(PE-ND);无等待请求邮箱消息(ACCEFT)。
消息邮箱的使用需要调用相应的函数并配置其相关的宏定义,具体如表2所示。
2 硬件开发设计
2.1 硬件开发平台
以STM32V评估板为硬件开发平台,该评估板采用ST公司32位ARM微处理器STM32F103VB,该芯片最大时钟频率72 MHz,内置大容量存储器包括128 KB的高速Flash和20 K的SRAM,丰富的外设接口:80个高速I/O接口,3个USART,2个I2C,2个SPI,7通道的DMA,RTC等。STM32V开发板将这些外设接口全部引出,自带LCD液晶显示并集成调试工具,用户可方便设计、调试和查看程序运行结果等。评估板功能模块组成如图1所示,主要包括以下部分:模拟输入信号部分、跳线配置、USB电源供给、液晶显示、串口通信、CAN通信、复位/输入按钮、LED显示和SD卡存储。
2.2 通信电路
计算机与外界的信息交换称为通信。通信基本方式分为串行通信和并行通信两种。串行通信是指一个数据是逐位顺序传送的通信方式,串行通信有同步和异步两种基本的通信方式。
其中,同步通信是通过同步时钟来实现发送和接收数据的同步。而异步通信规定了字符数据的传送格式,即每个数据以相同的帧格式传送。每一帧信息由起始位、数据位、奇偶校验位和停止位组成。依据起始位在每个字符数据开始时使发送和接收同步,停止位则作为字符结束的标志。
PC机的串行通信接口采用的是EIA RS-232E标准串行通信协议。在本设计中,主控芯片STM32F103VB的接口采用TTL电平,规定0~0.8 V为“0”电平,2~5V为“1”电平,它不能直接与PC机标准串行通信接口连接,必须设计TTL电平到RS-232协议电平信号的转换电路。串口RS-232电平与STM32F103VB微处理器TTL电平转换由开发板上的ST3232完成,接口电路如图2所示。
3 软件开发设计
选择RealView MDK软件作为开发工具,它是针对各种嵌入式处理器开发的软件开发工具。与ARM之前的工具包ADS等相比,RealView编译器可将代码密度提高10%,性能改善20%,并且支持ARM7、ARM9和最新的Cortex-M3核处理器。编程语言可以使用C或者C++语言,支持在线调试。
嵌入式实时操作系统μC/OS-Ⅱ可以管理256个任务,除了系统任务外,用户应用程序最多可以有248个任务,而中断嵌套的层数最多也可以到255层。任务创建过程包含了任务堆栈大小的设置、优先级分配以及在通信或保持同步过程中使用的信号量和邮箱。在STM32V评估板上通过RS232接口实现了评估板与PC机的通信,软件设计流程如图3所示,在完成相应的初始化之后,创建程序设计中用到的信号量和消息邮箱,紧接着需要创建应用任务,最后启动系统。
由该流程图可以看出:本程序设计中创建了4个任务,即LED显示任务,液晶显示任务,串口数据发送任务和数据发送控制任务。每一个任务都要有相应的优先级和任务堆栈空间,程序设计中每个任务的堆栈空间为512个字节,优先级依次为11,13,4,6。
ST公司用标准的ANSI C封装了ARM微处理器中各个功能寄存器,为用户应用程序的开发提供了丰富的固件库(Firmware)。固件库方便用户对底层微处理器外设进行初始化配置,如串口初始化函数为void USARTConfigurtion(void),具体代码如下:
初始化操作包括了时钟初始化、中断初始化,I/O接口初始化,串口初始化等。主程序在完成初始化操作后创建信号量、消息邮箱和任务创建。由于信号量、邮箱都是事件类型,所以需用OS_EV-ENT来定义,信号量、邮箱的建立由函数App_EventCreate()完成。
使用信号量和消息邮箱可以保持任务之间的通信的同步,串口数据发送任务App_TaskSendata(void-*p_arg)发送信号量App_UserIFSem通知数据发送控制任务App_TaskSendata Ctrl(void*p_arg),数据发送控制任务在接收到信号量App_User IFSem后,发送消息(www.Real Vie-w.com\n)给指定邮箱App_UserIFMbox,串口调用数据发送函数USART_Send Data(),串口数据发送任务数据发送完成后发送通知信号量App_ UserIFSeml给数据发送控制任务,数据发送控制任务在接收到发送完成信号量App_UserIFSeml后,向指定邮箱发送另一则消息(www.xust. edu.cn\n),数据发送任务在接收到消息邮箱后通过串口发送接收到的消息内容给PC机。具体代码如下:
图4为串口通信波特率设定为9 600 bps和115 200 bps时,在串口小助手中观察到的程序运行后的测试结果,结果表明程序按照预先设定好的发送要求不断向PC机发送数据,并且通信稳定,在测试过程中未出现乱码和通信异常中断情况,程序设计达到了预期目标。通常在工业现场实际应用中需要保证数据传输的可靠性,一般都需要在数据的发送和接收端对数据进行相应的数据校验,常见的数据校验算法是CRC校验,可以采用8或16位的CRC校验方式。在该通信过程中并未使用校验算法来检测数据传输的一致性,若在数据传输过程中添加相应的CRC校验算法,就可以最大程度地减少数据传输的误码率,保证数据传输的准确性。在后期的研究学习中也可以尝试将其应用于工业现场以测试其工作的可靠性。
4 结论
本文以STM32V评估板为硬件开发平台,结合μC/OS-II嵌入式操作系统中信号量和消息邮箱,设计了基于信号量、消息邮箱的串口通信应用程序,并通过实验验证了该串口应用程序在保证任务间通信同步情况下,数据传输具有较好的稳定性和可靠性,达到了程序设计预期目标。