张 峰,郭玲玲,徐 钊
(中国矿业大学信息与电气工程学院,江苏徐州 221008)
煤矿安全一直备受社会关注,地面监控室具有实时掌握井下人员的作业状况与作业环境的能力,对保障煤矿人员生命安全与财产安全是至关重要的。为了能够掌握矿井的安全状况,需要通过传感器实时采集井下诸如温度,瓦斯浓度,人员加速度等数据参数,然后通过无线的方式发送到井下接收器,上传至监控室分析显示。数据采集系统是一个多任务的系统,而且随着对安全级别要求的提高,采集指标也在不断的扩充。虽然已有很多数据采集系统应用于井下,但是大多采集工作简单划一,任务间优先关系不清,系统不具有良好的扩展性。鉴于井下特殊的作业环境与CAN总线的通信优点,目前CAN总线还广泛应用于井下通信系统的有线数据传输(如人员定位系统)[1],为了使采集器能够方便地加人井下既有CAN总线网,设计一款具有多种传感器数据采集功能和无线射频转CAN总线功能的数据采集器是必要的。
μC/OS-Ⅱ是一种免费公开源代码,结构小巧,具有可剥夺内核的实时操作系统。它具有多任务的特点,目前可以管理64个不同优先级的任务;移植简单;内核可裁减;多任务可确定性;并提供很多系统服务,比如信号量,消息邮箱,消息队列,内存的分配和释放[2]。目前在已经广泛移植于Arm处理器,和MCS-51。而在CC2530上的移植还较少见,所以文中着重介绍了μC/OS-Ⅱ在CC2530上的移植过程。
1.1目标机的硬件资源和采用的编译器
该设计采用CC2530无线射频芯片,以实现对无线射频数据的收发。CC2530是符合2.4 G IEEE802.15.4标准的射频收发器,支持数据传输速率高达250 kbit/s,最快可以在600 μs下实现一帧链路层数据发送。此芯片可以实现多点之间相互组网。内置32 K晶振的休眠模式定时器,满足无线传感网络的节点低功耗的要求。该芯片内部具有8 K的RAM,满足大部分工程软件的在线数据空间开辟。CC2530还内置了256 K的flash存储器,可以实现对大量数据的无丢失保存。内置13位精度的A/D转换模块,可以实现对模拟数据的采样。CC2530还提供了丰富的数模接口,对于目前广泛采用的SPI,RS232/485等数字通信接口基本都能实现直接通信,对于IIC和单总线接口,可以通用IO口模拟实现。所以,CC2530在能够实现无线数据通信的同时,还能够实现对目前主流传感器的数据采集。节点硬件结构示意图如图1所示。
图1 节点硬件结构示意图
移植中采用IAR的EW8051-EV-730B。它是目前最高效,灵活的CC2530开发平台。IAR编译器会自动虚拟出一个XSTACK堆栈(栈顶指针为XSP)和9个虚拟寄存器,以实现函数的可重入性。在保存现场时,需要将这些寄存器都入栈保护。另外,在IAR的EW8051环境下移植μcos-Ⅱ还支持在线调试与仿真。
1.2具体移植步骤
移植需要修改各个与硬件相关的文件,该移植涉及到以下几个相关文件。
1.2.1修改OS_CPU.H文件
首先,需要在OS_CPU.H中针对具体的处理器字长重新定义一系列数据类型。因为CC2530的栈宽度是8位的,所以将堆栈的数据类型声明为8位无符号字符类型,即#define unsigned char OS_STK.
其次,为了避免在对临界区代码操作时间段内,发生中断而产生不可控的影响。必须保证系统在进入临界区之前关闭全局中断,退出后再开放。
最后,CC2530堆栈的增长方向为由高向低,需要在代码中作相应的更改。还由于CC2530的系统指令集中没有软中断指令,所以用子程序调用模拟[2]。
1.2.2修改OS_CPU_C.C文件
这个文件中涉及的是任务堆栈初始化的相关操作,唯一需要修改的是函数OSTaskStkInit()。为了保证任务切换后能回到切换前的工作原点,μC/OS-Ⅱ中每个任务都有自己的堆栈空间,移植人员需要自己为任务设计任务堆栈,结构如图2所示。由于在井下数据采集系统中需要即时存储大量的数据信息到CC2530的内部RAM中,而由于内部RAM空间有限,故只能CC2530的外部RAM中开辟每一个任务的任务堆栈映像,用以长期存储每一个任务的环境参数。于是在任务切换时要进行任务堆栈映像和系统堆栈之间的复制操作。
图2 自定义任务堆栈结构
CC2530单片机的堆栈指针SP与51单片机相似,也总是先加1再存数据。因此,SP初始化时须指向系统堆栈起始地址减1处.在任务切换之初,需要先把当前任务的现场由系统堆栈复制保存到该任务的任务堆栈中。完成上述过程,需计算出SP-OSStkStart,得出堆栈长度,并长度值写入任务堆栈映像最低地址空间;然后以SP-OSStkStart为长度,以任务堆栈映像最低地址为目标地址,以OSStkStart为起址,将系统堆栈的现场值拷贝到任务堆栈映像。
由于IAR编译器自动将函数编译为可重入的,所以不需要在函数定义时加入关键字reentrant。编译器在处理函数的可重入性时,会利用XSTACK仿真栈和虚拟寄存器,所以在进行任务切换时也要保存。
用户堆栈初始化时,堆栈从下向上依次保存:用户堆栈长度(26),程序指针(PCL,PCH),程序状态字(PSW),累加寄存器(ACC),B寄存器,DPL,DPH,R寄存器(R0~R8),虚拟寄存器(VB,V0~V8),外部堆栈指针(XSPL,XSPH)。
1.2.3修改OS_CPU_ASM.ASM文件
此文件中需要自己编写4个简单的函数:
(1)使就绪态任务中优先级最高的任务开始执行的OSStartHighRdy()函数;
(2)软件模拟实现的任务切换函数OSCtxSw();
(3)中断级任务切换函数OSIntCtxSw();
(4)系统时钟资源提供函数OSTickISR()。
另外还需要定义8个虚拟寄存器和仿真堆栈XSTACK的栈顶指针XSP的地址。
OSTickISR()是一个时钟节拍函数,它为系统提供一个时钟资源来实现时延和定时功能。为了保障系统的实时性和稳定性,通常时钟节拍的频率设置在10~100 Hz之间。本次移植选用CC2530的T1定时器作为tick时钟。大多数移植都是将本段函数以汇编形式写在OS_CPU_ASM.ASM文件中,而本次移植将以C语言的形式放在C文件中,汇编过程由编译器完成。代码如下:
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{IRCO.&= ~0x02;//清中断标示
OSIntEnter();
OSTimeTick();
OSIntExit();
}
前3个函数其移植过程和代码与MCS-51单片机基本相似,只是需要保存的寄存器不同,可以参考MCS-51单片机的移植,不再详述。
该设计采用CC2530无线射频芯片,以实现对无线射频数据的收发和满足对各种传感器数据采集的需要。文中只介绍了电源部分和CAN通信部分的设计,其他传感器根据需要可以方便地扩展。
电源部分:由于CC2530和MCP2510工作电压均为3.3 V,而且鉴于井下严酷的工作环境,数据采集器会受高温、电磁干扰等影响。通过查询,决定采用TPS63031作为3.3 V输出的电压转换芯片,TPS63031的工作电压范围为2.4~5.5V,可输出高达800mA的电流。由于CC2530容易受到电源波纹的影响,所以在3.3V的输出后面增加了一个低压差线性稳压器(LDO)[3],用来滤除DC-DC模块输出的比较大的电源波纹,提高输出电压的稳定性。电源原理图如图3所示。
图3 电源模块原理图
CAN通信部分:采用MCP2510作为CAN控制器。CC2530与MCP2510采用SPI通信方式,MCP2510作为从器件,通信时钟由CC2530提供。MCP2510的外部中断管脚接CC2530的一个可检测中断的管脚,以实时响应数据帧发送完成。为了保证数据传输的速度,以提高系统的实时性,SPI通信波特率最好设置为2 Mbps.另外,鉴于井下恶劣的通信环境,采用带隔离的CTM8251A作为CAN收发器芯片,该芯片具有抗电子干扰和高压瞬态保护功能。通信模块硬件连接如图4所示。
图4 通信模块硬件设计原理图
鉴于μC/OS-Ⅱ在任务处理方面的突出优点,该次软件设计选择了基于μC/OS-Ⅱ操作系统。
3.1系统软件初始化
系统运行时,首先要对系统的硬件进行初始化,其中包括主要CC2530相关的无线寄存器初始化,时钟初始化,SPI通讯端口初始化,各外围模块的初始化。然后初始化操作系统,其中包括初始化所有的数据结构,分配任务堆栈空间,然后建立任务间通信将要用到的的信号量或者消息队列,进而创建任务[4]。并且根据实际需要,为每个任务分配不同的运行优先级。在初始化时,将所有任务设置为就绪态,系统首先执行最高优先级任务。在该次设计中,共设计了4个任务:数据采集,数据存储任务,数据处理任务,CAN数据发送任务。数据的接收由CC2530的无线接收中断完成。数据发送任务负责通过SPI接口控制CAN控制器,实现CAN帧格式的数据收发。将数据以CAN帧格式发送出去。为了保证数据不丢失,需要将数据存储任务设置为最高优先级。整个软件系统的工作流程如图5所示。初始化代码如下:
void main()
{
HalInit();//系统硬件初始化
OSInit();//初始化系统软件
ControlSem1=OSSemCreatr(0);//创建信号量用于通知发送任务
DataMen=OSMemCreate(part,30,60,&err);
OSTaskCreate(Task1,(void
*)0,&Task1Stk[0],1);//数据采集任务(含无线)
OSTaskCreate(Task2,(void
*)0,&Task1Stk[1],2);//数据存储任务
OSTaskCreate(Task3,(void *)0,&Task2Stk[2],5);//数据处理任务
OSTaskCreate(Task4,(void *)0,&Task2Stk[3],6);//数据发送任务
OSStart();
}
图5 系统的工作流程
3.2CAN通讯程序设计
MCP2510正常工作之前需要进行正确的初始化,包括设置SPI接口的数据传输速率,CAN通信的波特率,MCP2510的接收过滤器和屏蔽寄存器以及发送和接收中断允许标志位。采用中断方式进行数据的收发。每次发送或接收完1帧的数据,控制器都通过外部中断告之CC2530单片机,以便进行下一帧的数据处理。
(1)CAN控制器初始化。主要配置控制寄存器CANCTRL,位定时寄存器CNF,接收屏蔽寄存器RXFOSID,发送控制寄存器TXB0CTL,发送屏蔽寄存器TXBOSID,中断使能寄存器CANINTF。
(2)CAN数据的发送和接收。在对MCP2510进行任何操作之前,CC2530的P1_6管脚都需要拉低,使得MCP2510选通。只要通过SPI接口将待发送的数据填装到CAN发送寄存器,然后下达数据发送命令。MCP2510将数据以标准的CAN链路层帧格式将数据发往总线。数据接收时通过SPI接口向控制器下达读指令和地址码。需要注意的是在执行读操作时,发送完读指令及其地址码之后,仍然需要向MCP2510提供时钟,以接收“读”到的数据[4]。
测试采用自制的无线数据采集模块,该模块的设计方案与文中提出的方案一致,完成无线数据接收,环境温度采集处理。并通过CAN口发送出去。经由KJJ43型传输接口,将CAN帧格式数据转化成RS-232帧格式。最终交予KLX5L(A)矿用信息矿灯显示。测试系统的数据走向如图6所示。
图6测试数据流向
测试结果表明,数据能及时被采集到,并且被KLX5L(A)矿用信息矿灯稳定显示。
在CC2530芯片上移植μC/OS-Ⅱ操作系统,需要根据MCU的特定配置对系统源文件做相应的修改,在调试过程中需要仔细。移植成功后,可以根据需求自己定制相关任务,甚至是对系统本身的调度机制做进一步地修改。μC/OS-Ⅱ系统在CC2530芯片上的成功移植,将为井下无线数据采集系统实现多任务管理提供有力的软件支持。下一步将要把该采集板可插拔地内置于KLX5L(A)智能矿灯内,使该灯可以具有温度,瓦斯浓度,加速度采集功能。
参考文献:
[1]张峰,徐钊,张凯婷.井下人员定位系统读卡器存储算法分析与测试.工矿自动化,2012(8):79-82.
[2]赵建华,汪文勇.μC/OS-Ⅱ内核在80C51系列单片机上的移植.计算机工程与设计,2007(5):2096-2099.
[3]孟海斌,张红雨.高效率RFID手持机电源设计.通信电源技术,2011(3):2096-2099.
[4]蒋永年,冯平,肖伟.基于LPC2294和μCOS-Ⅱ的储油区测控系统智能节点.仪表技术与传感器,2011(3):107-110.
[5]杨庆华,张景元.单片机和MCP2510的CAN总线通信模块设计.计算机工程与科学,2007(3):35-37.