2009年8月18日 星期二
指標的藝術,讀後感
2009年8月17日 星期一
2009年8月10日 星期一
立體視覺計算
之前用Matlab做的,計算時間很久。當時只是驗證可行性。
實驗環境:
左眼照片:
右眼照片:
視差計算結果:
立體圖:
uCOS-II Win32 Port解析及改善 -- 3
Win32 port運作原理解析:
基本原理是使用Windows的Thread機制來做為uCOS-II的Task管理。但實際上有許多細節要處理。一般要移植有幾件事要處理。
1. Critical Section方法選擇
2. Context Switch的方法
3. Interrupt及Timer Interrupt處理
在移植到CPU時,因CPU的特性有一定行為,可以找出對應方法。
但在作業系統上做移植,仍要處理,但面對的行為不同,所要處理方式變得完全不同。
在使用作業系統的Thread做為管理時,所要考量的項目及目標為:
1. Context Switch的方法:因為己非CPU動作,所以此項行為要借用被寄生作業系統的既有動作。在此次porting是使用Event觸發的方式做,借由另一個優先權最高的排程器程式來執行,而Context Switch真正工作已由被寄生作業完成,只剩下排程。而排程不可能由Task來執行,因為Thread只可以被suspend及resume,中間無法插入其他程式去執行,故必須產生一個獨立的Thread來執行。
2. Interrupt方法:由被寄生作業系統的Event觸發執行的Thread來做,也會使用排程器,另外加上User的Interrupt 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來做為Schedule及Interrupt的工作是在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[]變數做為Thread的Handle存放矩陣,對應數目和TCB相同。故可以看到在處理TCB時也必須修改。但在OS_TaskChangePrio()因無Hook函式可以用,因而無法使用。
OSInterruptThread(INT32U param)工作內容較為簡單,在Win32 port中主要是模擬出八個中斷給uC/OS-II用,除了interrupt 0是保留給Timer用,其餘皆為使用者定義。使用Win32API的WaitForMultiObjects()為其等待函式,hInterruptEvent[]變數則為存放Event Handle的地方。Win32API的Event在使用後必須呼叫ResetEvent()將Event做清除動作。而User Interrupt function則存放於interruptTable[n]()函式指標矩陣中。
由以上解析可知,在Windows端使用到的函式為
OpenEvent()
SetEvent()
WaitForSingleObject()
WaitForMultiObjects()
setTimeEvent()
ResetEvent()
可以查Win 32A PI中對於這些函式的使用方式就可以了解寄生及被寄生作業系統之間的相關性。
uCOS-II Win32 Port解析及改善 -- 2
先利用原作者提供之Example檔案建造執行檔,看有無其他問題。但部分程式碼仍會產生一些Warning,主要是原型宣告在不同的Compiler下有些不同,經稍為修飾後即可執行。其畫面如下:
原始碼有提供使用外部中斷的程式,一樣使用C++ Builder重建,在執行後可以改變Example的輸出結果,可以證明確實可以使用另一程式對Win32 port的程式產生中斷觸發的動作。結果如下:
在設定好了巨集切換後,可以執行的畫面如下:
uCOS-II Win32 Port解析及改善 -- 1
摘要:
將uCOS-II移植到Win 32A PI函式下,使之成為寄生在Win 32A PI下的作業系統。並改進和外部通信的部分,增加可使用能力。對於桯式邏輯除錯及模擬上有較佳支援。
介紹:
了解uCOS-II作業系統結構和Windows作業系統中的行程管理函式,經由移植的方式增加作業系統之了解。在此移植中要實現的功能有:
1. uCOS-II中斷模擬。
2. Windows與uCOS-II資料傳輸通道連接。
一般在學習uCOS-II會在Windows下使用DOS模式來學習,但純DOS程式在Windows下會很消耗CPU使用率,在使用Windows port程式則使用Windows管理則不會消耗CPU使用率,而且可以使用一般Windows的程式除錯器,對於程式邏輯的除錯效率上可以發揮很大的功用。
uC/OS Win32 port主要是採用Werner.Zimmermann的版本為主。採用此版本的主要原因是原作者只利用到原始uC/OS程式碼中的hook功能,不去更動作業系統中的程式碼,如此可以保有在各處理器及各版本之間的相容性。而且在各版本的uC/OS Windows port中亦為有在維護在最新狀況下的版本。不只可以在Windows下執行,亦可以在Linux中實現,足可見此版本的移植力甚強。故以此版本為其基礎,探討其運作原理及加入模擬所需之改進。但此版本目前仍有部分功能並不是完全做到,第一點是即時性,因為是寄生,所以無法做超越基礎作業系統的能力;第二點是限定無法使用OS_TaskChangePrio()。
在其他版本則有其功能不全,故未予以採用。以下簡介不採用原因:
在www.micrium.com 中有使用Win32 Thread的版本,此版本並沒有支援uC/OS中斷的能力,所以無法有效使用其版本。
在http://wsim.pc.cz 亦有uC/OS win32 port,但其uC/OS版本在2.00版本,必須使用其專用模擬器,且版本亦沒有維護,恐與後面版本產生不相容現象,故亦不予採用。