李 松,張書濱
(中國船舶重工集團公司江蘇自動化研究所,連云港222006)
1553B是MIL-STD-1553B的簡稱,即飛機內部時分制指令/響應式多路傳輸數(shù)據(jù)總線,1553B總線著重強調系統(tǒng)的實時性、高可靠性以及對系統(tǒng)通信出錯時的故障診斷和管理功能,采用時分多路復用技術(TDM)。VxWorks是由美國風河公司推出的嵌入式實時操作系統(tǒng),以其不斷推出的升級版本、高性能可裁減內核以及友好的用戶開發(fā)環(huán)境,在嵌入式操作系統(tǒng)應用領域占據(jù)重要地位。由于都具有強實時性,高可靠性的優(yōu)點,這兩種技術的結合現(xiàn)已廣泛應用于航空航天、軍事裝備、車載電子、數(shù)字傳輸設備等各個領域。下面重點探討在VxWork系統(tǒng)下進行1553B驅動程序設計的方法。
1553B總線通常由總線節(jié)點、總線電纜、端接器、耦合器、短截線和連接器組成,其中總線節(jié)點包括一個總線控制器(BC)、最多31個遠程終端(RT)和一個總線監(jiān)控器(MT)。BC負責管理和控制總線上的信息傳輸;MT負責接收總線上的信息用于總線的測試;RT負責響應總線命令,執(zhí)行數(shù)據(jù)傳輸。1553B總線組成如圖1所示。
圖1 1553B 總線組成框圖
1553B總線是一種命令/響應式總線,所有在總線上的命令和數(shù)據(jù)都由一個單獨的BC激活,除了BC,任何終端無法激活總線通信。總線上的通信以周期為單位批量進行,消息是周期內數(shù)據(jù)傳輸?shù)淖钚挝?。每類消息賦予一個子地址,消息數(shù)據(jù)長度不超過32字,每個RT最多可以響應32條接收消息和32條發(fā)送消息;典型的1553B總線上消息傳輸?shù)倪^程是:總線控制器向某一終端發(fā)布一個接收/發(fā)送指令,終端在給定的響應時間范圍內發(fā)回一個狀態(tài)字并執(zhí)行消息的接收/發(fā)送。BC通過驗收RT回應的狀態(tài)字來檢驗傳輸是否成功并做后續(xù)的操作。在這個過程中,MT可以監(jiān)視數(shù)據(jù)總線上的信息以收集總線上所有數(shù)據(jù),也可以有選擇性的進行收集。
基于VxWorks進行1553B驅動開發(fā)時,需對1553B接口卡進行相應的初始化和配置,并完成中斷處理程序,實現(xiàn)各功能模塊?;赩xWorks的1553B驅動程序開發(fā)流程如圖2所示。
圖2 基于VxWorks的1553B驅動程序開發(fā)流程
消息是構成1553B總線通訊的基本單位,BC的主要任務是組織消息,通過消息實現(xiàn)總線上各終端間的信息傳輸。如果需要完成一定的功能,就要將多個消息組織起來,形成一個新的結構叫做消息幀(frame),消息可分為周期消息和非周期消息。非周期消息的實現(xiàn)方法是BC以固定的小周期向RT發(fā)送矢量字方式碼指令來詢問,被查詢的RT若有事件請求,就將矢量字置位,BC在下一幀消息中增加處理該事件的指令。每一周期消息幀的描述塊、消息塊內容和堆棧的消息處理個數(shù)都不一樣,每一幀消息都需要在保留周期性消息的前提下增加非周期性消息描述塊、復位堆棧指針、更改消息個數(shù)、更新消息塊、填寫發(fā)送數(shù)據(jù)和接收數(shù)據(jù)。BC模式的工作流程如下所述:
a.初始化1553B接口卡,獲取設備地址信息,設置中斷屏蔽寄存器等;
b.設置中斷向量,掛接中斷處理程序;
c.定義周期、非周期消息,啟動BC,出錯、超時處理。
BC中斷服務程序主要處理:
a.清中斷,置當前幀結束標志
b.通知應用程序處理當前幀的消息緩沖區(qū)
BC程序對當前幀的消息緩沖區(qū)進行處理,根據(jù)安排的消息內容提取所需的消息數(shù)據(jù),如果有RT返回的矢量字請求,就組織跟矢量字相關的消息成非周期消息幀并安排傳輸。
下面是VxWorks系統(tǒng)下BC驅動的實例代碼,適用于61581芯片PCI總線的1553B接口卡(此接口卡有消息傳輸出錯重傳功能):
//獲得設備基地址信息
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();//復位
//設置相關寄存器
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 啟動
中斷處理程序
StatusWord=sysInWord(IntStatusReg);//讀取中斷狀態(tài)寄存器
中斷處理程序主要完成讀取中斷狀態(tài)寄存器,識別中斷類型。一般設置有消息出錯中斷、消息幀結束中斷,如果是消息出錯中斷則進行出錯處理,安排消息切換總線通道重傳等,如果是幀結束中斷則通知BC主控程序安排下一幀消息傳輸。
BC其它功能模塊主要實現(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ā)送方式碼
當RT接收到BC有指令后,必需在標準規(guī)定的時間內做出響應,收到非法命令時要丟棄完成信息的傳輸,必要時給BC返回一個狀態(tài)字
RT模式工作流程
a.初始化1553B接口卡,獲取設備基地址信息,設置中斷屏蔽寄存器等;
b.掛接中斷處理程序等;
c.初始化查找表,定位接收子地址和發(fā)送子地址,寫入查找表。設置子地址控制字,設置中斷向量;
d.設置RT上線。
RT中斷服務程序;
a.清中斷;
b.根據(jù)中斷處理條件,修改堆棧指針位置;
c.如果是發(fā)送矢量字方式碼中斷,通知應用程序可以發(fā)送非周期消息;如果是BC發(fā)送的帶數(shù)據(jù)的同步字方式碼或者類似的通知消息幀完成的中斷,則通知應用程序處理RT消息堆棧,讀取所需數(shù)據(jù);通知方式采用發(fā)送信號量的形式。
下面是VxWorks系統(tǒng)下RT驅動的實例代碼,適用于61581 PCI接口總線的1553B卡:
//獲得設備基地址信息代碼同BC驅動設計
//掛接中斷處理程序
pciIntConnect((VOIDFUNCPTR*)INUM_TO_IVEC(VECTOR),(VOIDFUNCPTR)RTinterrupt,0);
Reset61581();//復位
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);//釋放信號量,通知相關任務接收、發(fā)送總線信息
...
}
RT其它功能模塊主要有總線數(shù)據(jù)和方式碼的接收和發(fā)送,具體如下所示:
RTReadData(short subaddr,short*recvbuf);//通過接口板基地址和查找表中的地址讀取總線數(shù)據(jù)
RTReadMC(unsigned short*recvbuf);//通過接口板基地址和接收子地址0讀取方式碼數(shù)據(jù)
RTSendData(short subaddr,unsigned short*recvbuf);//通過接口板基地址和查找表中的地址放置需要發(fā)送的數(shù)據(jù)
RTSendMC(unsigned short*recvbuf);//通過接口板基地址和查找表中的地址放置需要發(fā)送的方式碼
總線監(jiān)視器主要完成接收總線通信的所有消息或提取經(jīng)選擇選定的終端消息。總線監(jiān)視器使使用者對整個總線的運行情況有比較全面地了解,為故障定位和事后處理提供有用的信息。
MT模式工作流程:
a.初始化1553B接口卡,獲取設備基地址信息,設置中斷屏蔽寄存器等;
b.設置監(jiān)控方式(分為監(jiān)控全部消息和特定消息方式),設置中斷向量;
c.啟動MT開始監(jiān)聽總線信息。
下面是VxWorks系統(tǒng)下MT驅動的實例代碼,采用字監(jiān)控方式,適用于61581 PCI總線的1553B接口卡:
sysIntDisablePIC(LEVEL);/* unmask the interrupt level*///關中斷
//掛接中斷處理程序
(void)pciIntConnect((VOIDFUNCPTR*)INUM_TO_IVEC(VECTOR),(VOIDFUNCPTR)MTinterrupt,0);
Reset61581();//復位
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);//啟 動MT
MT中斷處理
61581芯片有字監(jiān)控方式和特定消息監(jiān)控方式,字監(jiān)控方式監(jiān)控全部總線消息,遇到MT TRIGGER WORD觸發(fā)中斷;特定消息方式監(jiān)控特定RT的特定接收發(fā)送子地址消息,設定消息結束產(chǎn)生中斷就可以觸發(fā)中斷。觸發(fā)中斷后,采用信號量的方式通知處理任務讀取數(shù)據(jù)。
semGive(semMTNotify);//釋放信號量、使能數(shù)據(jù)處理任務進行數(shù)據(jù)讀取處理。
MT其它功能模塊實現(xiàn),主要是讀取、處理監(jiān)聽到的總線信息,如下所示:
MTReadData(unsigned short*Data);//定位總線信息緩沖區(qū),讀取數(shù)據(jù);
MTDataHandle(unsigned short*Data);//總線數(shù)據(jù)存儲解釋
a.解決數(shù)據(jù)覆蓋問題:RT中斷的方式可以是單消息中斷一次,也可以是一個周期中斷一次,即幀中斷。單消息中斷實時性好、捕捉消息響應延時小,在RT驅動設計時,需要考慮如果進中斷太頻繁,而信息讀取任務來不及處理總線上收到的信息,會導致1553B接口卡上來不及處理的信息被新到信息覆蓋的問題。解決辦法是提高信息讀取任務優(yōu)先級,結合BC命令表設計,重新設定進中斷條件,如某個子地址接收到數(shù)據(jù)后才進中斷。
b.BC冗余切換問題:1553B總線是雙冗余的,傳輸線、總線接口都是雙備份的,每次傳輸僅在一條總線上進行,而另一條處于熱備份狀態(tài),消息的傳輸通過可編程在錯誤情況下進行通道切換,正常情況下,主BC享有總線控制權,控制總線調度。當主BC出現(xiàn)故障時,備份BC識別到主BC失效后,便自動奪取總線的控制權,控制總線系統(tǒng)繼續(xù)正常工作,切換時間必須達到毫秒級,以防總線信息的丟失。備份BC可以通過RT或者MT的模式接入總線,并保持和工作BC的交互,動態(tài)識別主BC的狀態(tài),不能干涉工作BC對總線的控制。
c.BC出錯處理,BC對總線上傳送的消息要進行正確性驗證,當發(fā)生錯誤和故障時,BC還要進行錯誤處理和系統(tǒng)維護等。當BC確認在一個傳輸通道上的傳輸發(fā)現(xiàn)故障時,可使系統(tǒng)轉到另一個傳輸通道正常工作。當BC識別到某個RT失效或從失效狀態(tài)變?yōu)楣ぷ鳡顟B(tài)時,要重新更新指令表,安排合適的消息幀進行總線通信。
通過介紹1553B總線,一種時分制指令/響應式多路傳輸數(shù)據(jù)總線,分析了它的工作原理和特點,給出了基于VxWorks嵌入式操作系統(tǒng)進行1553B接口卡驅動程序設計開發(fā)的方法,并結合VxWorks下的實例對BC、RT及MT的驅動程序開發(fā)做了說明。最后,給出了驅動程序開發(fā)時的注意事項。
[1]孔祥營,柏桂枝.嵌入式實時操作系統(tǒng)VxWorks及其開發(fā)環(huán)境Tornado[M].北京:中國電力出版社,2002.
[2]孔祥營,張保山,俞烈彬.VxWorks驅動及分布式編程[M].北京:中國電力出版社,2007.
[3]ILC Data Device Corporation.ACE/Mini- ACE User’s Guide[M].Wilbur Place,Bohemia,New York,1998.
[4]杜改麗,封治華,王勇.1553B總線協(xié)議分析及應用[J].儀器儀表用戶,2007(2):6 -7.