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中對於這些函式的使用方式就可以了解寄生及被寄生作業系統之間的相關性。


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


使用Win32 port實作:

此次實作環境為:

Windows XP作業系統

uC/OS v2.80

Borland C++ Builder 6.0

 

uC/OS中的檔案修改如下:

CPU相關的檔案有

OS_CPU.H

OS_CPU_C.C

此二個檔案必須更換為Win32 port用的檔案。而原先必須使用組合語言的OS_CPU_A.ASM則未使用,原因是使用的是高階呼叫,故不需要,而在此檔案內的功能則由OS_CPU_C.C取代。

PC介面相關的檔案為

PC.H

PC.C

則也必須更換為Win32 port下使用的版本。

C++ Builder中則是以Console Applications為程式行為主體。所以可以知道程式只有一個進入點main(),和原先CPU的單工環境相類似。

先利用原作者提供之Example檔案建造執行檔,看有無其他問題。但部分程式碼仍會產生一些Warning,主要是原型宣告在不同的Compiler下有些不同,經稍為修飾後即可執行。其畫面如下:

原始碼有提供使用外部中斷的程式,一樣使用C++ Builder重建,在執行後可以改變Example的輸出結果,可以證明確實可以使用另一程式對Win32 port的程式產生中斷觸發的動作。結果如下:


因為並非常用此Example做為開發用。故以原始的Example #2為例修改並編譯,發現原始碼中有許多為DOS專用程式碼,必須刪除。但為了維持其可移植性,改使用巨集調整的方式做為不同平台之間原始碼調整用。在Win32 port中可以找到一些特有巨集定義在使用Windows時,以”__WIN32__”巨集可以使用。

相關的修改包括有:

DOS中斷設定及回復:在Win32中不需要。

程式結束的處理:在Win32中處理的函式不同。

浮點運算器的處理:在Win32中不使用模擬浮點相關設定。

在設定好了巨集切換後,可以執行的畫面如下:


可以看出外型雖然有像DOS版本程式,但仍有許多不一樣的地方。

1.    Free Stack的大小,呈現完全沒有使用的狀態。原因是Task StackWin32下是由作業系統安排,人工配置Stack並不會使用。但為了維持和DOS相同的程式碼,仍配置Stack用記憶體。

2.    最下面一行的閃爍字元並不閃爍,這是因為PC.C中的Win 32A PI中的Console控制並沒有設定閃爍字元。但不影響主要功能。

3.    螢幕大小是可以縮放,所以右側多了滑動棒。DOS是固定25*80字元,而Win32 port無此限定。在使用Printf()函式時,可以保留更多的資訊。

4.    Windows上面CPU使用率維持不超過10%,因為使用WindowsSleep(),相對於uC/OS上的CPU使用率是不準的。




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

摘要:


uCOS-II移植到Win 32A PI函式下,使之成為寄生在Win 32A PI下的作業系統。並改進和外部通信的部分,增加可使用能力。對於桯式邏輯除錯及模擬上有較佳支援。


 


介紹:


了解uCOS-II作業系統結構和Windows作業系統中的行程管理函式,經由移植的方式增加作業系統之了解。在此移植中要實現的功能有:


1.        uCOS-II中斷模擬。


2.        WindowsuCOS-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版本,必須使用其專用模擬器,且版本亦沒有維護,恐與後面版本產生不相容現象,故亦不予採用。


2009年7月5日 星期日

平行計算介紹(草稿)

因為要報告,所以整理了一下我所了解的平行計算。簡報內容如下:
===========================
平行計算介紹
0.介紹
  多組數據或任務同時作業的計算方式

1.平行計算分類
  a.平行型式
    1.位元並行處理Bit-level parallelism
      8 bit -> 16 bit -> 32 bit -> 64 bit
      由增加同時計算之位元數來達成加速資料處理
    2.指令並行處理Instruction-level parallelism
      Pipeline
      Superscale
    3.資料並行處理Data parallelism
      Single Instruction Multiple Data(SIMD)
      PC:MMX,SSE,3D Now
    4.任務並行處理Task parallelism
      function parallelism
      control parallelism
  b.硬體實現:並行電腦
    1.多核心Multicore computing
    2.對稱多處理器Symmetric multiprocessing
    3.分散式運算Distributed computing
      a.大型平行處理器Massive parallel processing
      b.叢集運算Cluster computing
      c.網格運算Grid computing
  c.硬體實現:特殊電腦
    1.Reconfigurable computing with field-programmable gate arrays(FPGA)
    2.Scalable Embedded Array Processor
    3.Vector processors
    4.General-purpose computing on graphics processing units (GPGPU)
      SIMT
    5.Application-specific integrated circuits(ASIC)
   
