基于嵌入式實時操作系統(tǒng)的現(xiàn)場總線網關的設計
opt=opt;
stk= (unsigned int * ) Ptos;
*--stk= (unsigned int) task;
*- -stk=0;
*--stk=0,
*--stk=0,
*--stk=0,
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0;
*--stk=0 (unsigned int) Pdata;
*--stk= (SVCMODE | OxO);
*--stk= (SVCMODE | OxO);
return( (void*) stk);
在 OSTaskCreate( )或 OSTaskCreateEXt( )中調用該函數來初始化任務的堆棧,返回堆棧指針STK。
(三)OS_CPU_A.S
μC/OS-Ⅱ的移植工作的重點和難點主要體現(xiàn)在O_CPU_A.S文件的實現(xiàn)上,主要編寫下面四個匯編語言函數:
OSStanHighRdy( )
OSCtxSw( )
OSIntCtxSw( )
OSTickISR( )
其中最困難的工作又集申在OSIntCtxSw( )和OSTickISR( )兩個函數,因為這兩個函數不僅和相關硬件定時器、中斷積存器的設置有關,而且集中體現(xiàn)了移植的思路。下面分別介紹(具體代碼限于篇幅不詳細列出)。
1.OSStartHighRdy( )
此函數只在多任務啟動時由OSStart( )函數調用一次,功能是從最高優(yōu)先級任務的TCB中得到該任務的堆棧指針sp,并用該指針恢復CPU現(xiàn)場,使得最高優(yōu)先級任務處于就緒狀態(tài)。
2.OSCtxSw( )
該函數實現(xiàn)了任務級的任務切換,流程如圖4所示。任務級的任務切換是通過發(fā)軟中斷指令來完成的,軟中斷矢量指向該函數。在μC/OS-Ⅱ系統(tǒng)中,如果一個任務調用了某個函數而使得更高優(yōu)先級任務進入了就緒狀態(tài),系統(tǒng)就會通過發(fā)SWI來找到OSCtxSw( );在該任務的最后,系統(tǒng)會調用OSShed( )將最高優(yōu)先級任務的地址加載到OSTCBHighRdy中,再調用OS_TASK_SW( )來執(zhí)行軟中斷調用OSCtxSw( )進行任務切換。
3.0SIntCtxSw( )
該函數實現(xiàn)了中斷級任務切換,流程如圖4(b)所示。在ISR中,可能會引起任務的切換,如果需要進行任務切換,則在ISR的最后通過0S_IntEXit( )調用OSIntCtxSw( )實現(xiàn)中斷級任務切換。此函數和OSCtxSw( )函數類似,不同的是該函數進行的是中斷級任務切換,在系統(tǒng)進入中斷時,CPU現(xiàn)場己被保存過了,因此在該函數中不再進行CPU現(xiàn)場保護,只需對堆棧指針做相應的調整即可。
4.OSTickISR( )
該函數用來實現(xiàn)定時器時鐘中斷處理,但在本系統(tǒng)的設計過程中,把定時器中斷設為IRQ中斷模式,并且IRQ中斷包括好多中斷源。因引,把該函數作為IRQ中斷的ISR,再根據中斷號來調用具體的各個中斷服務程序(如定時器中斷、MAC中斷等)。
另外,在系統(tǒng)的啟動文件中,需要建立每種異常的異常向量表,并強制ARM處理器狀態(tài)位svc管理模式。
五、總 結
本設計在s3c451Ob的硬件平臺上成功移植了μC/OS-Ⅱ,并且移植了嵌入式TCP/IP協(xié)議棧LwIP,實現(xiàn)了WorldFIP現(xiàn)場總線和Internet之間的相互通信,使得WorldFIP現(xiàn)場總線成為真正開放的工業(yè)現(xiàn)場總線。在網關的整體設計中,由于系統(tǒng)比較大,任務數較多,用實時內核來管理調度這些任務,要消耗較多的CPU使用率和系統(tǒng)的內存,具有一定的局限性,但在CPU足夠快,內存足夠大的情況下,使用嵌入式網關設計,在保證了工業(yè)現(xiàn)場總線的實時性和可靠性的基礎上,更有利于系統(tǒng)的集成度和再次開發(fā)。
評論