李 松,張書濱
(中國(guó)船舶重工集團(tuán)公司江蘇自動(dòng)化研究所,連云港222006)
1553B是MIL-STD-1553B的簡(jiǎn)稱,即飛機(jī)內(nèi)部時(shí)分制指令/響應(yīng)式多路傳輸數(shù)據(jù)總線,1553B總線著重強(qiáng)調(diào)系統(tǒng)的實(shí)時(shí)性、高可靠性以及對(duì)系統(tǒng)通信出錯(cuò)時(shí)的故障診斷和管理功能,采用時(shí)分多路復(fù)用技術(shù)(TDM)。VxWorks是由美國(guó)風(fēng)河公司推出的嵌入式實(shí)時(shí)操作系統(tǒng),以其不斷推出的升級(jí)版本、高性能可裁減內(nèi)核以及友好的用戶開發(fā)環(huán)境,在嵌入式操作系統(tǒng)應(yīng)用領(lǐng)域占據(jù)重要地位。由于都具有強(qiáng)實(shí)時(shí)性,高可靠性的優(yōu)點(diǎn),這兩種技術(shù)的結(jié)合現(xiàn)已廣泛應(yīng)用于航空航天、軍事裝備、車載電子、數(shù)字傳輸設(shè)備等各個(gè)領(lǐng)域。下面重點(diǎn)探討在VxWork系統(tǒng)下進(jìn)行1553B驅(qū)動(dòng)程序設(shè)計(jì)的方法。
1553B總線通常由總線節(jié)點(diǎn)、總線電纜、端接器、耦合器、短截線和連接器組成,其中總線節(jié)點(diǎn)包括一個(gè)總線控制器(BC)、最多31個(gè)遠(yuǎn)程終端(RT)和一個(gè)總線監(jiān)控器(MT)。BC負(fù)責(zé)管理和控制總線上的信息傳輸;MT負(fù)責(zé)接收總線上的信息用于總線的測(cè)試;RT負(fù)責(zé)響應(yīng)總線命令,執(zhí)行數(shù)據(jù)傳輸。1553B總線組成如圖1所示。
圖1 1553B 總線組成框圖
1553B總線是一種命令/響應(yīng)式總線,所有在總線上的命令和數(shù)據(jù)都由一個(gè)單獨(dú)的BC激活,除了BC,任何終端無(wú)法激活總線通信??偩€上的通信以周期為單位批量進(jìn)行,消息是周期內(nèi)數(shù)據(jù)傳輸?shù)淖钚挝?。每類消息賦予一個(gè)子地址,消息數(shù)據(jù)長(zhǎng)度不超過(guò)32字,每個(gè)RT最多可以響應(yīng)32條接收消息和32條發(fā)送消息;典型的1553B總線上消息傳輸?shù)倪^(guò)程是:總線控制器向某一終端發(fā)布一個(gè)接收/發(fā)送指令,終端在給定的響應(yīng)時(shí)間范圍內(nèi)發(fā)回一個(gè)狀態(tài)字并執(zhí)行消息的接收/發(fā)送。BC通過(guò)驗(yàn)收RT回應(yīng)的狀態(tài)字來(lái)檢驗(yàn)傳輸是否成功并做后續(xù)的操作。在這個(gè)過(guò)程中,MT可以監(jiān)視數(shù)據(jù)總線上的信息以收集總線上所有數(shù)據(jù),也可以有選擇性的進(jìn)行收集。
基于VxWorks進(jìn)行1553B驅(qū)動(dòng)開發(fā)時(shí),需對(duì)1553B接口卡進(jìn)行相應(yīng)的初始化和配置,并完成中斷處理程序,實(shí)現(xiàn)各功能模塊?;赩xWorks的1553B驅(qū)動(dòng)程序開發(fā)流程如圖2所示。
圖2 基于VxWorks的1553B驅(qū)動(dòng)程序開發(fā)流程
消息是構(gòu)成1553B總線通訊的基本單位,BC的主要任務(wù)是組織消息,通過(guò)消息實(shí)現(xiàn)總線上各終端間的信息傳輸。如果需要完成一定的功能,就要將多個(gè)消息組織起來(lái),形成一個(gè)新的結(jié)構(gòu)叫做消息幀(frame),消息可分為周期消息和非周期消息。非周期消息的實(shí)現(xiàn)方法是BC以固定的小周期向RT發(fā)送矢量字方式碼指令來(lái)詢問(wèn),被查詢的RT若有事件請(qǐng)求,就將矢量字置位,BC在下一幀消息中增加處理該事件的指令。每一周期消息幀的描述塊、消息塊內(nèi)容和堆棧的消息處理個(gè)數(shù)都不一樣,每一幀消息都需要在保留周期性消息的前提下增加非周期性消息描述塊、復(fù)位堆棧指針、更改消息個(gè)數(shù)、更新消息塊、填寫發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。BC模式的工作流程如下所述:
a.初始化1553B接口卡,獲取設(shè)備地址信息,設(shè)置中斷屏蔽寄存器等;
b.設(shè)置中斷向量,掛接中斷處理程序;
c.定義周期、非周期消息,啟動(dòng)BC,出錯(cuò)、超時(shí)處理。
BC中斷服務(wù)程序主要處理:
a.清中斷,置當(dāng)前幀結(jié)束標(biāo)志
b.通知應(yīng)用程序處理當(dāng)前幀的消息緩沖區(qū)
BC程序?qū)Ξ?dāng)前幀的消息緩沖區(qū)進(jìn)行處理,根據(jù)安排的消息內(nèi)容提取所需的消息數(shù)據(jù),如果有RT返回的矢量字請(qǐng)求,就組織跟矢量字相關(guān)的消息成非周期消息幀并安排傳輸。
下面是VxWorks系統(tǒng)下BC驅(qū)動(dòng)的實(shí)例代碼,適用于61581芯片PCI總線的1553B接口卡(此接口卡有消息傳輸出錯(cuò)重傳功能):
//獲得設(shè)備基地址信息
if(pciFindDevice(BU61581_VENDOR_ID,BU61581_DEVICE_ID,0,
&pciBus,&pciDevice,&pciFunc)==OK)
{
pciConfigInLong(pciBus,pciDevice,pciFunc,PCI_CFG_BASE_ADDRESS_1,&reg_9052_base);
pciConfigInLong(pciBus,pciDevice,pciFunc,PCI_CFG_BASE_ADDRESS_2,&membase);
pciConfigInLong(pciBus,pciDevice,pciFunc,PCI_CFG_BASE_ADDRESS_3,&regbase);
pciConfigInByte(pciBus,pciDevice,pciFunc,PCI_CFG_DEV_INT_LINE,&irq);
pciConfigOutWord(pciBus,pciDevice,pciFunc,PCI_CFG_COMMAND,PCI_CMD_IO_ENABLE|PCI_CMD_MEM_ENABLE|PCI_CMD_MASTER_ENABLE);
membase&=PCI_MEMBASE_MASK;
}
//掛接中斷處理程序
pciIntConnect((VOIDFUNCPTR*)INUM_TO_IVEC(VECTOR),(VOIDFUNCPTR)BCinterrupt,0);
Reset61581();//復(fù)位
//設(shè)置相關(guān)寄存器
sysOutWord(IntMaskReg,0x0018);//END -OF-FRAME(bit3),Enable interrupts
//for BC Control Word(individual message(s))(bit4)
sysOutWord (Config1Reg,0x0010);//BCMODE,Message retries,Area A(bit13)
sysOutWord(Config2Reg,0x0418);//Enable BC Message Block 256-WORD BOUNDARIES DISABLED,
//INT STATUS AUTO CLEAR,LEVEL Interrupt
sysOutWord(Config4Reg,0x12e0);//EXP BC CNTL WD ENA,RETRY IF STAT SET,1ST RETRY SAME,
//2ND RETRY ALT,VALID BUSY/NO DATA,VALIDMESSAGEERROR/NO DATAsysOutWord(Config5Reg,0x0a00);//Enable EXPANDED ZERO CROSSING,programs BC Response Timeout to 22.5us
sysOutWord(StartResetReg,START);//BC 啟動(dòng)
中斷處理程序
StatusWord=sysInWord(IntStatusReg);//讀取中斷狀態(tài)寄存器
中斷處理程序主要完成讀取中斷狀態(tài)寄存器,識(shí)別中斷類型。一般設(shè)置有消息出錯(cuò)中斷、消息幀結(jié)束中斷,如果是消息出錯(cuò)中斷則進(jìn)行出錯(cuò)處理,安排消息切換總線通道重傳等,如果是幀結(jié)束中斷則通知BC主控程序安排下一幀消息傳輸。
BC其它功能模塊主要實(shí)現(xiàn)包括數(shù)據(jù)和方式碼的接收、發(fā)送,如下所示:
BCReadBsw(int messnum);//讀取塊狀態(tài)字
BCReadData unsigned short*data,short msgnum();//讀取數(shù)據(jù)
BCReadMC(short msgnum);//讀取方式碼
BCSendData(short rt,short sa,unsigned short*Data,short length,);//發(fā)送數(shù)據(jù)
BCSendMC(short channel,short rt,short mcdata,);//發(fā)送方式碼
當(dāng)RT接收到BC有指令后,必需在標(biāo)準(zhǔn)規(guī)定的時(shí)間內(nèi)做出響應(yīng),收到非法命令時(shí)要丟棄完成信息的傳輸,必要時(shí)給BC返回一個(gè)狀態(tài)字
RT模式工作流程
a.初始化1553B接口卡,獲取設(shè)備基地址信息,設(shè)置中斷屏蔽寄存器等;
b.掛接中斷處理程序等;
c.初始化查找表,定位接收子地址和發(fā)送子地址,寫入查找表。設(shè)置子地址控制字,設(shè)置中斷向量;
d.設(shè)置RT上線。
RT中斷服務(wù)程序;
a.清中斷;
b.根據(jù)中斷處理?xiàng)l件,修改堆棧指針位置;
c.如果是發(fā)送矢量字方式碼中斷,通知應(yīng)用程序可以發(fā)送非周期消息;如果是BC發(fā)送的帶數(shù)據(jù)的同步字方式碼或者類似的通知消息幀完成的中斷,則通知應(yīng)用程序處理RT消息堆棧,讀取所需數(shù)據(jù);通知方式采用發(fā)送信號(hào)量的形式。
下面是VxWorks系統(tǒng)下RT驅(qū)動(dòng)的實(shí)例代碼,適用于61581 PCI接口總線的1553B卡:
//獲得設(shè)備基地址信息代碼同BC驅(qū)動(dòng)設(shè)計(jì)
//掛接中斷處理程序
pciIntConnect((VOIDFUNCPTR*)INUM_TO_IVEC(VECTOR),(VOIDFUNCPTR)RTinterrupt,0);
Reset61581();//復(fù)位
sysIntEnablePIC(LEVEL);/*unmask the interrupt level*/
sysOutWord(IntMaskReg,0x0012);//RT SUBADDRCONTROLWORDEOM,RTSELECTED MODE CODE INT
sysOutWord (Config2Reg,0x881e);//ENHANCED INT ENA,OVRWRT INVAL DTA ENA,
//INT STATUS AUTO CLR,ENHANCED RT MEM MNGMT,CLR SERVICE REQUEST
sysOutWord(Config3Reg,0x8080);//KEEP ENHANCED MODE,ILLEGAL DISBLD,
//(RTFAIL-FLAG WARP ENA,)ENHANCED MODE CODE HANDLNG
sysOutWord(Config4Reg,0x2008);//MODE CODE OVERRIDE BUSY,LATCH RTADDR WITH CR5
sysOutWord(Config5Reg,0x0b00);//EXP ZERO- CROSSENA,TIMEOUT22.5us,GAP CHECK ENA//Initialize Block Status Word to 0
for(w=0;w<256;w=w+4)
*(pMem+w)=0;//pMem基地址指針
Init1553RTLookTable();//初始化查找表
for(w=0;w<=32;w++)
{
lt- >R[w]=RTDataBlkBgnA+32*w;//Rx
....}
sysOutWord(StartResetReg,START);//RT 上線
RT中斷處理
StatusWord=sysInWord(IntStatusReg);//讀取中斷狀態(tài)寄存器
if((StatusWord&RT_CONTROL_EOM_INT)==RT_CONTROL_EOM_INT)
{semGive(SEMA_RECEIVE);//釋放信號(hào)量,通知相關(guān)任務(wù)接收、發(fā)送總線信息
...
}
RT其它功能模塊主要有總線數(shù)據(jù)和方式碼的接收和發(fā)送,具體如下所示:
RTReadData(short subaddr,short*recvbuf);//通過(guò)接口板基地址和查找表中的地址讀取總線數(shù)據(jù)
RTReadMC(unsigned short*recvbuf);//通過(guò)接口板基地址和接收子地址0讀取方式碼數(shù)據(jù)
RTSendData(short subaddr,unsigned short*recvbuf);//通過(guò)接口板基地址和查找表中的地址放置需要發(fā)送的數(shù)據(jù)
RTSendMC(unsigned short*recvbuf);//通過(guò)接口板基地址和查找表中的地址放置需要發(fā)送的方式碼
總線監(jiān)視器主要完成接收總線通信的所有消息或提取經(jīng)選擇選定的終端消息??偩€監(jiān)視器使使用者對(duì)整個(gè)總線的運(yùn)行情況有比較全面地了解,為故障定位和事后處理提供有用的信息。
MT模式工作流程:
a.初始化1553B接口卡,獲取設(shè)備基地址信息,設(shè)置中斷屏蔽寄存器等;
b.設(shè)置監(jiān)控方式(分為監(jiān)控全部消息和特定消息方式),設(shè)置中斷向量;
c.啟動(dòng)MT開始監(jiān)聽總線信息。
下面是VxWorks系統(tǒng)下MT驅(qū)動(dòng)的實(shí)例代碼,采用字監(jiān)控方式,適用于61581 PCI總線的1553B接口卡:
sysIntDisablePIC(LEVEL);/* unmask the interrupt level*///關(guān)中斷
//掛接中斷處理程序
(void)pciIntConnect((VOIDFUNCPTR*)INUM_TO_IVEC(VECTOR),(VOIDFUNCPTR)MTinterrupt,0);
Reset61581();//復(fù)位
sysOutWord(Config3Reg,0x8000);//ENHANCED MODE
sysIntEnablePIC(LEVEL);/*unmask the interrupt level*/
WordSet(pMem,0,MEM_MAX_ADDR+1);//Clear memory on card
//字監(jiān)控方式
sysOutWord(IntMaskReg,0x0002);//MT PATTERN TRIGGER
sysOutWord (Config1Reg,0x5800);//MT MODE,TRIGGER ENABLED WORD(bit 10,9:Start,Stop on trigger)
sysOutWord(Config2Reg,0x0018);//INT STATUS AUTO CLR,LEVEL INT REQUEST
sysOutWord(StartResetReg,START);//啟 動(dòng)MT
MT中斷處理
61581芯片有字監(jiān)控方式和特定消息監(jiān)控方式,字監(jiān)控方式監(jiān)控全部總線消息,遇到MT TRIGGER WORD觸發(fā)中斷;特定消息方式監(jiān)控特定RT的特定接收發(fā)送子地址消息,設(shè)定消息結(jié)束產(chǎn)生中斷就可以觸發(fā)中斷。觸發(fā)中斷后,采用信號(hào)量的方式通知處理任務(wù)讀取數(shù)據(jù)。
semGive(semMTNotify);//釋放信號(hào)量、使能數(shù)據(jù)處理任務(wù)進(jìn)行數(shù)據(jù)讀取處理。
MT其它功能模塊實(shí)現(xiàn),主要是讀取、處理監(jiān)聽到的總線信息,如下所示:
MTReadData(unsigned short*Data);//定位總線信息緩沖區(qū),讀取數(shù)據(jù);
MTDataHandle(unsigned short*Data);//總線數(shù)據(jù)存儲(chǔ)解釋
a.解決數(shù)據(jù)覆蓋問(wèn)題:RT中斷的方式可以是單消息中斷一次,也可以是一個(gè)周期中斷一次,即幀中斷。單消息中斷實(shí)時(shí)性好、捕捉消息響應(yīng)延時(shí)小,在RT驅(qū)動(dòng)設(shè)計(jì)時(shí),需要考慮如果進(jìn)中斷太頻繁,而信息讀取任務(wù)來(lái)不及處理總線上收到的信息,會(huì)導(dǎo)致1553B接口卡上來(lái)不及處理的信息被新到信息覆蓋的問(wèn)題。解決辦法是提高信息讀取任務(wù)優(yōu)先級(jí),結(jié)合BC命令表設(shè)計(jì),重新設(shè)定進(jìn)中斷條件,如某個(gè)子地址接收到數(shù)據(jù)后才進(jìn)中斷。
b.BC冗余切換問(wèn)題:1553B總線是雙冗余的,傳輸線、總線接口都是雙備份的,每次傳輸僅在一條總線上進(jìn)行,而另一條處于熱備份狀態(tài),消息的傳輸通過(guò)可編程在錯(cuò)誤情況下進(jìn)行通道切換,正常情況下,主BC享有總線控制權(quán),控制總線調(diào)度。當(dāng)主BC出現(xiàn)故障時(shí),備份BC識(shí)別到主BC失效后,便自動(dòng)奪取總線的控制權(quán),控制總線系統(tǒng)繼續(xù)正常工作,切換時(shí)間必須達(dá)到毫秒級(jí),以防總線信息的丟失。備份BC可以通過(guò)RT或者M(jìn)T的模式接入總線,并保持和工作BC的交互,動(dòng)態(tài)識(shí)別主BC的狀態(tài),不能干涉工作BC對(duì)總線的控制。
c.BC出錯(cuò)處理,BC對(duì)總線上傳送的消息要進(jìn)行正確性驗(yàn)證,當(dāng)發(fā)生錯(cuò)誤和故障時(shí),BC還要進(jìn)行錯(cuò)誤處理和系統(tǒng)維護(hù)等。當(dāng)BC確認(rèn)在一個(gè)傳輸通道上的傳輸發(fā)現(xiàn)故障時(shí),可使系統(tǒng)轉(zhuǎn)到另一個(gè)傳輸通道正常工作。當(dāng)BC識(shí)別到某個(gè)RT失效或從失效狀態(tài)變?yōu)楣ぷ鳡顟B(tài)時(shí),要重新更新指令表,安排合適的消息幀進(jìn)行總線通信。
通過(guò)介紹1553B總線,一種時(shí)分制指令/響應(yīng)式多路傳輸數(shù)據(jù)總線,分析了它的工作原理和特點(diǎn),給出了基于VxWorks嵌入式操作系統(tǒng)進(jìn)行1553B接口卡驅(qū)動(dòng)程序設(shè)計(jì)開發(fā)的方法,并結(jié)合VxWorks下的實(shí)例對(duì)BC、RT及MT的驅(qū)動(dòng)程序開發(fā)做了說(shuō)明。最后,給出了驅(qū)動(dòng)程序開發(fā)時(shí)的注意事項(xiàng)。
[1]孔祥營(yíng),柏桂枝.嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks及其開發(fā)環(huán)境Tornado[M].北京:中國(guó)電力出版社,2002.
[2]孔祥營(yíng),張保山,俞烈彬.VxWorks驅(qū)動(dòng)及分布式編程[M].北京:中國(guó)電力出版社,2007.
[3]ILC Data Device Corporation.ACE/Mini- ACE User’s Guide[M].Wilbur Place,Bohemia,New York,1998.
[4]杜改麗,封治華,王勇.1553B總線協(xié)議分析及應(yīng)用[J].儀器儀表用戶,2007(2):6 -7.