1 前言 LonWorks現場總線是美國Echelon公司推出的局部操作網絡,它具有統一性、開放性、互操作性及支持多種通信介質等優良性能,是當今最流行的現場總線之一。但是由于LonWorks控制節點的核心神經元芯片(Neuron Chip)的應用處理能力相對較弱,因而對于復雜的應用常使用主從處理器結構,主處理器完成用戶的應用功能,而把Neuron芯片作為通信協處理器。由于可以提高了節點的處理能力,節省資金和開發時間,因此,具有多功能的通用嵌入式主處理器具有很好的應用前景。本文采用的MSP430F149主處理器是TI公司基具有較高的集成度的芯片,簡化了應用系統的硬件設計,適合作為多用途智能節點。 2 ShortStack的介紹和實現 2.1 ShortStack的結構 ShortStack微服務器是Echelon公司提供的一套開發包,其結構圖如下: 圖1 ShortStack結構圖 由圖可看到,主處理器與ShortStack 微服務器通信通過ShortStack API函數來實現,通常使用其中的5個,lonInit(),lonEventHandler(),lonPropagateNv(),lonPollNv()和lonsendServicePin()。ShortStack Micro Server,運行ShortStack固件,運行LonTalk協議的1~6層;主處理器運行SCI串口驅動程序,運行ShortStack API函數,處理與Lonworks其他節點通信;主處理器應用部分調用ShortStack API函數。主處理器設備的接口支持文件,由Neuron C model file 通過使用ShortStack向導來產生,產生數據表定義網絡變量和收發器參數。而Model file只需要聲明網絡變量NVs,配置屬性CPs和功能模塊FBs,因此,可以不需要熟悉Neuron C。 串行驅動程序為主處理器和從處理器之間提供一個獨立的接口。整個串行驅動程序由兩部分構成:上層驅動程序為主應用程序提供一個接口;底層驅動程序完成與神經元芯片的硬件接口。上層和底層驅動之間的數據交換通過緩沖隊列完成。底層驅動程序與從處理器的通訊包括SCI上傳和SCI下傳兩類,SCI上傳是數據由神經元芯片上傳到主處理器;SCI下傳是數據由主處理器下傳到神經元芯片。 2.2 ShortStack的軟件實現 采用提供的Neuron C模板事例修改編寫。主要修改ldvsci.h和ldvsci.c中與MSP430F149處理器相關的語句。 在ldvsci.h中,修改為: #define ENABLE_RX_TX() (ME1 | = UTXE0+URXE0) #define ENABLE_TX_ISR() (IE1 |= 0x80) #define ENABLE_TX_COMPLETE_ISR() (IFG1|=0x80) //USART0發送標志 #define ENABLE_RX_ISR() (IE1|= 0x40) //enable SCI receive interrupt #define DISABLE_TX_ISR() (IE1 &= "0x80) #define DISABLE_TX_COMPLETE_ISR() (IFG1 &= "0x80) // USART0發送標志復位 #define DISABLE_RX_ISR() (IE1 &= "0x40) #define CHECK_RTS() (P2OUT& 0x02) // check RTS #define CHECK_CTS() (P2IN& 0x01) // check CTS #define ASSERT_RTS() (P2OUT &= "0x02) // assert RTS #define DEASSERT_RTS() (P2OUT|= 0x01) // deassert RTS #define DEASSERT_HRDY() (P2OUT |= 0x04) // deassert _HRDY #define ASSERT_HRDY() (P2OUT &= "0x04) // assert _HRDY 在ldvsci.h中,修改了void SysResetSCI(void) ,void SysInit(void), void SysUpdateWDT(void), @interrupt void RxInt (void)以及@interrupt void TxInt (void)中與MSP430F149相關的程序。 其他文件做少許改變,其中platform.h定義了BIG_ENDIAN and LITTLE_ENDIAN的區別,對應于哈佛結構和馮.諾伊曼體系結構。由于MSP430F149核是馮.諾伊曼體系結構的,所以ShortStack需用LITTLE_ENDIAN(即高字節存在高位地址)。 2.3 ShortStack的硬件件實現 從處理器(如圖2)采用TP/FT-10F控制模塊,該模塊由微型電路板構成, 包括一個3150 芯片、一塊閃存、一個通信收發器、電源連接器、I/O 口和網絡接口, 其中IO_0~IO_10 為神經元芯片3150 的11 個I/O 管腳用于對控制設備的連接, DataA 和DataB 是FTT- 10收發器與網絡的連接口,它能夠將主處理器經過處理輸出的數據發送到LON 總線,也可以將LON 總線上的消息傳送給主處理器。 主處理器與神經元芯片之間的通信采用SCI模式。SCI接口是一個半雙工串行異步通信接口,通信的格式是:一個起始位,8個數據位和一個停止位(LSB在先)。通信模式的選擇由IO3確定,IO3接地選擇SCI通信模式。IO5、IO6則用來選擇通訊速率。 3 μcos_Ⅱ的移植 μcos_Ⅱ的全部源代碼,共16個文件。移植工作涉及的源文件分為三部分:與處理器無關的代碼部分,這部分代碼完成操作系統的基本功能,包括10個文件,即:OS_CORE.C,OS_MBOX.C,OS_MEM.C,OS_Q.C,OS_SEM .C,OS_TASK.C,OS_TIME.C.OS_FLAG.C,OS MUTEX.C,uCOS_II.H。設置代碼部分,包括OS—CFG.H 和INCLUDES.H 兩個頭文件,用來進行操作系統配置。 圖2 主從處理器連接圖 最主要的部分是與處理器有關部分的代碼,包括一個頭文件OS_CPU.H、一個C代碼文件OS_CPU_C.C 及一個匯編文件OS_CPU_A.ASM,將其移植到MSP430F149處理器上,需要修改這3個與體系結構相關的文件,代碼量大約是500行。下面分別介紹這3個文件的移植。 OS_CPU.H這部分代碼包括數據類型定義、堆棧單位定義、堆棧增長方向定義、關中斷和開中斷的宏定義以及進行任務切換的宏定義等。其中,為了在不同的工作模式下調用系統的底層接口函數不受訪問權限的限制,使用軟中斷SWI。堆棧的單位與CPU的寄存器長度一致,結構常量OS_STK_GROWTH置1,表示堆棧從由高地址向低地址增長。 OS_CPU_C.C要求編寫六個簡單的c函 數:OSTaskSiklnit();OSTaskCreateHook();OSTaskDelHook();OSTaskSwHook();OSTaskStatHook();OSTimeTickHook()唯一必要的函數是OSTaskStklnit(),其它五個函數必須聲明但沒必要包含。對于OSTaskStklnit()而言,OSTaskCreate()和OSTaskCreateExt()通過調用OSTaskStkInit()來初始化任務的堆棧結構,OSTaskStkInit()返回堆棧指針所指的地址,OSTaskCreate()會獲得該地址并將它保存到任務控制塊(OS TCB)中。 CPU_ A.ASM要求編寫四個簡單的匯編語言函數:OSStartHighRdy();OSCtxSw(); OSIntCtxSw();OSTickISR()。將所有與處理器相關的代碼放到OS_CPU_C.C文件中,而不必放在一些分散的匯編語言文件中。 (1)OSStartHighRdy():運行高優先級就緒任務函數OSStartHighRdy()必須調用OSTaskSwHook(),因為OSTaskSwHook()可以通過檢查OSRunning而確定是OSStartHighRdy()在調用它(OSRunning為FALSE)還是正常的任務切換在調用它(OSRunning為TRUE)。OSStartHighRdy()還必須在最高優先級任務恢復之前和調用OSTaskSwHook()之后設置OSRunning為TRUE。 (2)OSCtxSw()、OSIntCtxSw():上下文切換函數任務級的切換是通過發軟中斷命令來完成的,其中斷向量地址必須指向OSCtxSw()。中斷級的切換由OSIntExit()通過調用OSintCtxSw()來執行切換功能。 (3)OSTickISR():定時中斷函數OSTickISR()函數主要負責進人中斷時保存處理器寄存器內容,完成任務切換退出時恢復處理器寄存器內容并返回,相當于中斷服務程序的入口。 4 μc/os_Ⅱ與ShortStack的結合 因為μc/os_Ⅱ嵌入式操作系統代碼和ShortStack應用程序代碼的固有的特征,兩者可以有機的結合在一起。μcos_Ⅱ由系統服務,如郵箱、內存管理、消息隊列、信號量管理等,對于這些服務是在OS_CFG.h定義了的,當設計的系統要使用這些服務時只需要將定義的值改為1即可。將ShortStack應用程序中的常量定義全部放在OS_CFG.h中。這樣可以同時對操作系統各種服務函數和ShortStack 的API和APP函數實現了裁減。 將ShortStack應用程序當作μcos_Ⅱ操作系統的一個任務運行。先定義堆棧,以便保存本任務在任務切換時單片機的寄存器的當前值,當μcos_Ⅱ下次調度到該任務運行時就可以從堆棧恢復CPU的值,從而該任務繼續運行。程序如下: OS_STK TaskStartStk[TASK_STK_SIZE]; //任務Task1的任務堆棧 OS_STK ShortStackStk[TASK_STK_SIZE]; //ShortStack的任務堆棧 …//其他任務堆棧 Void main(void) { OSInit(); OSTaskCreat(Task1,(void *)0,& TaskStartStk[TASK_STK_SIZE-1],0); OSTaskCreat(ShortStack,(void *)0,& ShortStackStk[0],2); …//創建其他任務 OSStart(); return 0; } void ShortStack(void) { lonInit(); for(; ; ) { lonEventHandler();//周期性調用檢查是否有任何LonWorks事件要處理 } } 由于μc/os_Ⅱ操作系統沒有任何的硬件驅動,所以用戶自己將ShortStack串口驅動、輸入輸出隊列操作部分擴展為該操作系統的一部分。此外,系統可以添加其他特定的任務,通過系統調度,實現節點的合理利用,增加節點的實用性。如圖4所示。 最后,將帶有TP/FT-10F控制模塊的MSP430F149芯片接入Gizmo4開發板,通過Nodebuilder開發工具編譯,進入調試界面,利用LonMaker連接為兩節點網絡,測試兩節點是否通訊。 圖4 軟件結構圖 5 結束語 MSP430F149是16bit的RISC微處理器,該處理器特別適用于手持式設備以及高性價比、低功耗的網絡設備,它集成了中斷控制、功率控制、存儲控制、UART、PWM、ADC等豐富的資源。由于工業、家庭網絡化的需求,以及LonWorks總線便捷的入網方式,可以使該多用途智能節點分散自制,每個節點一方面分散地解決其特定的任務,另一方面通過點對點、點對多點的通訊,解決節點之間的信息傳輸,實現分散基礎上的融合。上位機要完成對LON 網絡的監控與管理功能,二者之間必須能進行動態數據交換。LON 總線技術還提供了DDE Server 軟件。DDE Server 能夠實現LON網絡和任何具有DDE 功能的Windows 應用程序間交換網絡變量和信息。系統提供給用戶一個十分友好的人機界面,用戶可通過上位機設置各節點實時運行情況以及歷史運行記錄、打印等。 |