第五章 實驗驗證
5.1 傳輸數據驗證
模組之間溝通主要是透過傳輸模組 IOD 中的 packet 來傳遞資料,在第三章對傳輸 模組的探討中有提到,當模組要讀取或寫入資料時,會將 IOD 結構成員上所存放的序列 編號傳入到 OSAL 層上,到存放所有序列資料的陣列中尋找該編號所代表的序列,再藉 由 psos 的系統函式來取得該序列上的 packet。其中 IOD 上傳輸的序列可分為兩種:full queue 以及 empty queue,在 full queue 上傳送的是寫有資料的 packet,也就是 packet 上 所記錄的 buffer 記憶體區塊中存有影像資料;而 empty queue 上傳送的則為空的 packet,
代表該 packet 所記錄的 buffer 記憶體區塊中沒有影像資料。假設目前系統上使用到 A、
B、C 三個影像處理模組,如圖 5.1 所示,在兩兩模組之間會有一個 IOD 來做資料傳輸,
因此在這個系統上會存在兩個 IOD。其中每個 IOD 上所傳輸的序列都會具備一組序列 編號,以數字(1)、(2)、(3)、(4)……來標示序列,此編號是在序列的建立過程中,依照 序列建立的前後順序所標示上的,會記錄在 IOD 的的結構成員結構成員 full queue 以及 empty queue 中( 序列的建立過程在第三章的 2.2 小節中有詳細討論 )。因此在模組傳輸 資料的過程中,當模組要讀取影像資料時,就會將連結於模組輸入端 IOD 所記錄的序列 編號傳入系統中,來取得儲存於序列上 packet 的資訊,藉由 packet 上所記錄的 buffer 位址進而取得影像資訊,例如圖 5.1 中的 Component B,輸入的影像資訊會存放在 IOD 1 的序列上,所以當 Component B 要讀取資料時,就會將 IOD 1 上所記錄的序列編號傳入 系統中,由系統函式來取得該序列上所儲存 packet;同樣的當模組要將資料傳遞給下一
56 如 packet 數量、packet id、buffer 數量、buffer 尺寸大小……等資訊來設定的。在設定好 packet 的結構參數之後,系統上會再根據 buffer 尺寸的設定值,到實體記憶體上分配記 憶體區塊,並將 buffer 所分配到的記憶體位址設定到 packet 的結構參數中,讓 packet 上能夠記錄影像資料所存放的位址,整個 IOD、packet、buffer 的連結關係如圖 5.2 所示。
Component IOD 1 B
empty queue (2) full queue (1)
IOD 2
empty queue (4) full queue (3) Component
57
透過這樣的 queue、packet、buffer 結構關係,在系統上首先會將建立好且尚未儲存 資料的 packet 結構位址依序設定到 empty queue 中,如此一來在應用程式開始執行前,
所有 packet 都會放置在 empty queue 上就緒,等待模組來拿取並寫入資料。一旦程式開 始運作後,模組就會不斷至 empty queue 中拿取空的 packet 來寫入影像資料,當模組把 影像資料儲存到 packet 所指定的記憶體區塊後,接著就會將此 packet 的資料結構位址填 到 full queue 上,也就是將此 packet 標示為已使用的部分,這樣下一級的模組就可以直 接到 full queue 上拿取 packet,並由 packet 取得影像所儲存的位址。當下一級模組讀取 完影像資料後,就會將該 packet 所指定記憶體區塊中的資料清空,並將此 packet 的資料 結構位址填到 empty queue 上,也就是標示為未使用的 packet,繼續提供給前一級的模 組來寫入資料。
因此在這部分便以 NDK6.1 所提供的應用程式“exH264Codec.c"來進行測試,觀 圖 5.3 queue、packet 與 buffer 的結構關係
1 2 3 4 5 6 7 8 9 10 …
1 2 3 4 5 6 7 8 9 10 …
empty queue full queue
packet size =16 - byte
*用來標示所傳輸的 packet 資訊,包括存放 packet 資料結 構的位址、在 packet 處理程序上的旗標。
buffer
1 2 3 4 5 6
…
buffer size
*在每個 packet 結構中存有 buffer 的位址、數量、size 等資料
1 2 3 4 5 6 …
packet
size of packet structure
0
58
察 queue、packet 以及 buffer 之間的關係。在“exH264Codec.c"這個應用程式中,定義 了六個影像處理模組,因此在這些模組之間總共會使用到五個 IOD 來做資料的傳輸,表 5.1 即為在程式上為這五個 IOD 定義的傳輸單位的設定值,包含了 queue 的名稱、代號、
packet 數量、在序列上所能傳輸的 packet 數 ( Queue size )、以及 buffer 的尺寸大小。
Queue Queue size Buffer size
IOD_1 Full Queue –
Name [FS2M],No. 0 Empty Queue –
Name [ES2M],No.1
Packet 數= 12
Name [M2EE],No.3
Packet 數= 15
Name [E2RE],No.5
Packet 數= 8
Name [E2DE],No.7
Packet 數= 25
Name [DRE0],No.9
Packet 數= 19
Queue size = 19+ 32 = 51
773376
由於建立好 packet 在模組開始運作前,皆為未使用的狀態,並存放於 empty queue 中,因此就藉由這個時機印出了每個 IOD 上 empty queue 所儲存的資料,也就是 IOD 中 所有 packet 的資料結構位址。表 5.2 中則分別列出了三個 IOD:IOD 1、IOD 2、IOD4 中前五個 packet 與 buffer 的位址資訊。
表 5.1 IOD 的傳輸單位設定
59
1 -645249612 -657570432 -657224704 2 -657699012 -656878976 -656533248 3 -645249480 -656187520 -655841792 4 -657698880 -655496064 -655150336 5 -645249348 -654804608 -654458880 IOD 2 &
Queue.3
1 -645248428 -645247360 -644901632 2 -657696560 -644555904 -644210176 3 -645248296 -643864448 -643518720 4 -657696428 -643172992 -642827264 5 -645248164 -642481408 -642135680 IOD 4 &
Queue.7
1 -657692176 -618216064 2 -657692060 -617167360 3 -618218760 -616118656
4 -657692024 -615069952
5 -618218564 -614021248
觀察表 5.2中的數據,可發現在buffer位址也就是記憶體位址的分配上,兩兩差距皆 為該IOD所定義的buffer尺寸大小再加上128 - byte,在IOD 1以及IOD 2中buffer是用來儲 存一張影像的畫面,因此大小即為影像畫面的尺寸345600 ( 720×480 ) - byte,而IOD 4由 在從full queue上讀取packet的資料時,是否也有操作到同一個packet。
表 5.2 packet與buffer位址
差距=345728,為 IOD 2 所定義的 buffer size : 345600+128
差距=345728,為 IOD 1 所定義的 buffer size : 345600+128
差距=1048704,為 IOD 2 所定義的 buffer size : 1048576+128
60
在此應用程式“exH264Codec.c"的執行上,由於執行的功能選擇,在程式實際的 運作上只有使用到五個模組來做處理,因此模組之間只會使用到四個IOD來傳輸資料,
分別為表 5.1中所列舉出來的IOD 1、IOD 2、IOD 4以及IOD 5,整體的模組架構如圖 5.4 所示。而接下來則整理了此應用程式在執行上,各IOD的接收端模組從full queue上拿取 的packet資料結構位址,在表 5.3裡列出了程式運作時的前十五筆數據,表格上的第一 欄為拿取full packet的模組名稱,第二欄為所拿取的full queue代號,第三欄則為full queue 上所儲存的packet資料結構位址。而在程式運作上的前十五筆數據中,只有使用到程式 架構上的前三個IOD,代表資料尚未傳入到第四個IOD上,因此在這部分就以前三個IOD 的資料來比對,在表格的右方列出了在IOD 1、IOD 2以及IOD 4的empty queue中所儲存 的packet資料結構位址,即在上一頁表 5.2的第三欄( Packet 資料結構位址)中所列舉的 資料。
在這部分對照圖 5.4的模組架構關係與表 5.3的傳輸資料,首先傳輸順序上第一個 拿取資料的模組為“VMBS",該模組會從IOD 1的full queue中來拿取“SVIP"模組處 理完畢的packet的資料,其中IOD 1的full queue的編號為“0",因此接著觀察表格上Full Queue No.等於0的packet資料結構位址,來與同樣屬於IOD 1的empty queue (No.1) 上所 記錄的packet資料結構位址比對,可以發現兩者的數據是一致的,代表在IOD 1上的full queue與empty queue所傳輸的是同一個packet,也就處理同一個記憶體區塊所儲存的影像 資料。而接下來當“VMBS"模組做完影像處理後,會由IOD 2的empty queue (No.3) 上 拿取packet,將資料寫入屬於IOD 2的記憶體區塊中,並在寫入後將packet的位址標示到 IOD 2的full queue (No.2) 上,提供給下一級的模組“VENCH264"來讀取,因此比對模 組“VENCH264"從full queue上拿取的packet資料結構位址,以及empty queue中儲存的 packet資料結構位址,可以發現兩者所記錄的數據是一致的,代表傳送同一筆影像資料。
同樣的在“VENCH264"模組處理完影像資料後會將資料存放到IOD 3裡,而下一級的 模組“VDEC"就會到IOD 3的full queue上讀取packet,因此觀察IOD 3裡的full queue
圖 5.4 應用程式 exH264Codec.c 模組架構 VMBS
SVIP IOD IOD VENC IOD VDEC IOD VREN
queue. 0
queue. 1
queue. 2
queue. 3
queue. 6
queue. 7
queue. 8
queue. 9
61
(N0.6) 以及empty queue (No.7) 所儲存的packet資料結構位址,可以發現兩者的數據也會 一致。藉由以上三組IOD的傳輸資料,可以了解到模組之間的資料傳輸方式,並驗證了 packet在full queue以及empty queue上的循環傳輸機制。
Task name Full queue No.
Packet資料結構 位址
VMBS 0 -645249612
VENCH264 2 -645248428
VMBS 0 -657699012
VMBS 0 -645249480
VMBS 0 -657698880
VENCH264 2 -645248296
VDEC 6 -657692176
VMBS 0 -645249348
VMBS 0 -657698748
VENCH264 2 -645248164
VDEC 6 -657692060
VMBS 0 -645249216
VMBS 0 -657698616
VENCH264 2 -645248032
VDEC 6 -618218760