張 峰,郭玲玲,徐 釗
(中國(guó)礦業(yè)大學(xué)信息與電氣工程學(xué)院,江蘇徐州 221008)
煤礦安全一直備受社會(huì)關(guān)注,地面監(jiān)控室具有實(shí)時(shí)掌握井下人員的作業(yè)狀況與作業(yè)環(huán)境的能力,對(duì)保障煤礦人員生命安全與財(cái)產(chǎn)安全是至關(guān)重要的。為了能夠掌握礦井的安全狀況,需要通過(guò)傳感器實(shí)時(shí)采集井下諸如溫度,瓦斯?jié)舛?,人員加速度等數(shù)據(jù)參數(shù),然后通過(guò)無(wú)線的方式發(fā)送到井下接收器,上傳至監(jiān)控室分析顯示。數(shù)據(jù)采集系統(tǒng)是一個(gè)多任務(wù)的系統(tǒng),而且隨著對(duì)安全級(jí)別要求的提高,采集指標(biāo)也在不斷的擴(kuò)充。雖然已有很多數(shù)據(jù)采集系統(tǒng)應(yīng)用于井下,但是大多采集工作簡(jiǎn)單劃一,任務(wù)間優(yōu)先關(guān)系不清,系統(tǒng)不具有良好的擴(kuò)展性。鑒于井下特殊的作業(yè)環(huán)境與CAN總線的通信優(yōu)點(diǎn),目前CAN總線還廣泛應(yīng)用于井下通信系統(tǒng)的有線數(shù)據(jù)傳輸(如人員定位系統(tǒng))[1],為了使采集器能夠方便地加人井下既有CAN總線網(wǎng),設(shè)計(jì)一款具有多種傳感器數(shù)據(jù)采集功能和無(wú)線射頻轉(zhuǎn)CAN總線功能的數(shù)據(jù)采集器是必要的。
μC/OS-Ⅱ是一種免費(fèi)公開(kāi)源代碼,結(jié)構(gòu)小巧,具有可剝奪內(nèi)核的實(shí)時(shí)操作系統(tǒng)。它具有多任務(wù)的特點(diǎn),目前可以管理64個(gè)不同優(yōu)先級(jí)的任務(wù);移植簡(jiǎn)單;內(nèi)核可裁減;多任務(wù)可確定性;并提供很多系統(tǒng)服務(wù),比如信號(hào)量,消息郵箱,消息隊(duì)列,內(nèi)存的分配和釋放[2]。目前在已經(jīng)廣泛移植于Arm處理器,和MCS-51。而在CC2530上的移植還較少見(jiàn),所以文中著重介紹了μC/OS-Ⅱ在CC2530上的移植過(guò)程。
1.1目標(biāo)機(jī)的硬件資源和采用的編譯器
該設(shè)計(jì)采用CC2530無(wú)線射頻芯片,以實(shí)現(xiàn)對(duì)無(wú)線射頻數(shù)據(jù)的收發(fā)。CC2530是符合2.4 G IEEE802.15.4標(biāo)準(zhǔn)的射頻收發(fā)器,支持?jǐn)?shù)據(jù)傳輸速率高達(dá)250 kbit/s,最快可以在600 μs下實(shí)現(xiàn)一幀鏈路層數(shù)據(jù)發(fā)送。此芯片可以實(shí)現(xiàn)多點(diǎn)之間相互組網(wǎng)。內(nèi)置32 K晶振的休眠模式定時(shí)器,滿足無(wú)線傳感網(wǎng)絡(luò)的節(jié)點(diǎn)低功耗的要求。該芯片內(nèi)部具有8 K的RAM,滿足大部分工程軟件的在線數(shù)據(jù)空間開(kāi)辟。CC2530還內(nèi)置了256 K的flash存儲(chǔ)器,可以實(shí)現(xiàn)對(duì)大量數(shù)據(jù)的無(wú)丟失保存。內(nèi)置13位精度的A/D轉(zhuǎn)換模塊,可以實(shí)現(xiàn)對(duì)模擬數(shù)據(jù)的采樣。CC2530還提供了豐富的數(shù)模接口,對(duì)于目前廣泛采用的SPI,RS232/485等數(shù)字通信接口基本都能實(shí)現(xiàn)直接通信,對(duì)于IIC和單總線接口,可以通用IO口模擬實(shí)現(xiàn)。所以,CC2530在能夠?qū)崿F(xiàn)無(wú)線數(shù)據(jù)通信的同時(shí),還能夠?qū)崿F(xiàn)對(duì)目前主流傳感器的數(shù)據(jù)采集。節(jié)點(diǎn)硬件結(jié)構(gòu)示意圖如圖1所示。
圖1 節(jié)點(diǎn)硬件結(jié)構(gòu)示意圖
移植中采用IAR的EW8051-EV-730B。它是目前最高效,靈活的CC2530開(kāi)發(fā)平臺(tái)。IAR編譯器會(huì)自動(dòng)虛擬出一個(gè)XSTACK堆棧(棧頂指針為XSP)和9個(gè)虛擬寄存器,以實(shí)現(xiàn)函數(shù)的可重入性。在保存現(xiàn)場(chǎng)時(shí),需要將這些寄存器都入棧保護(hù)。另外,在IAR的EW8051環(huán)境下移植μcos-Ⅱ還支持在線調(diào)試與仿真。
1.2具體移植步驟
移植需要修改各個(gè)與硬件相關(guān)的文件,該移植涉及到以下幾個(gè)相關(guān)文件。
1.2.1修改OS_CPU.H文件
首先,需要在OS_CPU.H中針對(duì)具體的處理器字長(zhǎng)重新定義一系列數(shù)據(jù)類型。因?yàn)镃C2530的棧寬度是8位的,所以將堆棧的數(shù)據(jù)類型聲明為8位無(wú)符號(hào)字符類型,即#define unsigned char OS_STK.
其次,為了避免在對(duì)臨界區(qū)代碼操作時(shí)間段內(nèi),發(fā)生中斷而產(chǎn)生不可控的影響。必須保證系統(tǒng)在進(jìn)入臨界區(qū)之前關(guān)閉全局中斷,退出后再開(kāi)放。
最后,CC2530堆棧的增長(zhǎng)方向?yàn)橛筛呦虻?,需要在代碼中作相應(yīng)的更改。還由于CC2530的系統(tǒng)指令集中沒(méi)有軟中斷指令,所以用子程序調(diào)用模擬[2]。
1.2.2修改OS_CPU_C.C文件
這個(gè)文件中涉及的是任務(wù)堆棧初始化的相關(guān)操作,唯一需要修改的是函數(shù)OSTaskStkInit()。為了保證任務(wù)切換后能回到切換前的工作原點(diǎn),μC/OS-Ⅱ中每個(gè)任務(wù)都有自己的堆??臻g,移植人員需要自己為任務(wù)設(shè)計(jì)任務(wù)堆棧,結(jié)構(gòu)如圖2所示。由于在井下數(shù)據(jù)采集系統(tǒng)中需要即時(shí)存儲(chǔ)大量的數(shù)據(jù)信息到CC2530的內(nèi)部RAM中,而由于內(nèi)部RAM空間有限,故只能CC2530的外部RAM中開(kāi)辟每一個(gè)任務(wù)的任務(wù)堆棧映像,用以長(zhǎng)期存儲(chǔ)每一個(gè)任務(wù)的環(huán)境參數(shù)。于是在任務(wù)切換時(shí)要進(jìn)行任務(wù)堆棧映像和系統(tǒng)堆棧之間的復(fù)制操作。
圖2 自定義任務(wù)堆棧結(jié)構(gòu)
CC2530單片機(jī)的堆棧指針SP與51單片機(jī)相似,也總是先加1再存數(shù)據(jù)。因此,SP初始化時(shí)須指向系統(tǒng)堆棧起始地址減1處.在任務(wù)切換之初,需要先把當(dāng)前任務(wù)的現(xiàn)場(chǎng)由系統(tǒng)堆棧復(fù)制保存到該任務(wù)的任務(wù)堆棧中。完成上述過(guò)程,需計(jì)算出SP-OSStkStart,得出堆棧長(zhǎng)度,并長(zhǎng)度值寫入任務(wù)堆棧映像最低地址空間;然后以SP-OSStkStart為長(zhǎng)度,以任務(wù)堆棧映像最低地址為目標(biāo)地址,以O(shè)SStkStart為起址,將系統(tǒng)堆棧的現(xiàn)場(chǎng)值拷貝到任務(wù)堆棧映像。
由于IAR編譯器自動(dòng)將函數(shù)編譯為可重入的,所以不需要在函數(shù)定義時(shí)加入關(guān)鍵字reentrant。編譯器在處理函數(shù)的可重入性時(shí),會(huì)利用XSTACK仿真棧和虛擬寄存器,所以在進(jìn)行任務(wù)切換時(shí)也要保存。
用戶堆棧初始化時(shí),堆棧從下向上依次保存:用戶堆棧長(zhǎng)度(26),程序指針(PCL,PCH),程序狀態(tài)字(PSW),累加寄存器(ACC),B寄存器,DPL,DPH,R寄存器(R0~R8),虛擬寄存器(VB,V0~V8),外部堆棧指針(XSPL,XSPH)。
1.2.3修改OS_CPU_ASM.ASM文件
此文件中需要自己編寫4個(gè)簡(jiǎn)單的函數(shù):
(1)使就緒態(tài)任務(wù)中優(yōu)先級(jí)最高的任務(wù)開(kāi)始執(zhí)行的OSStartHighRdy()函數(shù);
(2)軟件模擬實(shí)現(xiàn)的任務(wù)切換函數(shù)OSCtxSw();
(3)中斷級(jí)任務(wù)切換函數(shù)OSIntCtxSw();
(4)系統(tǒng)時(shí)鐘資源提供函數(shù)OSTickISR()。
另外還需要定義8個(gè)虛擬寄存器和仿真堆棧XSTACK的棧頂指針XSP的地址。
OSTickISR()是一個(gè)時(shí)鐘節(jié)拍函數(shù),它為系統(tǒng)提供一個(gè)時(shí)鐘資源來(lái)實(shí)現(xiàn)時(shí)延和定時(shí)功能。為了保障系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性,通常時(shí)鐘節(jié)拍的頻率設(shè)置在10~100 Hz之間。本次移植選用CC2530的T1定時(shí)器作為tick時(shí)鐘。大多數(shù)移植都是將本段函數(shù)以匯編形式寫在OS_CPU_ASM.ASM文件中,而本次移植將以C語(yǔ)言的形式放在C文件中,匯編過(guò)程由編譯器完成。代碼如下:
#pragma vector = T1_VECTOR
__interrupt void T1_ISR(void)
{IRCO.&= ~0x02;//清中斷標(biāo)示
OSIntEnter();
OSTimeTick();
OSIntExit();
}
前3個(gè)函數(shù)其移植過(guò)程和代碼與MCS-51單片機(jī)基本相似,只是需要保存的寄存器不同,可以參考MCS-51單片機(jī)的移植,不再詳述。
該設(shè)計(jì)采用CC2530無(wú)線射頻芯片,以實(shí)現(xiàn)對(duì)無(wú)線射頻數(shù)據(jù)的收發(fā)和滿足對(duì)各種傳感器數(shù)據(jù)采集的需要。文中只介紹了電源部分和CAN通信部分的設(shè)計(jì),其他傳感器根據(jù)需要可以方便地?cái)U(kuò)展。
電源部分:由于CC2530和MCP2510工作電壓均為3.3 V,而且鑒于井下嚴(yán)酷的工作環(huán)境,數(shù)據(jù)采集器會(huì)受高溫、電磁干擾等影響。通過(guò)查詢,決定采用TPS63031作為3.3 V輸出的電壓轉(zhuǎn)換芯片,TPS63031的工作電壓范圍為2.4~5.5V,可輸出高達(dá)800mA的電流。由于CC2530容易受到電源波紋的影響,所以在3.3V的輸出后面增加了一個(gè)低壓差線性穩(wěn)壓器(LDO)[3],用來(lái)濾除DC-DC模塊輸出的比較大的電源波紋,提高輸出電壓的穩(wěn)定性。電源原理圖如圖3所示。
圖3 電源模塊原理圖
CAN通信部分:采用MCP2510作為CAN控制器。CC2530與MCP2510采用SPI通信方式,MCP2510作為從器件,通信時(shí)鐘由CC2530提供。MCP2510的外部中斷管腳接CC2530的一個(gè)可檢測(cè)中斷的管腳,以實(shí)時(shí)響應(yīng)數(shù)據(jù)幀發(fā)送完成。為了保證數(shù)據(jù)傳輸?shù)乃俣?,以提高系統(tǒng)的實(shí)時(shí)性,SPI通信波特率最好設(shè)置為2 Mbps.另外,鑒于井下惡劣的通信環(huán)境,采用帶隔離的CTM8251A作為CAN收發(fā)器芯片,該芯片具有抗電子干擾和高壓瞬態(tài)保護(hù)功能。通信模塊硬件連接如圖4所示。
圖4 通信模塊硬件設(shè)計(jì)原理圖
鑒于μC/OS-Ⅱ在任務(wù)處理方面的突出優(yōu)點(diǎn),該次軟件設(shè)計(jì)選擇了基于μC/OS-Ⅱ操作系統(tǒng)。
3.1系統(tǒng)軟件初始化
系統(tǒng)運(yùn)行時(shí),首先要對(duì)系統(tǒng)的硬件進(jìn)行初始化,其中包括主要CC2530相關(guān)的無(wú)線寄存器初始化,時(shí)鐘初始化,SPI通訊端口初始化,各外圍模塊的初始化。然后初始化操作系統(tǒng),其中包括初始化所有的數(shù)據(jù)結(jié)構(gòu),分配任務(wù)堆??臻g,然后建立任務(wù)間通信將要用到的的信號(hào)量或者消息隊(duì)列,進(jìn)而創(chuàng)建任務(wù)[4]。并且根據(jù)實(shí)際需要,為每個(gè)任務(wù)分配不同的運(yùn)行優(yōu)先級(jí)。在初始化時(shí),將所有任務(wù)設(shè)置為就緒態(tài),系統(tǒng)首先執(zhí)行最高優(yōu)先級(jí)任務(wù)。在該次設(shè)計(jì)中,共設(shè)計(jì)了4個(gè)任務(wù):數(shù)據(jù)采集,數(shù)據(jù)存儲(chǔ)任務(wù),數(shù)據(jù)處理任務(wù),CAN數(shù)據(jù)發(fā)送任務(wù)。數(shù)據(jù)的接收由CC2530的無(wú)線接收中斷完成。數(shù)據(jù)發(fā)送任務(wù)負(fù)責(zé)通過(guò)SPI接口控制CAN控制器,實(shí)現(xiàn)CAN幀格式的數(shù)據(jù)收發(fā)。將數(shù)據(jù)以CAN幀格式發(fā)送出去。為了保證數(shù)據(jù)不丟失,需要將數(shù)據(jù)存儲(chǔ)任務(wù)設(shè)置為最高優(yōu)先級(jí)。整個(gè)軟件系統(tǒng)的工作流程如圖5所示。初始化代碼如下:
void main()
{
HalInit();//系統(tǒng)硬件初始化
OSInit();//初始化系統(tǒng)軟件
ControlSem1=OSSemCreatr(0);//創(chuàng)建信號(hào)量用于通知發(fā)送任務(wù)
DataMen=OSMemCreate(part,30,60,&err);
OSTaskCreate(Task1,(void
*)0,&Task1Stk[0],1);//數(shù)據(jù)采集任務(wù)(含無(wú)線)
OSTaskCreate(Task2,(void
*)0,&Task1Stk[1],2);//數(shù)據(jù)存儲(chǔ)任務(wù)
OSTaskCreate(Task3,(void *)0,&Task2Stk[2],5);//數(shù)據(jù)處理任務(wù)
OSTaskCreate(Task4,(void *)0,&Task2Stk[3],6);//數(shù)據(jù)發(fā)送任務(wù)
OSStart();
}
圖5 系統(tǒng)的工作流程
3.2CAN通訊程序設(shè)計(jì)
MCP2510正常工作之前需要進(jìn)行正確的初始化,包括設(shè)置SPI接口的數(shù)據(jù)傳輸速率,CAN通信的波特率,MCP2510的接收過(guò)濾器和屏蔽寄存器以及發(fā)送和接收中斷允許標(biāo)志位。采用中斷方式進(jìn)行數(shù)據(jù)的收發(fā)。每次發(fā)送或接收完1幀的數(shù)據(jù),控制器都通過(guò)外部中斷告之CC2530單片機(jī),以便進(jìn)行下一幀的數(shù)據(jù)處理。
(1)CAN控制器初始化。主要配置控制寄存器CANCTRL,位定時(shí)寄存器CNF,接收屏蔽寄存器RXFOSID,發(fā)送控制寄存器TXB0CTL,發(fā)送屏蔽寄存器TXBOSID,中斷使能寄存器CANINTF。
(2)CAN數(shù)據(jù)的發(fā)送和接收。在對(duì)MCP2510進(jìn)行任何操作之前,CC2530的P1_6管腳都需要拉低,使得MCP2510選通。只要通過(guò)SPI接口將待發(fā)送的數(shù)據(jù)填裝到CAN發(fā)送寄存器,然后下達(dá)數(shù)據(jù)發(fā)送命令。MCP2510將數(shù)據(jù)以標(biāo)準(zhǔn)的CAN鏈路層幀格式將數(shù)據(jù)發(fā)往總線。數(shù)據(jù)接收時(shí)通過(guò)SPI接口向控制器下達(dá)讀指令和地址碼。需要注意的是在執(zhí)行讀操作時(shí),發(fā)送完讀指令及其地址碼之后,仍然需要向MCP2510提供時(shí)鐘,以接收“讀”到的數(shù)據(jù)[4]。
測(cè)試采用自制的無(wú)線數(shù)據(jù)采集模塊,該模塊的設(shè)計(jì)方案與文中提出的方案一致,完成無(wú)線數(shù)據(jù)接收,環(huán)境溫度采集處理。并通過(guò)CAN口發(fā)送出去。經(jīng)由KJJ43型傳輸接口,將CAN幀格式數(shù)據(jù)轉(zhuǎn)化成RS-232幀格式。最終交予KLX5L(A)礦用信息礦燈顯示。測(cè)試系統(tǒng)的數(shù)據(jù)走向如圖6所示。
圖6測(cè)試數(shù)據(jù)流向
測(cè)試結(jié)果表明,數(shù)據(jù)能及時(shí)被采集到,并且被KLX5L(A)礦用信息礦燈穩(wěn)定顯示。
在CC2530芯片上移植μC/OS-Ⅱ操作系統(tǒng),需要根據(jù)MCU的特定配置對(duì)系統(tǒng)源文件做相應(yīng)的修改,在調(diào)試過(guò)程中需要仔細(xì)。移植成功后,可以根據(jù)需求自己定制相關(guān)任務(wù),甚至是對(duì)系統(tǒng)本身的調(diào)度機(jī)制做進(jìn)一步地修改。μC/OS-Ⅱ系統(tǒng)在CC2530芯片上的成功移植,將為井下無(wú)線數(shù)據(jù)采集系統(tǒng)實(shí)現(xiàn)多任務(wù)管理提供有力的軟件支持。下一步將要把該采集板可插拔地內(nèi)置于KLX5L(A)智能礦燈內(nèi),使該燈可以具有溫度,瓦斯?jié)舛?,加速度采集功能?/p>
參考文獻(xiàn):
[1]張峰,徐釗,張凱婷.井下人員定位系統(tǒng)讀卡器存儲(chǔ)算法分析與測(cè)試.工礦自動(dòng)化,2012(8):79-82.
[2]趙建華,汪文勇.μC/OS-Ⅱ內(nèi)核在80C51系列單片機(jī)上的移植.計(jì)算機(jī)工程與設(shè)計(jì),2007(5):2096-2099.
[3]孟海斌,張紅雨.高效率RFID手持機(jī)電源設(shè)計(jì).通信電源技術(shù),2011(3):2096-2099.
[4]蔣永年,馮平,肖偉.基于LPC2294和μCOS-Ⅱ的儲(chǔ)油區(qū)測(cè)控系統(tǒng)智能節(jié)點(diǎn).儀表技術(shù)與傳感器,2011(3):107-110.
[5]楊慶華,張景元.單片機(jī)和MCP2510的CAN總線通信模塊設(shè)計(jì).計(jì)算機(jī)工程與科學(xué),2007(3):35-37.