2.平行計算軟體方法
  a.Multi-Process
  b.Multi-Thread
  c.OpenMP
  d.Erlang
  e.OpenCL、CUDA
  f.VHDL、Verilog
 
3.平行計算的使用場合
  a.電腦模擬及預測
    天氣預報
    電磁波
    機構
    電子
  b.電腦影像處理
    照片
    影片
    3D-Game
  c.感測器矩陣Sensor Array
    天文望遠鏡
    大型強子對撞器
    CCD
  d.特殊應用
    非破壞性檢測
    醫療領域
 
4.即時平行計算
  a.應用領域
    醫療
    視覺檢測
    On-line-Game Server
    電腦影像處理應用:大型印表機
  b.因成本降低,現在可以採用
    a.Multicore
      1.成本低
      2.軟體變動小,可以套用在原有程式上
      3.效率提升和核心數成比例
      4.仍受限於其它資源的效能
    b.GPGPU
      1.成本低
      2.軟體變動中等,但寫法不同會有很大的效能差異
        要了解GPGPU內部結構
      3.只有資料無緊密關係時才有加速力
        矩陣運算
        影像處理
        可達100-250倍CPU運算量
      4.高資料流頻寬
      5.有回傳問題
        GPGPU記憶體是獨立的
    c.FPGA
      1.成本中低,需電子能力
      2.獨立於PC運作,使用PC界面連接
      3.除錯變成和電子系統混合,難度較高
      4.即時性極高,但運算格式受限
        整數系統很好,浮點數不好
5.結論
  人類慾望無止盡。
  硬體成本下降。
  電腦應用的普及化。
  原先的先進技術,將會平民化。
  舊技術因成本下降,會造就新市場。
=======================
剛好學了FPGA加上現在的CUDA,所以實現有望了。


2009年6月19日 星期五

突然發現自己走上另一條路

因為公司一直沒有成長,也待了六年。為了排解工作上的不得志,於是去讀夜校,讀有興趣的技術。
最近發現,技術開始有結果,但並不是公司可用的技術。
為了有好的薪資,結果可能要另找出路。
但公司上司不錯,只是有個不長進的CEO。
無奈!終有一天是會離開的。

因為不長進的CEO,讓我得了四關。
不想見:從未有好臉色,遇到只會問進度,開會只會罵。
不想聽:決策快但沒有品質,只會搶功,朝令夕改,與其聽命令不如等他改。
不想講:任何事都是他對,不說反而有空間去自己處理到好。
心灰意冷:如果真的有績效就好了,但六年來只是看到重覆的戲碼。而且招式越來越沒品。

唉!我又不是不想對公司盡力,想當初也是想做技術而來。只是無法發揮乃因政治因素。
到了心灰意冷時,總要找個出路才行,做非公司技術做久了也是會有結果的。
那再下來又會如何?
我想不出第二個結果。


2009年6月16日 星期二

論文要做什麼呢?

最近同學們畢業了,我則還沒有想要做什麼論文。

看來還是做機器視覺好了。

所以就以CUDA做機器視覺加速。

不過PC上開發軟體沒有那樣熟,我可能要使用到OpenGL及OpenCV。

所以整個工具組要用到Visual Studio 2008、CUDA、OpenGL及OpenCV。全都是沒有用過的,看來挑戰大了。


2009年4月2日 星期四

使用加法做開根及平方計算

主題:使用加法做開根及平方計算
使用範圍:整數計算開根及平方,計算慢,gate count少
參考資料:MATH toolkit for Real-Time Programming by Jack W. Crenshaw CMP Books
原理說明:
這是我們常用的公式(n+1)^2=n^2+2*n+1
改寫為(n+1)^2=n^2+n+(n+1),其中n^2在上次計算可得到,所以只剩n及(n+1)且只使用加法就可以進行。
設計演算法為
a=Count
b=Last Sum= Sum
c=Sum=Last Sum+Count
d=Squart=Sum+Last Sum
排表為
a b  c d
 0  0   0  0
 1  0   1  1
 2  1   3  4
 3  3   6  9
 4  6   10 16
 5 10   15 25
若要取得平方,就將輸入做為計算的次數。計算停下來時,取出d就是答案。
要做開方,就將輸入和輸出比較,超過時停下來,取出a就是答案。
若要使用到小數,則使用定點數方式可以得到。