2009年8月10日 星期一

uCOS-II Win32 Port解析及改善 -- 3

Win32 port運作原理解析:


基本原理是使用WindowsThread機制來做為uCOS-IITask管理。但實際上有許多細節要處理。一般要移植有幾件事要處理。


1.    Critical Section方法選擇


2.    Context Switch的方法


3.    InterruptTimer Interrupt處理


在移植到CPU時,因CPU的特性有一定行為,可以找出對應方法。


但在作業系統上做移植,仍要處理,但面對的行為不同,所要處理方式變得完全不同。


在使用作業系統的Thread做為管理時,所要考量的項目及目標為:


1.    Context Switch的方法:因為己非CPU動作,所以此項行為要借用被寄生作業系統的既有動作。在此次porting是使用Event觸發的方式做,借由另一個優先權最高的排程器程式來執行,而Context Switch真正工作已由被寄生作業完成,只剩下排程。而排程不可能由Task來執行,因為Thread只可以被suspendresume,中間無法插入其他程式去執行,故必須產生一個獨立的Thread來執行。


2.    Interrupt方法:由被寄生作業系統的Event觸發執行的Thread來做,也會使用排程器,另外加上UserInterrupt hook


3.    Critical Section設定:只需關閉寄生作業系統所使用的Event就可以做到。


4.    Idle Task的方法:在CPU時會跑計數器,但在寄生則要加上Sleep(),將工作權還給被寄生作業系統。


依函式名稱有修改的列表為:


OSCtxSw(void)


OSIntCtxSw(void)


OSStartHighRdy(void)


OSTaskIdleHook()


OSTimeTickInit(void)


OSTaskStkInit(...)


OSTCBInitHook(OS_TCB * pTcb)


OSInitHookBegin()


以上皆為使用原先的功能及Hook功能加載來加入所需處理程序。


四種重要的函式為


OSEnableInterruptFlag(void)


OSDisableInterruptFlag(void)


OSScheduleThread(INT32U param)


OSInterruptThread(INT32U param)




前二個函式為Critical Section所使用。後面二個為Thread程式本身,也是此porting關鍵之所在。而使用二個獨立的Thread來做為ScheduleInterrupt的工作是在CPU移植上不會見到。可以若以多重CPU的系統來說,這反而是更為合理的做法,因為在CPU數量無限的狀況下,O.S. context switch是浪費時間的,而由另一個CPU做排程會是更好的方法。經由了解二個額外的Thread可以更清楚的了解在Win32 port的工作內容。




OSScheduleThread(INT32U param)主要工作是承接由OSCtxSw(void)呼叫之後的工作。故此Thread就必須擁有最高的執行優先權,由Win32API的行程同步函式WaitForSingleObject()做為其等待的函式。在等到有觸發產生執行時先以維護uC/OS-II應做的事,最後再以SuspendThread()ResumeThread()此二個Win32API函式做為uCOS-II中的Task切換的工作的控制。在此並不像切換,反倒是更像開關。而所有的Task必須在Win32API下註冊為一獨立的Thread才可以正常運作。在Win32 port中以hTaskThread[]變數做為ThreadHandle存放矩陣,對應數目和TCB相同。故可以看到在處理TCB時也必須修改。但在OS_TaskChangePrio()因無Hook函式可以用,因而無法使用。




OSInterruptThread(INT32U param)工作內容較為簡單,在Win32 port中主要是模擬出八個中斷給uC/OS-II用,除了interrupt 0是保留給Timer用,其餘皆為使用者定義。使用Win32APIWaitForMultiObjects()為其等待函式,hInterruptEvent[]變數則為存放Event Handle的地方。Win32APIEvent在使用後必須呼叫ResetEvent()Event做清除動作。而User Interrupt function則存放於interruptTable[n]()函式指標矩陣中。




由以上解析可知,在Windows端使用到的函式為


OpenEvent()


SetEvent()


WaitForSingleObject()


WaitForMultiObjects()


setTimeEvent()


ResetEvent()


可以查Win 32A PI中對於這些函式的使用方式就可以了解寄生及被寄生作業系統之間的相關性。


沒有留言:

張貼留言