TS-DM6446實驗指導書 98 revised · 1.3 CCS 整合開發環境簡介 (UNIT 1) ... 側“My...

69
1 TI DaVinci ® 嵌入式多媒體系統設計實驗講義 授課教師: 陳璽煌 樹德科技大學 資工系 2010 年 02 月

Transcript of TS-DM6446實驗指導書 98 revised · 1.3 CCS 整合開發環境簡介 (UNIT 1) ... 側“My...

1

TI DaVincireg 嵌入式多媒體系統設計實驗講義

授課教師 陳璽煌

樹德科技大學 資工系

2010 年 02 月

2

目 錄 第一章 TI DAVINCI 簡介 1

11 TI DAVINCI DM6446 開發實驗箱簡介 (UNIT 1) 1 111 實驗箱的硬體配置1 112 開發板上的元件說明3 113 實驗箱的硬體連接說明6 114 附件光碟內容9

13 CCS 整合開發環境簡介 (UNIT 1)9 14 安裝和設置 CCS 開發環境 (UNIT 1)10 15 TI DAVINCI DSP 架構說明 (UNIT 2) 19 16 基本要求 22

161 對實驗環境的要求22 162 對修課同學的要求22

17 參考的資料 22 18 專業術語解釋及書寫慣例 22

181 專業術語22 182 書寫慣例23

第二章 CCS 下的軟體發展24 21 DSP 指令集與 C 語言程式開發 (UNIT 3) 24 22 DSP 基本數學及陣列運算(UNIT 4) 30 23 RGB 與 YUV 420 彩色空間轉換(UNIT 5) 31 24 DCT 與 IDCT 運算 (UNIT 6)33 25 純量量化與矩陣量化運算 (UNIT 7) 35

第三章 音訊處理實驗38 31 AIC33 音訊擷取與播放實驗 (UNIT 8) 38 32 G711 語音編碼器實驗 (UNIT 9)39

第四章 視訊處理實驗43 41 TVP5146 視訊擷取與播放實驗 (UNIT 10)43 42 LINUX 實驗環境建立 44 43 HELLO WORLD48 44 H264 視訊編碼器實驗 (UNIT 11) 54

第五章 網路視訊監控實驗60 51 H264 網路攝影機實驗 (UNIT 12) 60

1

第一章 TI DaVinci 簡介

本實驗講義可幫助修課的同學儘快地設置好實驗環境並透過一些實驗來快

速的瞭解嵌入式 Linux 和 DaVinci 平臺的開發過程以配合相關課程的學習

11 TI DaVinci DM6446 開發實驗箱簡介 (Unit 1)

TI DaVinci DM6646 開發實驗箱是美國德州儀器公司(Texas Instruments簡

稱 TI)TMS320DM6446 系統的一個教學實驗套件本實驗箱盡可能得提供了

DM6446 系統可以支援的功能展示設備透過該實驗箱同學可以全面地瞭解

TI DaVinci 開發平臺的特點和基本的操作步驟該實驗箱套件也可以作為嵌入式

Linux 的開發實驗環境

111 實驗箱的硬體配置

打開實驗箱你可以看到如下物品

表一實驗箱物品清單及用途說明 No 名 稱 功 用 1 實驗箱底座 包裝和承載其他元件為元件之間提供連接 2 開發板 包含 DaVinci 晶片以及可以提供的週邊介面 3 JTAG 小板 提供開發板到模擬器的 JTAG 轉接 4 模擬器 用來連接開發板和 PC在 CCS 環境下模擬程式 5 LCD 及 CCD 鏡頭 提供視訊信號輸入輸出 6 電源線 為實驗箱供電 7 耳機麥克風 提供音訊信號輸出

8 串列線 連接開發板和 PC 的串列終端以便可以查看和控

制 Linux 程式

9 視訊信號線 連接開發板的視訊信號輸入輸出到 LCD 顯示螢幕

及鏡頭

10 音訊信號線 連接開發板的 line in 到音訊信號輸出設備以提供

音訊信號輸入 11 網路線 直接連接 Linux 主機和開發板 12 模擬器 USB 線 連接模擬器和已安裝 CCS 的 PC 13 LCD 螢幕的開關

2

下圖示意實驗箱中的物品清單

3

112 開發板上的元件說明

表二列出了開發板上的一些元件及其用途

表二開發板上的一些元件的說明 元件名稱 用途說明 DS1-8 用戶 LED 燈可由用戶控制亮滅以傳遞某種訊號 DS11 電源指示燈接通電源亮 J1 JTAG 介面在此連接 JTAG 轉接板 J4 CS2 選擇跳線 J5 SDMMCDC 選擇 J7 USB 主從模式選擇注意要與 S5 的選擇一致 S2 DaVinci JTAG TRST 選擇 S3 指撥開關定義 ARM 和 DSP 的啟動模式 S4 重置開關 S5 USB 主從模式上下拉電阻選擇注意與 J7 保持一致

開發板上跳線和開關的設置 1J4 短接 12345678 依次分別為 FLASHNAND(CS3)

NAND(CS2)DC下圖給出了 J4 的預設設置預設 NOR flash 和 NAND flash都被致能

2J5 預設設置如下表示選擇焊接的是 SD 卡

3J7 參看下圖短接左側兩個接腳是從模式短接右側兩個接腳是主模式

預設設置是主模式如圖表示開發板作為 USB 主機

4

4S2 預設 23 短接56 短接請保持此預設值如下圖

5S3 如果以ldquo1表示ldquoon開關的狀態ldquo0表示開關的ldquooff狀態

則開關從 1 到 10 狀態為ldquo0011111110的為 CCS 環境下工作的設置

ldquo1011111110為 Linux 環境下工作的設置分別如下左圖和下右圖所示

5S5按照板子上的提示設置上下拉電阻需與 J7 保持一致預設設置如

下圖為主模式

5

開發板上的元件佈置如下圖所示

6

113 實驗箱的硬體連接說明

1 實驗箱電源的連接如下圖左側是電源開關圖中顯示的狀態為

ldquo關電源線的另一頭接電源插座

2 視訊信號出的連接連接實驗板的 VIDEO OUT 埠與實驗箱右上方的

LCD Input 埠如下圖

3 視訊信號輸入的連接連接實驗板的 VIDEO IN 埠與實驗箱右上方的

CCD Output 埠如下圖

4 音訊信號輸入的連接連接實驗板的 LINE IN 埠與音訊信號輸出設備

如 CD 播放機實驗板上的連接方式如下圖

7

5 音訊信號輸出的連接連接實驗板的 LINE OUT 埠到音訊信號輸出設

備如耳機如下圖

6 串列的連接使用串列線連接實驗板的 UART 埠與 PC 的 COM 埠實

驗板上的連接方法如下圖

7 網路埠的連接使用 RJ45 對接式網路線直接連接實驗板的乙太網路埠

與 Linux 主機上的乙太網路埠如果你希望實驗板和主機之間透過 hub或交換機相連則需要換一根正常線序的網線實驗板上的連接如下圖

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

2

目 錄 第一章 TI DAVINCI 簡介 1

11 TI DAVINCI DM6446 開發實驗箱簡介 (UNIT 1) 1 111 實驗箱的硬體配置1 112 開發板上的元件說明3 113 實驗箱的硬體連接說明6 114 附件光碟內容9

13 CCS 整合開發環境簡介 (UNIT 1)9 14 安裝和設置 CCS 開發環境 (UNIT 1)10 15 TI DAVINCI DSP 架構說明 (UNIT 2) 19 16 基本要求 22

161 對實驗環境的要求22 162 對修課同學的要求22

17 參考的資料 22 18 專業術語解釋及書寫慣例 22

181 專業術語22 182 書寫慣例23

第二章 CCS 下的軟體發展24 21 DSP 指令集與 C 語言程式開發 (UNIT 3) 24 22 DSP 基本數學及陣列運算(UNIT 4) 30 23 RGB 與 YUV 420 彩色空間轉換(UNIT 5) 31 24 DCT 與 IDCT 運算 (UNIT 6)33 25 純量量化與矩陣量化運算 (UNIT 7) 35

第三章 音訊處理實驗38 31 AIC33 音訊擷取與播放實驗 (UNIT 8) 38 32 G711 語音編碼器實驗 (UNIT 9)39

第四章 視訊處理實驗43 41 TVP5146 視訊擷取與播放實驗 (UNIT 10)43 42 LINUX 實驗環境建立 44 43 HELLO WORLD48 44 H264 視訊編碼器實驗 (UNIT 11) 54

第五章 網路視訊監控實驗60 51 H264 網路攝影機實驗 (UNIT 12) 60

1

第一章 TI DaVinci 簡介

本實驗講義可幫助修課的同學儘快地設置好實驗環境並透過一些實驗來快

速的瞭解嵌入式 Linux 和 DaVinci 平臺的開發過程以配合相關課程的學習

11 TI DaVinci DM6446 開發實驗箱簡介 (Unit 1)

TI DaVinci DM6646 開發實驗箱是美國德州儀器公司(Texas Instruments簡

稱 TI)TMS320DM6446 系統的一個教學實驗套件本實驗箱盡可能得提供了

DM6446 系統可以支援的功能展示設備透過該實驗箱同學可以全面地瞭解

TI DaVinci 開發平臺的特點和基本的操作步驟該實驗箱套件也可以作為嵌入式

Linux 的開發實驗環境

111 實驗箱的硬體配置

打開實驗箱你可以看到如下物品

表一實驗箱物品清單及用途說明 No 名 稱 功 用 1 實驗箱底座 包裝和承載其他元件為元件之間提供連接 2 開發板 包含 DaVinci 晶片以及可以提供的週邊介面 3 JTAG 小板 提供開發板到模擬器的 JTAG 轉接 4 模擬器 用來連接開發板和 PC在 CCS 環境下模擬程式 5 LCD 及 CCD 鏡頭 提供視訊信號輸入輸出 6 電源線 為實驗箱供電 7 耳機麥克風 提供音訊信號輸出

8 串列線 連接開發板和 PC 的串列終端以便可以查看和控

制 Linux 程式

9 視訊信號線 連接開發板的視訊信號輸入輸出到 LCD 顯示螢幕

及鏡頭

10 音訊信號線 連接開發板的 line in 到音訊信號輸出設備以提供

音訊信號輸入 11 網路線 直接連接 Linux 主機和開發板 12 模擬器 USB 線 連接模擬器和已安裝 CCS 的 PC 13 LCD 螢幕的開關

2

下圖示意實驗箱中的物品清單

3

112 開發板上的元件說明

表二列出了開發板上的一些元件及其用途

表二開發板上的一些元件的說明 元件名稱 用途說明 DS1-8 用戶 LED 燈可由用戶控制亮滅以傳遞某種訊號 DS11 電源指示燈接通電源亮 J1 JTAG 介面在此連接 JTAG 轉接板 J4 CS2 選擇跳線 J5 SDMMCDC 選擇 J7 USB 主從模式選擇注意要與 S5 的選擇一致 S2 DaVinci JTAG TRST 選擇 S3 指撥開關定義 ARM 和 DSP 的啟動模式 S4 重置開關 S5 USB 主從模式上下拉電阻選擇注意與 J7 保持一致

開發板上跳線和開關的設置 1J4 短接 12345678 依次分別為 FLASHNAND(CS3)

NAND(CS2)DC下圖給出了 J4 的預設設置預設 NOR flash 和 NAND flash都被致能

2J5 預設設置如下表示選擇焊接的是 SD 卡

3J7 參看下圖短接左側兩個接腳是從模式短接右側兩個接腳是主模式

預設設置是主模式如圖表示開發板作為 USB 主機

4

4S2 預設 23 短接56 短接請保持此預設值如下圖

5S3 如果以ldquo1表示ldquoon開關的狀態ldquo0表示開關的ldquooff狀態

則開關從 1 到 10 狀態為ldquo0011111110的為 CCS 環境下工作的設置

ldquo1011111110為 Linux 環境下工作的設置分別如下左圖和下右圖所示

5S5按照板子上的提示設置上下拉電阻需與 J7 保持一致預設設置如

下圖為主模式

5

開發板上的元件佈置如下圖所示

6

113 實驗箱的硬體連接說明

1 實驗箱電源的連接如下圖左側是電源開關圖中顯示的狀態為

ldquo關電源線的另一頭接電源插座

2 視訊信號出的連接連接實驗板的 VIDEO OUT 埠與實驗箱右上方的

LCD Input 埠如下圖

3 視訊信號輸入的連接連接實驗板的 VIDEO IN 埠與實驗箱右上方的

CCD Output 埠如下圖

4 音訊信號輸入的連接連接實驗板的 LINE IN 埠與音訊信號輸出設備

如 CD 播放機實驗板上的連接方式如下圖

7

5 音訊信號輸出的連接連接實驗板的 LINE OUT 埠到音訊信號輸出設

備如耳機如下圖

6 串列的連接使用串列線連接實驗板的 UART 埠與 PC 的 COM 埠實

驗板上的連接方法如下圖

7 網路埠的連接使用 RJ45 對接式網路線直接連接實驗板的乙太網路埠

與 Linux 主機上的乙太網路埠如果你希望實驗板和主機之間透過 hub或交換機相連則需要換一根正常線序的網線實驗板上的連接如下圖

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

1

第一章 TI DaVinci 簡介

本實驗講義可幫助修課的同學儘快地設置好實驗環境並透過一些實驗來快

速的瞭解嵌入式 Linux 和 DaVinci 平臺的開發過程以配合相關課程的學習

11 TI DaVinci DM6446 開發實驗箱簡介 (Unit 1)

TI DaVinci DM6646 開發實驗箱是美國德州儀器公司(Texas Instruments簡

稱 TI)TMS320DM6446 系統的一個教學實驗套件本實驗箱盡可能得提供了

DM6446 系統可以支援的功能展示設備透過該實驗箱同學可以全面地瞭解

TI DaVinci 開發平臺的特點和基本的操作步驟該實驗箱套件也可以作為嵌入式

Linux 的開發實驗環境

111 實驗箱的硬體配置

打開實驗箱你可以看到如下物品

表一實驗箱物品清單及用途說明 No 名 稱 功 用 1 實驗箱底座 包裝和承載其他元件為元件之間提供連接 2 開發板 包含 DaVinci 晶片以及可以提供的週邊介面 3 JTAG 小板 提供開發板到模擬器的 JTAG 轉接 4 模擬器 用來連接開發板和 PC在 CCS 環境下模擬程式 5 LCD 及 CCD 鏡頭 提供視訊信號輸入輸出 6 電源線 為實驗箱供電 7 耳機麥克風 提供音訊信號輸出

8 串列線 連接開發板和 PC 的串列終端以便可以查看和控

制 Linux 程式

9 視訊信號線 連接開發板的視訊信號輸入輸出到 LCD 顯示螢幕

及鏡頭

10 音訊信號線 連接開發板的 line in 到音訊信號輸出設備以提供

音訊信號輸入 11 網路線 直接連接 Linux 主機和開發板 12 模擬器 USB 線 連接模擬器和已安裝 CCS 的 PC 13 LCD 螢幕的開關

2

下圖示意實驗箱中的物品清單

3

112 開發板上的元件說明

表二列出了開發板上的一些元件及其用途

表二開發板上的一些元件的說明 元件名稱 用途說明 DS1-8 用戶 LED 燈可由用戶控制亮滅以傳遞某種訊號 DS11 電源指示燈接通電源亮 J1 JTAG 介面在此連接 JTAG 轉接板 J4 CS2 選擇跳線 J5 SDMMCDC 選擇 J7 USB 主從模式選擇注意要與 S5 的選擇一致 S2 DaVinci JTAG TRST 選擇 S3 指撥開關定義 ARM 和 DSP 的啟動模式 S4 重置開關 S5 USB 主從模式上下拉電阻選擇注意與 J7 保持一致

開發板上跳線和開關的設置 1J4 短接 12345678 依次分別為 FLASHNAND(CS3)

NAND(CS2)DC下圖給出了 J4 的預設設置預設 NOR flash 和 NAND flash都被致能

2J5 預設設置如下表示選擇焊接的是 SD 卡

3J7 參看下圖短接左側兩個接腳是從模式短接右側兩個接腳是主模式

預設設置是主模式如圖表示開發板作為 USB 主機

4

4S2 預設 23 短接56 短接請保持此預設值如下圖

5S3 如果以ldquo1表示ldquoon開關的狀態ldquo0表示開關的ldquooff狀態

則開關從 1 到 10 狀態為ldquo0011111110的為 CCS 環境下工作的設置

ldquo1011111110為 Linux 環境下工作的設置分別如下左圖和下右圖所示

5S5按照板子上的提示設置上下拉電阻需與 J7 保持一致預設設置如

下圖為主模式

5

開發板上的元件佈置如下圖所示

6

113 實驗箱的硬體連接說明

1 實驗箱電源的連接如下圖左側是電源開關圖中顯示的狀態為

ldquo關電源線的另一頭接電源插座

2 視訊信號出的連接連接實驗板的 VIDEO OUT 埠與實驗箱右上方的

LCD Input 埠如下圖

3 視訊信號輸入的連接連接實驗板的 VIDEO IN 埠與實驗箱右上方的

CCD Output 埠如下圖

4 音訊信號輸入的連接連接實驗板的 LINE IN 埠與音訊信號輸出設備

如 CD 播放機實驗板上的連接方式如下圖

7

5 音訊信號輸出的連接連接實驗板的 LINE OUT 埠到音訊信號輸出設

備如耳機如下圖

6 串列的連接使用串列線連接實驗板的 UART 埠與 PC 的 COM 埠實

驗板上的連接方法如下圖

7 網路埠的連接使用 RJ45 對接式網路線直接連接實驗板的乙太網路埠

與 Linux 主機上的乙太網路埠如果你希望實驗板和主機之間透過 hub或交換機相連則需要換一根正常線序的網線實驗板上的連接如下圖

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

2

下圖示意實驗箱中的物品清單

3

112 開發板上的元件說明

表二列出了開發板上的一些元件及其用途

表二開發板上的一些元件的說明 元件名稱 用途說明 DS1-8 用戶 LED 燈可由用戶控制亮滅以傳遞某種訊號 DS11 電源指示燈接通電源亮 J1 JTAG 介面在此連接 JTAG 轉接板 J4 CS2 選擇跳線 J5 SDMMCDC 選擇 J7 USB 主從模式選擇注意要與 S5 的選擇一致 S2 DaVinci JTAG TRST 選擇 S3 指撥開關定義 ARM 和 DSP 的啟動模式 S4 重置開關 S5 USB 主從模式上下拉電阻選擇注意與 J7 保持一致

開發板上跳線和開關的設置 1J4 短接 12345678 依次分別為 FLASHNAND(CS3)

NAND(CS2)DC下圖給出了 J4 的預設設置預設 NOR flash 和 NAND flash都被致能

2J5 預設設置如下表示選擇焊接的是 SD 卡

3J7 參看下圖短接左側兩個接腳是從模式短接右側兩個接腳是主模式

預設設置是主模式如圖表示開發板作為 USB 主機

4

4S2 預設 23 短接56 短接請保持此預設值如下圖

5S3 如果以ldquo1表示ldquoon開關的狀態ldquo0表示開關的ldquooff狀態

則開關從 1 到 10 狀態為ldquo0011111110的為 CCS 環境下工作的設置

ldquo1011111110為 Linux 環境下工作的設置分別如下左圖和下右圖所示

5S5按照板子上的提示設置上下拉電阻需與 J7 保持一致預設設置如

下圖為主模式

5

開發板上的元件佈置如下圖所示

6

113 實驗箱的硬體連接說明

1 實驗箱電源的連接如下圖左側是電源開關圖中顯示的狀態為

ldquo關電源線的另一頭接電源插座

2 視訊信號出的連接連接實驗板的 VIDEO OUT 埠與實驗箱右上方的

LCD Input 埠如下圖

3 視訊信號輸入的連接連接實驗板的 VIDEO IN 埠與實驗箱右上方的

CCD Output 埠如下圖

4 音訊信號輸入的連接連接實驗板的 LINE IN 埠與音訊信號輸出設備

如 CD 播放機實驗板上的連接方式如下圖

7

5 音訊信號輸出的連接連接實驗板的 LINE OUT 埠到音訊信號輸出設

備如耳機如下圖

6 串列的連接使用串列線連接實驗板的 UART 埠與 PC 的 COM 埠實

驗板上的連接方法如下圖

7 網路埠的連接使用 RJ45 對接式網路線直接連接實驗板的乙太網路埠

與 Linux 主機上的乙太網路埠如果你希望實驗板和主機之間透過 hub或交換機相連則需要換一根正常線序的網線實驗板上的連接如下圖

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

3

112 開發板上的元件說明

表二列出了開發板上的一些元件及其用途

表二開發板上的一些元件的說明 元件名稱 用途說明 DS1-8 用戶 LED 燈可由用戶控制亮滅以傳遞某種訊號 DS11 電源指示燈接通電源亮 J1 JTAG 介面在此連接 JTAG 轉接板 J4 CS2 選擇跳線 J5 SDMMCDC 選擇 J7 USB 主從模式選擇注意要與 S5 的選擇一致 S2 DaVinci JTAG TRST 選擇 S3 指撥開關定義 ARM 和 DSP 的啟動模式 S4 重置開關 S5 USB 主從模式上下拉電阻選擇注意與 J7 保持一致

開發板上跳線和開關的設置 1J4 短接 12345678 依次分別為 FLASHNAND(CS3)

NAND(CS2)DC下圖給出了 J4 的預設設置預設 NOR flash 和 NAND flash都被致能

2J5 預設設置如下表示選擇焊接的是 SD 卡

3J7 參看下圖短接左側兩個接腳是從模式短接右側兩個接腳是主模式

預設設置是主模式如圖表示開發板作為 USB 主機

4

4S2 預設 23 短接56 短接請保持此預設值如下圖

5S3 如果以ldquo1表示ldquoon開關的狀態ldquo0表示開關的ldquooff狀態

則開關從 1 到 10 狀態為ldquo0011111110的為 CCS 環境下工作的設置

ldquo1011111110為 Linux 環境下工作的設置分別如下左圖和下右圖所示

5S5按照板子上的提示設置上下拉電阻需與 J7 保持一致預設設置如

下圖為主模式

5

開發板上的元件佈置如下圖所示

6

113 實驗箱的硬體連接說明

1 實驗箱電源的連接如下圖左側是電源開關圖中顯示的狀態為

ldquo關電源線的另一頭接電源插座

2 視訊信號出的連接連接實驗板的 VIDEO OUT 埠與實驗箱右上方的

LCD Input 埠如下圖

3 視訊信號輸入的連接連接實驗板的 VIDEO IN 埠與實驗箱右上方的

CCD Output 埠如下圖

4 音訊信號輸入的連接連接實驗板的 LINE IN 埠與音訊信號輸出設備

如 CD 播放機實驗板上的連接方式如下圖

7

5 音訊信號輸出的連接連接實驗板的 LINE OUT 埠到音訊信號輸出設

備如耳機如下圖

6 串列的連接使用串列線連接實驗板的 UART 埠與 PC 的 COM 埠實

驗板上的連接方法如下圖

7 網路埠的連接使用 RJ45 對接式網路線直接連接實驗板的乙太網路埠

與 Linux 主機上的乙太網路埠如果你希望實驗板和主機之間透過 hub或交換機相連則需要換一根正常線序的網線實驗板上的連接如下圖

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

4

4S2 預設 23 短接56 短接請保持此預設值如下圖

5S3 如果以ldquo1表示ldquoon開關的狀態ldquo0表示開關的ldquooff狀態

則開關從 1 到 10 狀態為ldquo0011111110的為 CCS 環境下工作的設置

ldquo1011111110為 Linux 環境下工作的設置分別如下左圖和下右圖所示

5S5按照板子上的提示設置上下拉電阻需與 J7 保持一致預設設置如

下圖為主模式

5

開發板上的元件佈置如下圖所示

6

113 實驗箱的硬體連接說明

1 實驗箱電源的連接如下圖左側是電源開關圖中顯示的狀態為

ldquo關電源線的另一頭接電源插座

2 視訊信號出的連接連接實驗板的 VIDEO OUT 埠與實驗箱右上方的

LCD Input 埠如下圖

3 視訊信號輸入的連接連接實驗板的 VIDEO IN 埠與實驗箱右上方的

CCD Output 埠如下圖

4 音訊信號輸入的連接連接實驗板的 LINE IN 埠與音訊信號輸出設備

如 CD 播放機實驗板上的連接方式如下圖

7

5 音訊信號輸出的連接連接實驗板的 LINE OUT 埠到音訊信號輸出設

備如耳機如下圖

6 串列的連接使用串列線連接實驗板的 UART 埠與 PC 的 COM 埠實

驗板上的連接方法如下圖

7 網路埠的連接使用 RJ45 對接式網路線直接連接實驗板的乙太網路埠

與 Linux 主機上的乙太網路埠如果你希望實驗板和主機之間透過 hub或交換機相連則需要換一根正常線序的網線實驗板上的連接如下圖

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

5

開發板上的元件佈置如下圖所示

6

113 實驗箱的硬體連接說明

1 實驗箱電源的連接如下圖左側是電源開關圖中顯示的狀態為

ldquo關電源線的另一頭接電源插座

2 視訊信號出的連接連接實驗板的 VIDEO OUT 埠與實驗箱右上方的

LCD Input 埠如下圖

3 視訊信號輸入的連接連接實驗板的 VIDEO IN 埠與實驗箱右上方的

CCD Output 埠如下圖

4 音訊信號輸入的連接連接實驗板的 LINE IN 埠與音訊信號輸出設備

如 CD 播放機實驗板上的連接方式如下圖

7

5 音訊信號輸出的連接連接實驗板的 LINE OUT 埠到音訊信號輸出設

備如耳機如下圖

6 串列的連接使用串列線連接實驗板的 UART 埠與 PC 的 COM 埠實

驗板上的連接方法如下圖

7 網路埠的連接使用 RJ45 對接式網路線直接連接實驗板的乙太網路埠

與 Linux 主機上的乙太網路埠如果你希望實驗板和主機之間透過 hub或交換機相連則需要換一根正常線序的網線實驗板上的連接如下圖

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

6

113 實驗箱的硬體連接說明

1 實驗箱電源的連接如下圖左側是電源開關圖中顯示的狀態為

ldquo關電源線的另一頭接電源插座

2 視訊信號出的連接連接實驗板的 VIDEO OUT 埠與實驗箱右上方的

LCD Input 埠如下圖

3 視訊信號輸入的連接連接實驗板的 VIDEO IN 埠與實驗箱右上方的

CCD Output 埠如下圖

4 音訊信號輸入的連接連接實驗板的 LINE IN 埠與音訊信號輸出設備

如 CD 播放機實驗板上的連接方式如下圖

7

5 音訊信號輸出的連接連接實驗板的 LINE OUT 埠到音訊信號輸出設

備如耳機如下圖

6 串列的連接使用串列線連接實驗板的 UART 埠與 PC 的 COM 埠實

驗板上的連接方法如下圖

7 網路埠的連接使用 RJ45 對接式網路線直接連接實驗板的乙太網路埠

與 Linux 主機上的乙太網路埠如果你希望實驗板和主機之間透過 hub或交換機相連則需要換一根正常線序的網線實驗板上的連接如下圖

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

7

5 音訊信號輸出的連接連接實驗板的 LINE OUT 埠到音訊信號輸出設

備如耳機如下圖

6 串列的連接使用串列線連接實驗板的 UART 埠與 PC 的 COM 埠實

驗板上的連接方法如下圖

7 網路埠的連接使用 RJ45 對接式網路線直接連接實驗板的乙太網路埠

與 Linux 主機上的乙太網路埠如果你希望實驗板和主機之間透過 hub或交換機相連則需要換一根正常線序的網線實驗板上的連接如下圖

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

8

8 實驗板上的電源連接如下圖

左上的紅色開關為實驗板的電源開關輕輕向上推可以打開電源 9 模擬器的連接如下圖

從左到右依次為模擬器的 USB 連接線模擬器模擬器扁平電纜JTAG

介面板開發板模擬器的 USB 連接線另一頭連接到安裝了 CCS 開發環境的

PC 主機

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

9

114 附件光碟內容

表三 附件光碟內容 Disk1 目錄 說明 Documents 包含了一些 DaVinci 的參考資料 Flash Write 包含了 DM6446 晶片 ARM 核心和 DSP 核心的用於 CCS

的 gel 檔案用於燒寫 NOR FLASH 的out 檔案和準備燒

寫到 flash 的 bootloader 的二進制檔 u-bootbin CCS Example 包含了實驗中所有 CCS 下實驗的原始程式 Red Hat Linux 提供的虛擬機使用前請先 Disk2 中的 Red Hat Linux2rar

檔與本光碟 LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到同一目錄下進行解壓然後用 Vmplayer 軟體打開

VM Player 包含 Vmplayer 軟體安裝程式 IP camera 包含網路攝像實驗中的 PC 端的程式 VCenterexe imageimg 一個給出的檔案系統影像檔

Readmetxt 光碟內容說明

Disk2 目錄 說明 Readmetxt 解壓縮檔案使用說明 Red Hat Linux2rar

Linux 虛擬機分卷壓縮包

13 CCS 整合開發環境簡介 (Unit 1)

CCS(Code Compose Studio)是 TI 公司提供的一個整合開發環境CCS 用

於 DSP 的軟體發展和除錯它提供一整套的程式編輯編譯連接執行控制

的除錯環境它可以用於建立和編輯專案檔它提供了最佳化的編譯器可以把

CC++以及組合語言編譯成高效率的可執行程式還可以透過 CCS 把目標程式下

載到目標板上執行並能在執行過程中隨時中斷程式檢查程式執行情況以及與

目標板交換資料CCS 還提供了一個即時操作系統 DSPBIOS透過它可以為你

的程式提供簡單的有效的管理 如需詳細瞭解 CCS 開發環境請閱讀以下參考資料 【1】ldquoCode Composer Studio IDE v3 White Paperrdquo sprAA08 【2】ldquoCode Composer Studio Development Tools v32 Getting Started Guide rdquo spru509

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

10

這兩篇參考資料都可以在附件光碟 1 的ldquoDocumentsrdquo目錄下找到如果同學

希望得到最新的版本可以自行登入 TI 的網站 wwwticom 下載

14 安裝和設置 CCS 開發環境 (Unit 1)

首先安裝 CCS 和模擬器前者只需要雙擊相應的安裝檔並跟隨提示就可以

完成模擬器的安裝在隨實驗箱附帶的附件光碟中有資料作詳細的解釋這裏不

再重複講述請同學參考該附件光碟上的資料 這裏我們主要介紹一下如何設置 CCS 為 DM6446 的開發環境

在桌面上單擊圖示 啟動 CCS 的設置程式出現如下提示框

選中ldquoEditrarrCreate Boardrdquo選項卡出現如下提示框

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

11

選中圖中的ldquoWintechDigital TDS510USB PLUS EMULATORrdquo並將其拖到左

側ldquoMy Systemrdquo空白區會出現連接屬性設置提示框

輸入連接名稱例如ldquoDavicin_TDS510USB Plusrdquo選擇ldquoAuto-generate board data filerdquo選項中的ldquoAuto-generate board data file with extra configurationrdquo

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

12

之後出現如下提示框

選擇設定檔點擊設定檔右側的ldquoBrowse rdquo按鈕選擇設定檔選擇剛安裝完

的 設 定 檔 位 置 在 CCS33 的 安 裝 目 錄

~CCStudio_v33ccbintds510usb_davincicfg 目錄下如下圖所示

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

13

選擇ldquotds510usb_davincicfgrdquo檔點擊ldquo打開rdquo按鈕返回到如下提示框

點擊ldquoNextrdquo按鈕出現如下提示框

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

14

並點擊ldquoFinishrdquo按鈕返回到系統設置介面

選中對話方塊中的ldquoICEPICK_Crdquo選項並拖到左側的空白區時出現路徑屬性

設置提示框

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

15

在ldquoRouterrdquo選項卡中修改ldquoNumber ofrdquo值為 2點擊ldquoNextrdquo按鈕出現如下

提示框

點擊ldquoNextrdquo按鈕出現如下提示框請按照下圖修改圖中的兩個埠號

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

16

點擊ldquoFinishrdquo按鈕返回到系統設置介面

設置 ARM 端選中ldquoSubpath_0rdquo選擇中間欄內ldquoCreate Board rdquo選項中的

ldquoARM9rdquo項將其拖到左側的區域會出現如下提示框

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

17

選 擇 gel 檔 點 擊 GEL File 的 ldquordquo 按 鈕 選 擇

CCCStudio_v33ccgelDaVinciEVM_arm_256MB_DDRgel點擊ldquoOKrdquo按鈕完成

ARM 端設置設置後的提示框如下

設置 DSP 端選中上圖左側的ldquoSubpath_1rdquo選擇中間欄內ldquoCreate Board rdquo

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

18

中的ldquoC6400PLUSrdquo並將其拖至左側區域會出現如下提示框

設置選擇 gel 檔ldquoDaVinciEVM_dspgel

(和 DaVinciEVM_arm_256MB_DDRgel 同一個位置)點擊ldquoOKrdquo按鈕完成 DSP端設置設置後的提示框如下

點擊ldquoSaveampQuitrdquo按鈕儲存並退出然後會出現是否在退出後打開 CCS 的對

話方塊選擇ldquo是rdquo則打開 CCS選擇ldquo否rdquo則退出到此完成了 CCS 的設置

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

19

15 TI DaVinci DSP 架構說明 (Unit 2)

TI DaVincitrade DM644x 系列 SoC 處理器是 TI 於 2006 年推出的新產品

DM644x DSP 架構屬於高整合度的系統單晶片將多媒體數位訊號處理所需的

多顆外部零件整合在一起最多可將零件數目減少五成DM644x 元件內含

TMS320C64x+trade DSP 核心ARM926 處理器視訊加速器網路週邊以及外部

記憶體與儲存界面等模組最高執行時脈可達 600 MHz下圖為 TI daVincitrade

DM644x 之系統架構圖

TI DaVinci DM644X 系統架構圖

在時脈頻率為 594 MHz 的情況下TI daVincitrade DM644x 每秒最多可執行

4752 百萬個指令集(MIPS)同時TMS320C64x+trade DSP 提供了多種矩陣加速

運算器數位濾波器模組傅立葉轉換函式庫足可供給本課程實驗所需

TI DaVinci 的軟體開發架構可分為 C64x 系列 DSP 與 ARM926 兩部份下

圖為 TI daVincitrade DM644x 之軟體開發系統架構圖

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

20

TI daVincitrade DM644x 之軟體開發系統架構圖

基本上ARM 負責作業系統應用DSP 負責執行影音編碼器(Codec)演算

法處理ARM 透過 TI 的 Codec Engine 機制呼叫 DSP 側的 Codec而 DSP 與

ARM 之間的溝通則是透過 DSPLink 達成此機制如下圖所示

TI daVincitrade DM644x 之 DSPLink 系統架構圖

TI daVincitrade DM644x 的軟體基礎架構能協助開發者在 Linux 和 Windows

Embedded CE 平台上針對 TI 以 DSP 為基礎的系統單晶片處理器開發各種應

用軟體或在嵌入式 Linux 或 DSPBIOS 即時核心上針對 TI 採用 DaVinci 技術

的純 DSP 元件開發軟體xDMDaVinci 編碼解碼器引擎和架構元件全都採用

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

21

DaVinci 技術使工程師更容易在各種 DaVinci 技術平台之間進行軟體移植TI

daVincitrade DM644x 的軟體基礎架構可分為

應用層

TI Davinci 的應用工程師可以在系統的用戶空間在系統功能性上添加和發

揮自己的特色透過 Codec Engine 的 VISA(VideoImageSpeech Audio)API

來使用 DSP 側的演算法透過 EPSI(Easy Peripheral Software Interface)API 來存

取和操作 Davinci 的外部設備

信號處理層

信號處理層通常都執行在 DSP 一側負責信號處理包括影音信號編解碼演

算法Codec EngineDSP 的即時操作系統 DSPBIOS 及和 ARM 通信的模組

IO 層

即是我們通常所說的驅動(Driver)主要是針對 Davinci 外部模組的驅動程

式包括 NetworkUSBLCDHD 等等

TI daVincitrade DM644x 的開發程序可分為四個步驟

第一步

工程師需要基於 DSP 利用 CCS 開發自己的影音信號編解碼演算法編譯

產生一個編解碼演算法的資料庫檔lib(等同於 Linux 環境下的a64P直接在

Linux 環境下修改檔案尾碼名稱即可)如果要透過 Codec Engine 使用這個資料

庫檔中的演算法函數那麼這些演算法實現需要符合 xDM(xDAIS(eXpress DSP

Algorithm Interface Standard) for Digital Media)標準Codec Engine 機制下不符合

xDM 標準的演算法實現需要建立演算法自己的 Stub 和 Skeleton(具體請參考

spraae7pdf)

第二步

產生一個在DSP上執行的可執行程式x64P(即out檔)也就是DSP Server

第三步

根據 DSP Server 的名字及其中包含的具體的音視頻編解碼演算法建立

Codec Engine 的設定檔cfg這個檔定義 Engine 的不同設置包括 Engine 的名

字每個 Engine 裏包括的 codecs 及每個 codec 執行在 ARM 還是 DSP 側等等(具

體說明請參考 sprue67pdf 的第 5 章 Integrating an Engine)

第四步

應用工程師收到不同的 CodecDSP Server 和 Engine 設定檔cfg把自己

的應用程式透過編譯鏈結最終產生 ARM 側可執行檔

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

22

16 基本要求

161 對實驗環境的要求

PC 一台作業系統建議選用 WindowsXP(或是 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更新程式

(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)有 15G 以

上的可用硬碟空間硬碟檔案格式為 NTFS建議記憶體在 512M 以上主機有

DVD 光碟機

162 對修課同學的要求

參與實驗的同學必須事先學習過 Linux 的基礎知識對 Linux 作業系統

Linux 命令有一定瞭解在這裏需要瞭解嵌入式 Linux 開發的有關內容另外

同學對 TI 的 DaVinci 平臺以及 CCS 整合開發環境也須有一定的瞭解如果你不

具備上述基礎知識請參看ldquo14 參考資料

17 參考的資料

如果你沒有預先學習過 Linux 的基本教程可以參考以下資料 【1】ldquoLinux For Dummiesrdquo by Dee-Ann LeBlanc 【2】ldquoLinux Pocket Guiderdquo by Daniel J Barrett 【3】ldquoBuilding Embedded Linux Systemsrdquo by Karim Yaghmour 【4】ldquoBeginning Linux Programmingrdquo Third Edition by Neil 【5】ldquoLinux Device Driversrdquo Third Edition by Jonathan Corbet Alessandro

Rubini Greg Kroah-Hartman 如果你想瞭解 DM6446 的詳細情況可以參考以下資料 【6】ldquoTMS320DM6446 Digital Media System on-Chip(SPRS283)rdquocan find

on wwwticom TI 網站上提供的其他 DaVinci 有關的資料在附件光碟的ldquoDocumentsrdquo目錄

下也提供了一些參考資料

18 專業術語解釋及書寫慣例

181 專業術語

ARMDM6446 上的 ARM 處理器

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

23

CCS即 Code Compose Studio TI 推出的一種集成開發環境 cmemContiguous memory allocator DaVinci指 TI 的 DaVinci 技術它是 TI 近年推出的基於 DSP 系統的

專為高效地處理數位視訊而提供的整合解決方案在本實驗講義中也用它來指

代 DaVinci 的雙核心處理器 DSPDM6446 上的 DSP 處理器 dsplinkDSP link interprocessor communications Linux 主機執行 Linux 作業系統的一台 PC在我們的實驗課程中指的就

是 Linux 虛擬機 VISAVideoImageSpeech and Audio xDM XDAIS (eXpressDSP Algorithm Interface Standard) for Digital Media

182 書寫慣例

Host 表示之後跟隨的指令是在 Linux 主機的 shell 視窗鍵入的 EVM表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

u-boot shellmdashmdash即 Linux kernel 未啟動之前的視窗中鍵入的 Target 表示之後跟隨的指令是在連接到實驗箱串列的串列終端的

Linux shellmdashmdash及 Linux kernel 啟動之後的視窗中鍵入的 之後跟隨的是原始檔案中的語句黑體也用來表示來自原始檔案

的語句

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

24

第二章 CCS 下的軟體發展

21 DSP 指令集與 C 語言程式開發 (Unit 3)

實驗目的

透過一個簡單的Hello world程式瞭解CCS整合開發環境

實驗內容

建立一個專案並編寫除錯一個簡單的Hello world程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

模擬器的一頭透過 USB 接線連接到 PC一頭連接到開發板確認開發

板上指撥開關 S3 設置為 00111 11110跳線 J4 的 12 腳短接取出電源線

一端連接到 110V 交流電源另一端連接到實驗箱電源介面打開機箱電源

開關和開發板電源開關開發板電源指示燈 DS11 點亮如果你對上述步驟

不適很清楚請參看ldquo113 實驗箱的硬體連接說明rdquo

2 打開CCS以及連接目標板

設置好 CCS 後在桌面雙擊 打開 CCS彈出如下介面

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

25

首先需要連接需要模擬的 CPU選中ldquoDaVinci_TDS 510USB Plusrdquo點

擊滑鼠右鍵選擇ldquoConnect Targetrdquo連接目標板

正確連接後變成如下狀態如果此時ldquoC6400PLUS_0rdquo連接錯誤可以按

下 S4 手動重置開發板之後重新連接即可

選中ldquoARM9_0rdquo點擊右鍵選擇ldquoOpenrdquo或直接雙擊啟動 CCS進入

ARM 端程式開發如下圖所示

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

26

CCS 成功啟動後的畫面如下圖所示

3 建立專案以及編輯原始程式

a) 建立Hello world專案 在CCS的標題功能表中選擇ldquoProjectrarrNewrdquo如下圖所示

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

27

單擊後出現以下畫面

輸入專案名稱選擇專案存放的目錄(注意路徑名中不能有中文

CCS不能支援中文路徑)專案編譯後的檔案格式(這裏我們選擇

ldquooutrdquo即輸出可執行檔)和目標cpu(如上圖)然後點擊ldquoFinishrdquo按鈕在CCS的專案管理窗內會出現剛建立的專案如下圖所示

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

28

b) 編輯原始程式mainc和連結程式helloworldcmd

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource Filerdquo打開一個編

輯視窗輸入原始檔案內容如下 include ltstdiohgt include ltstdlibhgt int main(void) printf(Hello worldn) return 0

編輯完成之後儲存為ldquomaincrdquo檔儲存到和專案檔同一個目錄下

並將其添加到專案中添加方法為 選擇專案檔點擊滑鼠右鍵選中

ldquoAdd Files to Projecthelliprdquo在出現的對話方塊中選中mainc檔案後檔案

被添加到專案中如下圖

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

29

編輯連結命令檔helloworldcmd檔選擇ldquoFilerarrNewrarrSource Filerdquo打開一個新的編輯視窗輸入原始檔案內容如下

-lrts32elib -stack 0x00000800 Stack Size -heap 0x00000800 Heap Size MEMORY IRAM o = 0x00000000 l = 0x00004000 DRAM o = 0x00008000 l = 0x00004000 AEMIF o = 0x02000000 l = 0x02000000 DDR2 o = 0x80000000 l = 0x04000000 SECTIONS bss gt DDR2 cinit gt DDR2 cio gt DDR2 const gt DDR2 stack gt DDR2 sysmem gt DDR2 text gt DDR2 ddr2 gt DDR2 儲存為ldquohelloworldcmdrdquo檔儲存到和專案檔同一個目錄下並將

其添加到專案中添加方法如上所述 關於 cmd 檔的書寫格式可參見資料 spru198 ldquoTMS320C6000

Programmerrsquos Guiderdquo該篇資料的924節介紹了cmd檔的書寫方式介

紹的是dsp上cmd檔的書寫方式不過arm上的也是基本一樣的所有參

考資料都會在附件光碟的ldquo參考資料rdquo目錄下給出同學們也可以自己去

TI的網站上查找最新的資料

4 編譯執行程式

修改專案的編譯屬性修改方法如下 選擇 ldquoProjectrarrBuild OptionsrarrCompilerrarrAdvancedrdquo 選項卡選中

ldquoLittle-endian Coderdquo 表示使用低位元組對齊的方式如果想詳細瞭解ldquoBuild Optionsrdquo中的選項可參考spru509ldquoCode Composer Studio Development Tools v32 Getting Started Guiderdquo的432節

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

30

點擊CCS工具欄中的 按鈕編譯連結程式如有錯誤在編譯視窗中

會有相應提示修改錯誤直到無編譯連結錯誤接著Load程式到目標板方

法是選擇ldquoFilerarrLoad Programrdquo按F5或點擊 按鈕執行程式

5 觀看實驗結果

程式正確執行後能夠在CCS的列印視窗列印出ldquoHello worldrdquo

實驗參考程式

請自行參閱附件光碟1的~CCS Example_davincievm2_ARMexamples helloworld

22 DSP 基本數學及陣列運算(Unit 4)

實驗目的

利用TI DSP與CCS撰寫基本的數學及陣列運算程式

實驗內容

建立一個專案並編寫除錯一個簡單的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

31

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Math Test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int a b c

c=a+b c=a-b c=ab c=ab

2 float a bc 重新執行1)的程式

3 使用完成以下陣列運算

8765

4321

=⎥⎦

⎤⎢⎣

⎡+⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡minus⎥

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

8765

4321

=⎥⎦

⎤⎢⎣

⎡⎥⎦

⎤⎢⎣

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

23 RGB 與 YUV 420 彩色空間轉換(Unit 5)

實驗目的

利用TI DSP與CCS撰寫基本的RGB與YUV 420彩色空間轉換運算程式

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

32

實驗內容

建立一個專案並編寫一個簡單RGBlt-gtYUV的數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立RGB2YUV test專案若有同學不熟悉此項程序可參考Unit 3

實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下數學運算實驗

1 int r g b

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

minusminusminusminus=

⎥⎥⎥

⎢⎢⎢

bgr

vuy

114058707010886058702990144058702990

2 int y u v

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

33

請嘗試找出YUV-gtRGB的轉換矩陣將(1)轉換完畢的yuv變數

轉回rgb

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

24 DCT 與 IDCT 運算 (Unit 6)

實驗目的

利用TI DSP與CCS撰寫基本的DCT及IDCT運算程式

實驗內容

建立一個專案並編寫一個簡單的1D DCT與IDCT數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

34

a) 建立DCT test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc

在CCS的標題功能表中選擇ldquoFilerarrNewrarrSource File打開一個

編輯視窗輸入原始檔案記得加入mathh指令

include ltmathhgt

c) 請完成以下程式

The 1-D Type-II DCT (Gerenal form) is defined as

Forward DCT

k = 0 1 N-1

Inverse DCT

n = 0 1 N-1

We can find the basis vectors given the names to C of DCT as

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

5 2D DCT轉換程式請參閱課本說明完成2D DCT轉換

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

35

25 純量量化與矩陣量化運算 (Unit 7)

實驗目的

利用TI DSP與CCS撰寫基本的純量量化與矩陣量化運算程式

實驗內容

建立一個專案並編寫一個簡單的純量量化與矩陣量化數學運算程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000為Service Pack3WindowsXP為Service Pack1)

2 TS-DM6446實驗箱一台

預備知識

1 C語言編程基礎知識 2 CCS開發軟體的基礎知識

實驗步驟

1 硬體連接

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

36

請參考Unit 3的實驗步驟完成硬體設定

2 打開CCS以及連接目標板

請參考Unit 3的實驗步驟完成CCS連結設定

3 建立專案以及編輯原始程式

a) 建立Quant test專案若有同學不熟悉此項程序可參考Unit 3實驗

b) 編輯原始程式mainc完成以下純量量化程式

c) 編輯原始程式mainc完成以下矩陣量化程式

量化矩陣

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

37

輸出結果驗證

d) 編譯執行程式

若有錯誤訊息請嘗試找出錯誤發生原因

4 觀看實驗結果

程式執行後請利用Matlab驗證程式結果的正確性

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

38

第三章 音訊處理實驗

CCS 環境下 DSP 端目標板的連接以及專案檔的建立與 ARM 端基本上

是相同的不清楚地同學請查看 Unit 3 的實驗不同的是要打開的視窗是

C6400PLUS_0下面給出幾個簡單的音訊實驗的例子同學們可以參考一

下如果希望詳細的瞭解更多 DSP 程式編寫的有關知識可以自行參考資

料spru198ldquoTMS320C6000 Programmers Guiderdquo

31 AIC33 音訊信號的擷取與播放 (Unit 8)

實驗目的

學習編寫 AIC33 音訊信號擷取與播放的程式

實驗內容

按照 AIC33 音訊處理晶片的設定完成對音訊(ASP)介面的設置及音訊資料

的擷取播放

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 AIC32 音訊編解碼通 I2C 匯流排對其進

行設置對 I2C 的操作需要滿足 AIC33 晶片的讀寫時序要求透過 ASP 介

面讀取和寫入音訊資料

實驗步驟

1 硬體連接

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

39

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案 CCS Example_davincievm2_ARM examples_dspaic33 aic33pjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

透過 CD 播放機或 PC 播放聲音執行程式的時候可以從耳機聽到你播

放的內容執行程式以後開始先聽到一段單音(聲音可能比較大注意保

護耳朵)大概半分鐘以後會聽到電腦所播放的歌曲如果沒有聲音失真表

示程式正確執行同時你還能夠在列印視窗看到如下資訊

32 G711 語音編碼器實驗 (Unit 9)

實驗目的

學習編寫 G711 語音編解碼器測試的程式

實驗內容

測試 TI G711 編碼器函式庫完成對語音信號的 G711 編解碼實驗

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

40

Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C語言程式基礎 2 I2C匯流排操作相關知識 3 音訊(ASP)介面的相關知識

實驗步驟

1 硬體連接

模擬器的一頭接到 PC一頭連接到開發板模擬器介面 J1確認開發板

上指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接透過音訊傳輸

線連接 PC 的音訊輸出和開發板的音訊輸入(LINEIN-BOT 端)將耳機連

接到音訊介面的 LINEOUT-TOP 端取出電源線一端連接到 110V 交流電

源另一端連接到實驗箱電源介面打開機箱電源開關和開發板電源開關

開發板電源指示燈 DS11 亮如果你不清楚如何連接請參看ldquo113 實驗

箱的硬體連接說明rdquo

2 打開CCS和專案檔案

將 CODEC_server_demo 整個資料夾複製到 Red Hat 9 內homeuserworkdirfilesysoptworkshop 之下 3 Davinci 板子接上耳機以及 Line In (從 PC 播放聲音輸出) 4 輸入指令 mount 192168136202homeuserworkdirfilesys mnt (其中

192168136202 是 Red Hat 9 的 IP ) 5 再來到執行資料夾下輸入 cd mntoptworkshopCODEC_server_demo 6 執行編碼 encoded -s 123g711 amp

-s 是 speech 語音檔 123g711 檔名為 123副檔名是 g711檔名可以隨意副檔名一定要打

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

41

輸入 ps 看目前執行程序 encoded ndashs 123g711 代號是 1081

關掉編碼輸入 kill 1081 1081 是從上一步驟 ps 得到的每次執行代號都不一樣

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

42

輸入 ls 看到剛剛編碼的 123g711

7 解碼播放輸入 decoded -s 123g711 amp耳機會聽到剛剛錄的聲音

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

43

第四章 視訊處理實驗

41 TVP5146 視訊信號的擷取與播放 (Unit 10)

實驗目的

學習 VP 介面和視訊編解碼晶片的程式編寫

實驗內容

透過設置 TVP5146 介面和視訊編解碼晶片實現視訊影像的測試

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446實驗箱一台

預備知識

1 C 語言程式基礎 2 I2C 匯流排操作相關知識 3 VP 介面的相關知識 4 TVP5146 的相關知識

實驗原理

DM6446 透過 I2C 匯流排連接 TVP5146 編解碼並設置 VP 介面使其處

於和 TVP5146 相同的工作模式擷取 PAL 的視訊影像同時輸出到 LCD

實驗步驟

1 硬體連接

模擬器的一頭到 PC一頭連接到開發板模擬器介面 J1確認開發板上

指撥開關 S3 設置為 00111 11110J4 跳線的 12 腳短接 連接視訊輸入線到視訊端子 J11 的 VI-2 TOP 端連接視訊輸出線到視

訊端子 J8 的 DAC A-BOT 端並打開 LCD 螢幕的開關 取出電源線一端連接到 110V 交流電源另一端連接到實驗箱電源介

面打開機箱電源開關和開發板電源開關開發板電源指示燈 DS11 亮如

果你不清楚如何連接請參看ldquo113 實驗箱的硬體連接說明rdquo 其中視訊輸入的連接方式與該節中講述的不一致參看下圖

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

44

2 打開CCS和專案檔案

打開 CCS 開發環境打開專案

_davincievm2_ARMexamplesvideo_loopbackPALvideo_loopbackpjt

3 編譯並執行程式

點擊編譯按鈕編譯程式編譯完成後load 程式到開發板並執行程式

4 觀看實驗結果

程式正確執行後能夠在列印視窗看到如下資訊

執行結果在實驗箱的顯示幕上將顯示攝影鏡頭所錄製的影像畫面

42 Linux 實驗環境的建立

實驗目的

學習使用工具在實驗板上設置一個 Linux 的開發環境

實驗內容

安裝虛擬機設置串列終端連接實驗設備啟動開發板並從串列終端觀察

實驗步驟

實驗步驟一安裝和啟動虛擬機

1安裝虛擬機的播放軟體 VM Player

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

45

在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player

VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案

將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat

Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間

3啟動虛擬機

在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在

彈出的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是

第一次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這

個過程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名

ldquouserrdquo登入密碼為ldquouseruserrdquo

你也可以直接從資源管理器進入虛擬機的安裝目錄直接雙擊ldquovmxrdquo檔啟

動虛擬機

如果已經載入過一次虛擬機你可以直接在 VM Player 啟動之後的ldquoRecent

Virtual Machinesrdquo裏找到那個虛擬機然後直接雙擊啟動

4設置串列終端

在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超

級終端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出

第二個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列

號並正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

46

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確

定rdquo即打開一個串列終端視窗

5啟動開發板

首先檢查你的開發板確認以下元件被正確設置

S3指撥開關的設置為(從開關 1 到 10)10111 11110

J4接腳 12 短接

然後連接開發板的電源介面網線介面和串列如果你不知道如何連接

請參看ldquo113 實驗箱的硬體連接說明rdquo

之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動

此時由於我們的實驗箱已經預先燒錄了 U-boot 程式從串列終端可以看到

U-boot 程式已經啟動請在自啟動倒計時是敲任意鍵終止自啟動過程進入如下

頁面

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

47

這個就是 U-boot 的命令視窗在此視窗可以設置一些 U-boot 的啟動參數

指示開發板的啟動方式

在此視窗鍵入

EVM help

可以瞭解 U-boot 支援的所有命令

你還可以鍵入下列命令來查看已經設置的參數

EVM printenv

現在你已經知道了如何準備一個嵌入式 Linux 的開發環境接下來將介紹

如何開始嵌入式 Linux 程式的開發

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

48

43 Hello World

從這部分我們將開始對 DaVinci Evaluation Module(DVEVM)及在以後開

發過程中所用到的軟體編譯工具進行探索

實驗目的

利用 XDC 編譯一個簡單的應用程式學習使用 XDC瞭解 XDC 所用

到的幾個設定檔

實驗內容

在這部分實驗中我們將 1 在一台 Linux 主機上利用 XDC 的編譯功能並結合腳本命令編譯一個簡

單的應用程式 2 在 TMS320DM6446 晶片的 Arm926 上使用 U-boot bootloader 啟動一個

Linux 核心 3 在基於x86的Linux主機和基於Arm926的DaVinci目標系統上使用Linux

終端執行ldquoHello Worldrdquo程式

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 相關基礎知識及 C 語言程式知識

實驗原理

1交叉編譯

在進行 Hello World 實驗之前我們需要瞭解一些交叉編譯方面的知識 1) 什麼是交叉編譯

在一種電腦環境中執行的編譯程式能編譯出在另外一種環境下執行的

程式我們就稱這種編譯器支援交叉編譯這個編譯過程就叫交叉編譯簡

單地說就是在一個平臺上產生另一個平臺上的可執行程式 2) 為什麼需要交叉編譯

在下列情況下我們需要交叉編譯 目的平臺上不允許或不能夠安裝我們所需要的編譯器而我們又需要

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

49

這個編譯器的某些特徵 目的平臺上的資源不足無法執行我們所需要編譯器 目的平臺還沒有建立沒有作業系統無法執行編譯器 交叉編譯是不得已而為之與主機編譯相比交叉編譯受的限制更多

雖然在理論上我們可以做任何形式的交叉編譯但事實上由於受到專利

版權技術的限制並不能保證可在任何情況下進行交叉編譯

2 XDC 工具介紹

在以後的實驗中我們將使用 XDC 編譯工具下面對 XDC 工具進行

簡單的介紹和其他編譯工具一樣 XDC 根據編譯命令來編譯可執行檔 XDC 將會編譯所有的依賴檔 XDC 可以為多種目標平臺進行編譯如 ARM 和 DSP XDC 編譯的原始程式可以包括 CC++等 不同與其他編譯工具XDC 可以編譯 RTSC packages RTSC = real time software component Packages 可以包含依賴關係和版本資訊 當這些 packages 作為原始程式來使用時XDC 可以自動執行依賴關

係和版本資訊檢測 當提供了設置腳本時XDC 可以產生程式這項功能在整合 packages

時十分有用

實驗步驟

實驗步驟一啟動 Linux 主機 按照前一個實驗所述步驟啟動虛擬機(Linux 主機)以ldquouserrdquo身份登錄密

碼則是ldquouseruserrdquo然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 用 ls 列一下次目錄中的內容可以看到除了若干實驗程式子目錄之外還

有兩個 XDC 的設定檔 configbld提供 XDC 所使用的工具的設置資訊例如compiler

assemblerlinker 的路徑以及目標 CPU 的類型是 Linux86MVArm9還是 C64P

setpathssh定義了所有實驗程式編譯的時候需要用到的工具和

packages 的絕對路徑 打開這兩個檔案看一下在我們提供的這兩個檔裏已經按照本 Linux 主機

中的實際路徑寫好了這兩個檔案如果你把實驗程式放到其他 Linux 主機環境裏

去則需要自己動手修改這兩個檔 實驗步驟二啟動開發板

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

50

按照前述實驗所述方法打開串列終端並啟動開發板在進入自啟動過程時終

止啟動過程 然後在超級終端中查看 U-Boot 環境下設置的啟動參數修改這些參數

載入 kernel 和檔案系統儲存設置鍵入ldquobootrdquo命令啟動開發板或直接斷電重新

啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 實驗步驟三一個簡單的 Hello World 程式 1進入本實驗程式所在目錄

Host cd homeuserdavinci_labworkshoplab05a_hello_world 在此目錄下用 ls 列一下目錄內容可以看到一個子目錄ldquoapprdquo和一個檔

runxdcsh 其中runxdcsh 是一個用來使用 XDC 工具的外殼腳本它設置 XDC 工具

的使用環境比如 XDC 工具查找包含的 packages 時的搜索路徑的 XDCPATH

以及用來設置 XDC 工具的 configbld 的位置 2進入子目錄 app 1) 用 ls 列一下此目錄中的內容可以看到一下三個檔

mainc應用程式檔包含 main() packagebldxdc 編譯腳本一個決定 XDC 工具將編譯產生什麼樣

的應用以及用哪些檔來編譯產生這些應用的編譯腳本 packagexdcpackage 聲明檔聲明了一個 package 的名字從屬性

版本模式列表 2) 查看 mainc 檔案 該檔在標準輸出設備列印ldquohello worldrdquo關於ldquoprintfrdquo的用法你可以透過

ldquomanrdquo命令來瞭解 Host man printf 3) 查看 packagexdc 檔案 這是一個十分簡單的設定檔實際上它除了申明了用於編譯應用的 package

的名稱之外什麼也沒做這個名稱必須與包含 packagexdc 檔的目錄的名稱相

同 因 此 它 被 命 名 為 ldquoapprdquo ( 也 可 以 是 lab05a_hello_worldapp 或

workshoplab05a_hello_worldapp) 4) 查看 packagebld 檔案 該檔的開始申明了兩個陣列一個指明了所有要產生的程式的目標系統另

一個指明了所有產生的程式的 profile(release 還是 debug)本檔指明將要編譯

Arm9 和 x86 兩種目標系統的可執行程式並且只編譯 release 版的 檔案的最後用一個嵌套的迴圈遍曆了所有可能的目標程式的編譯組合即對

任何一種目標系統和 profile 的可能組合使用 PkgaddExecutable 方法來產生一

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

51

個可執行程式而 addObjects()用來把由陣列ldquocsourcesrdquo列出的 C 原始程式加入到

可執行程式的編譯中去 欲詳細瞭解 XDC 工具你可以參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 3 回到上一級目錄查看 runxdcsh 檔案 這個腳本檔總共有四行第一行連結了 setpathssh 檔從而使得本檔可以使

用 setpathssh 中定義的相關路徑第二行定義了 XDC 的搜索路徑第三行定義

了 XDC 編譯是使用的設定檔路徑就是我們前面描述過的 configbld 檔案最

後第四行執行 XDC 命令編譯所有 packages 欲瞭解這些命令的詳細含義請參看 Linux 主機目錄homeuserdvevm_1_10

xdctools_1_21doc下的有關資料其中 indexhtml 為這些資料的索引 1產生和測試ldquoHello Worldrdquo應用 1) 在 Linux 終端中執行 runxdcsh 腳本產生應用 Host runxdcsh

2) 進入子目錄ldquoapprdquo可以看到產生了兩個可執行檔app_releasex86U 和

app_releasex470MV前者是 x86(Linux 主機)上的目標程式後者是

arm 上的 Host app_releasex86U 此句的執行結果是在 Linux 主機螢幕上列印出 Hello world Host cp app_releasex470MV homeuserworkdirfilesysoptworkshop 這句話把產生的可執行檔拷貝到目標檔案系統中去然後切換到超級終端視

窗輸入如下命令 Target app_releasex470MV 執行結果是在串列終端輸出 Hello world 實驗步驟四擴展實驗mdashmdash添加編譯規則 現在嘗試添加一些編譯規則以體會設定檔中使用 javascript 語言的好處 1拷貝 lab05a_hello_world 中的所有檔到新的實驗目錄 Host cd homeuserdavinci_labworkshoplab05b_extended_features Host cp ndashR lab05a_hello_world 注意在 lab05b_extended_features 的 app 目錄中已經存在一個 installrule 的

檔拷貝的時候請不要覆蓋這個檔 2添加一個安裝規則透過它可以在編譯的時候直接把可執行程式安裝到

目標系統中去 1) 把 lab05b_extended_featuresappinstallrule 檔中的程式複製到 packagebld

的最後 installrule 檔的前七行添加了 install 的規則這幾句話的意思是編譯的時候

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

52

遇到 install 規則的話把產生的所有可執行檔拷貝到指定目錄中去後兩行的意

思是遇到 clean 規則清除指定目錄中的上述檔 ldquoPkgmakeEpilogue = rdquo表示之後跟隨的字串將被粘貼到 packagemak 檔的最

後 2) 執行 runxdcsh 腳本查看產生的 apppackagemak 檔在檔的最後添

加了這樣兩行 install app_releasex470MV app_releasex86U

$(CP) $^ homeuserworkdirfilesysoptworkshop

clean

$(RM) homeuserworkdirfilesysoptworkshopapp

這兩句的意思應該非常明白 3) 執行 runxdcsh 腳本使用 clean 作為一個參數 Host runxdcsh clean 執行完之後去目標板的工作目錄查看 Target cd optworkshop Target ls 你會發現原先拷貝過來的可執行檔已經被刪除了再次接著執行 runxdcsh

腳本使用 clean 作為一個參數 Host runxdcsh install 然後進入目標板的工作目錄查看可以看到產生的兩個可執行程式都被自

動拷貝到了該目錄下執行如下命令並觀察實驗結果應該和上一步驟中是一樣

的 Target app_releasex470MV 3 在 packagebld 裏添加一個原始檔案搜索功能 在實驗步驟三中我們在 packagebld 中使用一個陣列直接指明了所有用到

的待編譯的 C 原始程式這裏我們將學會使用 javaioFile()在當前目錄裏搜索

所有檔以及使用 Stringmatch()選擇尾碼名為c 的檔案 該段程式程式如下

var sources = javaioFile()list()

var csources = []

for (var i = 0 i lt sourceslength i++)

if(String(sources[i])match(c$))

csourcespush(sources[i])

其中c$表示ltanythinggtc 這些都是標準的 javascript 描述語句所以希望詳細瞭解這些語法的同學

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

53

可以自己參考有關資料

用上面的程式替代以下程式 The array of c source files that will be compiled

into the final executable

var csources = [mainc]

這樣原始檔案就可以被任意增加或刪除而不影響編譯 4 最後還有一條 packagemak 規則要添加進來

PkgmakeEpilogue + = ldquo include custommak nnrdquo 這句話告述 xdc 工具解析 configbldpackagexdc 以及 packagebld 檔案以產

生 packagemak 檔這是一個 gnu 的 makefile 檔它指明專案中的所有檔如何被

編譯 實驗步驟五拓展實驗的功能 1 開始這些試驗之前請先複製 lab05b_extended_features 目錄下的所有檔

到一個新的工作目錄比如ldquolab05c_challenge1rdquoldquolab05c_challenge2rdquo使用下面

的命令 Host cd homeuserdavinci_labworkshop Host cp ndashR lab05b_extended_features lab05c_challengeX 其中ldquoXrdquo表示數字 1234 1) Challenge1 修改 mainc 原始檔案實現詢問用戶名並作出相應問候的功能試驗結果

如下 Target app_releasex470MV What is your name Steve Hello Steve 2) Challenge2

修改 mainc 原始檔案實現以用戶名為命令參數並作出相應問候

的功能試驗結果如下 Target app_releasex470MV Steve Hello Steve 3) Challenge3

修改 mainc 原始檔案預定用戶名為 Steve並以用戶名為命令參

數如果是 Steve則問候若不是則顯示如下資訊You are not Steve 結果如下

Target app_releasex470MV Steve You are not Steve 4) Challenge4

修改 mainc 原始檔案以用戶名為命令參數並在結果中將用戶

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

54

名字母全部轉化為大寫字母結果如下 Target app_releasex470MV Steve HelloSTEVE

試驗參考程式

homeuserdavinci_labsolutions 檔案 setpathssh configbld soln05a_hello_world soln05b_extended_features soln05c_challenge1 soln05c_challenge2 soln05c_challenge3 soln05c_challenge4

實驗總結

透過本試驗我們學習了 XDC 編譯工具的入門知識瞭解了 XDC 所需要

的幾個設定檔並試著修改了設定檔 packagebld這樣我們就對 XDC 工具有

了一個初步的瞭解

44 H264 視訊編碼器實驗 (Unit 11)

實驗目的

瞭解 xDAIS 和 xDM 規範學習如何使用符合 xDM 規範的用戶 codec

實驗內容

測試 TI 發布之 H264 編碼器和解碼器

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98 Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsaXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS-DM6446 實驗箱一台

預備知識

Linux 基本操作命令xDM 規範的有關知識

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

55

實驗原理

maincservercfgservertcf(linkcmd)

enginecfg

lab_13a_real_h264

audio_threadc

audio_input_outputc audio_input_outputc

OSS audio OSS audioAUDDEC

video_threadc

video_inputc video_osdcvideo_outputc

v4l2 video FBDEV vid

mainc

AUDENC

audio_encoderc

VIDENC

video_encoderc

audio_decoderc

VIDDEC

video_decoderc

server_debugx64P

實驗步驟

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄 Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄 Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令 Target sh loadmodulessh

實驗步驟三real_h264 1進入本實驗程式所在目錄 Host cd homeuserdavinci_labworkshop (本實驗請在 root 權限進行) 2編輯修改程式碼

(1) Host cp ndashR lab12b_tracing lab13a_real_h264 確 定 使 用 上 面 指 定 的 命 令 來 避 免 覆 蓋 掉 已 經 提 供 的

video_decodercvideo_decoderhvideo_encodercvideo_decoderh 檔

案如果意外覆蓋那麼可以從 solutionssolu13a_real_h264app 目錄拷

貝被覆蓋掉的檔

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

56

( 若 找 不 到 lab12b_tracing 目 錄 可 由

homeuserdavinci_labsolutionssoln12b_tracing 找到此資料夾) (2) 將 video_encoderc video_encoderh video_decoderc

video_decoderh 從 lab13a_real_h264 目錄移入 app 目錄覆蓋從

lab12b_tracing 拷貝過來的版本檔 (3) 進入 app 目錄打開 enginecfg 準備編輯用 H264DEC 和 H264ENC

模組取代先前由 XdcuseModule 所引入的 VIDDEC_COPY 和

VIDENC_COPY 程式模組注意不要混淆 video encoder 與 video decoder 具體修改如下(2728 行) var VIDDEC = xdcuseModule(codecsh264decH264DEC)

var VIDENC = xdcuseModule(codecsh264encH264ENC)

(4) 同樣進入 server 目錄打開 servercfg用 H264DEC 和 H264ENC來替代 VIDDEC_COPY 和 VIDENC_COPY 程式模組 具體修改如下 (1819 行) var VIDENC = xdcuseModule(codecsh264encH264ENC)

var VIDDEC = xdcuseModule(codecsh264decH264DEC)

(5) 進入 app 目錄打開 video_threadc修改 video_encoder_setup 和

video_decoder_setup 函數 具體修改如下 44行define INPUTFILE tmpvideoraw 刪除掉

(可能看到的程式碼是define INPUTFILE videoraw)

223行if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle)

修改為 if (video_encoder_setup(engineHandle VIDEO_ENCODER

ampencoderHandle D1_WIDTH D1_HEIGHT 30000 4000000

ampencBufSize)

234行if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle)

修改為 if (video_decoder_setup(engineHandle VIDEO_DECODER

ampdecoderHandle D1_WIDTH D1_HEIGHT ampencBufSize)

(6) Host runxdcsh install (7) 讀一遍 xdc 編譯產生的輸出

應該產生 2 個重要警告第一個為 Warningthe stack size specified for

codecsh264encH264ENC(4096) is less than its

Required minimum size(8192) Stack size set to 4096

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

57

Warningthe stack size specified for codecsh264 decH264

DEC (4096) is less than its

Required minimum size(12288) Stack size set to 4096

第二個應該為 gtgtwarning creating output sectiontables without SECTIONS

specification

gtgtwarning creating output sectiontables_cavlc without

SECTIONS specification

我們可以透過閱讀 codec 資料表來瞭解 stack 大小的需求從而避免

出現警告資料表也應該列出 codec 的 SECTIONS 的需求 (8) 查看 H264 編碼和解碼資料表來瞭解關於這些 codecs 所需要的 stack

的 大 小 資 料 表 在 homeuserdvevm_1_10codec_engine_1_02 examplescodecsh264enc 以及相應的解碼器安裝目錄 舉例 Host cd homeuserdvevm_1_10codec_engine_1_02examples codecsh264enc Host ggv H264_Encoder_DM6446_Datasheetpdf 透過閱讀資料表我們可以知道編碼器需要 8192bytes 的 stack 來

替代原先指定的 4096bytes (9) 修改 serverservercfg 來指定 H264 編解碼器所需要的正確的 stack 大

小具體修改如下 26 行修改如下 stackSize 8192 stackMemId 0 priority ServerMINPRI + 1

30 行修改如下 stackSize 12288 stackMemId 0 priority ServerMINPRI + 1

(10) 修改 linkcmd 連結器來放置 codecs 所要求的自定義程式段 我們希望將程式段放入 DDR 記憶體將下面幾行加入 linkcmd 檔

(放在最後) SECTIONS

tables gt DDR

tables_cavlc gt DDR

(11) 在 server 目錄中打開 packagebld 檔透過增加ldquo-l linkcmdrdquo來將

linkcmd 自定義連結器檔加如到 server 中在 31 行 profile profiles[j]後增加下面一行

lopts -l linkcmd

3執行程式並觀察結果 Host runxdcsh install

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

58

Target app_debugx470MV 實驗步驟五h264_record

這個應用程式以 h264 格式對視訊進行錄像它還可以對音訊進行

錄音因為我們沒有使用 Copy-based 音訊 codec因此將以 raw 格式錄

音 1 進入本實驗程式所在目錄

Host cd homeuserdavinci_lab workshop lab13b_h264_recordapp 查看 audio_threadc 和 video_threadc 檔 gettimeofday()函數被用

來為每一個 audio buffer 和 video frame 來得一個時間標記這些時間標

記是一種有秒和微秒的 timeval 結構在音訊或者視訊 Buffer 中被那些

使用時間標記來校準音訊和視訊同步的應用程式使用前timeval 結構

被寫入儲存的檔中 校準在這個應用程式中是十分必要的因為視訊影像會經常發生畫

面遺失的現象H264 編碼器對於 720x480 顯示每秒產生 15 到 20 幅的

影像但是視訊是以每秒 30 幅的速度傳輸在 lab13c_h264_player 中

當進行重播時可以明顯的看到有些時候並沒有同步原因就是這個方

案並不是非常的精確雖然這個方案不是非常的完美但是起碼進行了

一些簡單的校驗對於一些特殊應用也是足夠的 2 執行實驗並觀察結果

1) Host runxdc install 2) Target app_releasex470MV

開始錄製音訊和視訊檔Ctrl-c 停止 3) 列出產生的檔案

Target ls tmp 可以看到產生音訊和視訊檔

實驗步驟六h264_playback 這個應用程式將重播 H264 編碼方式的視訊影像同時也能播放 raw 格

式的音訊我們將使用這個應用程式來重播上一個實驗中所錄製的視訊檔為了

能有一個更好視訊的播放畫面應用程式已經去除了螢幕上的多餘的顯示 1 進入本實驗程式所在目錄

Host cd lab13c_h264_playbackapp 查看 audio_threadc 和 video_threadc 檔案 播放器基本的聲音和視訊同步方法是設置 Linux 的系統時鐘來吻

合音訊的時間標記這個方法雖然不是十分的有效但是十分簡單還

有一個優點即 Linux 會自動的更新系統時鐘為視訊提供一個差不多的

持續的主要時鐘

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

59

Sudio stream 讀取每一個來自與相應檔的音訊 timestamp正如它讀

取相應的 Buffer 以及使用 settimeofday()函數來設置系統時鐘當視

訊執行緒讀取到相應的視訊畫面接下來便為每一個視訊畫面從它們相

應的視訊檔中讀取 timestamp然後將讀取的 timestamp 與系統的

timestamp 即音訊 timestamp 相比較 在這個應用程式中會經常產生畫面遺失的現象但是我們沒有必

要去校正視訊 timestamp 比聲音 timestamp 早的現象應用程式僅需要

讓視訊畫面暫停這樣聲音便能跟上了 2執行實驗並觀察結果 (1) Host runxdc install (2) Target app_releasex470MV

對 harddriver 的音訊和視訊進行重播Ctrl-c 停止或當其到達音視

訊檔的結尾時會自動退出

實驗步驟七challenge1 使用 lab13c_h264_playback 作為一個出發點在實驗中增加 OSD 特徵 這個實驗是進階實驗有能力的同學可以嘗試可以參考

soln13d_challenge1

實驗參考程式

homeuserdavinci_labsolutions Soln13a_real_h264 Soln13b_h264_record Soln13c_playback Soln13d_challenge1

實驗總結

透過本章的實驗我們瞭解和學習了 H264 編解碼的相關知識

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

60

第五章 網路視訊監控實驗

51 H264 網路攝影機實驗 (Unit 12)

實驗目的

透過一個簡單的實例來瞭解如何利用已有的 DaVinci 知識來構建一個網路

影像監控應用範例

實驗內容

在 lab13b_h264_recoder 的基礎上修改去掉音訊部分和儲存視訊串流的部

分利用網路傳輸視訊串流

實驗設備

1 PC 一台作業系統為 WindowsXP(或 WindowsNTWindows98Windows2000)Windows 作業系統的核心如果是 NT 的應安裝相應的更

新程式(如Windows2000 為 Service Pack3WindowsXP 為 Service Pack1)預留可用空間 15G 以上的 NTFS 格式的硬碟分區建議記憶體

在 512M 以上

2 TS- DM6446 實驗箱一台

預備知識

Linux 基本操作命令和網路程式的知識

實驗原理

在網路攝影機展示實驗中CCD 攝影機所錄製的影像經過 H264 編碼處理

後透過網路發送到 PC 上然後再經過 PC 端應用程式解碼就可以看到傳遞

的即時視訊影像

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

61

實驗步驟

(本實驗視訊輸入輸出安裝如下圖所示)

實驗步驟一啟動 Linux 主機 啟動虛擬機(Linux 主機)以ldquouserrdquo身份登入然後進入實驗程式所在目錄

Host cd homeuserdavinci_labworkshop 實驗步驟二啟動開發板 打開串列終端並啟動開發板可以在進入自啟動過程時終止啟動過程鍵入

ldquobootrdquo命令啟動開發板或直接自動啟動等待啟動完畢輸入用戶名ldquorootrdquo登入 啟動之後進入預先設置的實驗目錄

Target cd optworkshop 如果還未載入 loadmodulessh請執行以下命令

Target sh loadmodulessh

實驗步驟三 IP camera 實驗 進入實驗目錄並修改原始程式

Host cd lab15_IPcamera 大家可能發現本實驗就是在 lab13b_h264_recorder 的基礎上進行的實

驗所有的程式都是以 lab13b_h264_recorder 實驗的程式為基礎進行修改

如果有興趣有一定能力的同學可以不看下面的步驟自己進行修改 轉換到 app 目錄修改 video_threadc 檔案

(1) 把網路標頭檔 netdbh 添加進去 include netdbh

(2) 刪除此行程式 Output file

define OUTFILE videoh264

(3) 在 video_thread_fxn 主函數開頭部分對 Capture and display driver variables 下程式做以下修改 刪除此行程式

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

62

FILE outputFile = NULL output file pointer

(4) 刪除 Timestamp variable 下程式使用以下程式替換 socket variable

int sockfd sendBytes

struct hostent he

struct sockaddr_in their_addr connects address infordation

char address[ ] = 192168136144 that my host IP

printf(Send streams to 192168136144n)

if((he=gethostbyname(address)) == NULL) get the host info

herror(gethostbyname)

exit(1)

if((sockfd = socket(AF_INET SOCK_DGRAM 0)) == -1)

perror(socker)

exit(1)

printf(clientsockfd=dnsockfd)

their_addrsin_family = AF_INET host byte older

their_addrsin_port = htons(5010) network byte order

their_addrsin_addr = ((struct in_addr )he-gth_addr)

memset(amp(their_addrsin_zero) 0 8) zero the rest of the

struct

注意上面程式中的那個 IP 位址這個 IP 位址是你要將視訊串流發

送過去的 IP 位址在本實驗中就是與你的 EVM 板用網線連接的 PC 主

機的 IP 位址 (5) 刪除 Open output file 下的程式和 Record that display device

was opened in initialization bitmask 下的程式 (6) 刪除 Acquire timestamp of dequeued buffer 下程式 (7) 在 Encode the buffer 程式段後添加以下程式

if(( sendBytes = sendto(sockfd encBuf numbytes

0(struct sockaddr )amptheir_addrsizeof(struct

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

63

sockaddr_in))) == -1)

ERR(sendto errorn)

status = VIDEO_THREAD_FAILURE

break

printf( Send d bytes to hostn sendBytes)

(8) 在上一步添加的程式段後刪除以下程式 if(fwrite(ampcurrTime sizeof(currTime) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(ampnumbytes sizeof(numbytes) 1 outputFile) lt 1)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

if(fwrite(encBuf sizeof(char) numbytes outputFile) lt

numbytes)

ERR(fwrite failed to FILE ptr pn outputFile)

status = VIDEO_THREAD_FAILURE

break

(9) 在最後ldquocleanuprdquo部分刪除 Close video display device 下的程

式 儲存修改的檔案後退出 vi 編譯環境

修改 video_encoderc 檔案 Host vi video_encoderc

在程式最後部分 Report any errors 下刪除如下三段程式 ERR(Deleted video encoder instance with handle 0lxn

(unsigned long) encoderHandle)

ERR(tEncoder exited with error mask 0xn

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

64

(unsigned int) statusextendedError )

printf(Error code = dn statusextendedError)

儲存後退出 vi 編輯環境 修改 mainc 檔案

因為我們在這個實驗裏沒有使用音訊所以檔案中和音訊相關的程式段

均可刪除在此不再列出具體的內容大家可以自己嘗試一下或者和

solutions 裏面的最終程式對照

實驗步驟四編譯並安裝應用 Host runxdcsh install

實驗步驟五執行實驗並觀察結果

把附件光碟 1 的 IP camera 目錄下的所有檔拷貝到 PC 的同一目錄下執

行 VCenterexe 檔打開一個視窗然後在超級終端中執行以下命令 Target app_debugx470MV

我們可以觀察到在打開的視窗中顯示的即時影像訊號

實驗參考程式

homeuserdavinci_labsolutions Soln15_IPcamera

實驗總結

這章的實驗是想告訴大家我們可以利用 DaVinci 中給出的元件很容

易地編寫一些簡單的實際應用就像是一個簡單的網路攝影機當然實際

中的網路攝影機不可能是這樣簡單的它應該還有音訊串流信號有管理和

控制功能和保障傳輸的措施 有關 Linux 虛擬機器與 Davinci 連線的操作指南 (Host代表 Linux 虛擬機器端輸入的指令Target代表 Davinci 機器端的操作指

令) 1安裝虛擬機的播放軟體 VM Player 在 DVD 光碟機中插入附件光碟 1打開光碟尋找ldquo~Disk1VM Player VMware-player-200-45731exerdquo雙擊開始安裝跟隨提示按照預設方式安裝

即可安裝完畢之後桌面上會出現一個圖示

2解壓虛擬機檔案 將 Disk2 中的 Red Hat Linux2rar 與 Disk1LinuxVM_DVEVM 下的 Red Hat Linux1rar 拷貝到你的硬碟上的同一目錄然後點擊 Red Hat Linux1rar 解壓解

壓得到兩個檔Red Hat Linuxvmx 和 Red Hat Linuxvmdk後者的大小為 12G

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

65

左右解壓之後可以把最初拷貝過來的壓縮檔刪除以節省硬碟空間 3啟動虛擬機 在桌面雙擊 VM Player 的圖示啟動 VM Player啟動之後選擇ldquoopenrdquo在彈出

的對話方塊中選擇虛擬機安裝目錄中的ldquovmxrdquo檔載入虛擬機影像檔如果是第一

次執行在彈出的對話方塊中選擇ldquocreaterdquo選項然後等待虛擬機啟動這個過

程可能需要幾分鐘虛擬機啟動之後進入 Linux 的登入頁面使用用戶名ldquorootrdquo登入密碼為ldquoroot123rdquo 4設置串列終端 在 Windows 的啟動功能表選擇ldquo開始mdash〉所有程式mdash〉附件mdash〉通訊mdash〉超級終

端rdquo並在彈出的對話方塊中鍵入本連結的名稱例如 DaVinci接著會彈出第二

個對話方塊要求選擇連接的串列號請確認你將要連結到開發板的串列號並

正確選擇假設這個串列號為 COM1接下來會顯示如下對話方塊

在此對話方塊中選擇串列 Baud 率為 57600其餘設置如圖然後點擊ldquo確定rdquo即打開一個串列終端視窗 5啟動開發板 首先檢查你的開發板確認以下元件被正確設置 S3指撥開關的設置為(從開關 1 到 10)10111 11110 J4接腳 12 短接 然後連接開發板的電源介面網線介面和串列如果你不知道如何連接請參

看ldquo113 實驗箱的硬體連接說明rdquo 之後打開電源開關當看到 DS11 電源指示燈亮時表示開發板已經啟動 6啟動之前設定好的超級終端機按下 Davinci 開發版上的 S4 之後便可看到

Davinci 機器在開機的過程最後會看到以下畫面等您輸入帳號密碼帳號是

root密碼是 chrgu000便可登入 Davinci 機器

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

66

7開啟 Linux 虛擬機器用 root 權限進入系統帳號密碼依序為 rootroot123利用 ifconfig 查詢 Linux 虛擬機器的網路位址 8 在超級終端機中使用以下的指令 (1)Target mount 192168136151homeuserworkdirfilesysoptworkshop mnt 「192168136151」是在 Linux 虛擬機器用 ifconfig 查詢到的網路位址以上

指令的意義是「192168136151homeuserworkdirfilesysoptworkshop」指的是

Linux 虛擬機所針對的資料夾另外mnt 路徑指的是 DaVinci 機器所存在的資料

夾所以兩個路徑之間記得要空格格開當執行以上指令後Davinci 機器的mnt資料夾便會映射到 192168136151homeuserworkdirfilesys optworkshop 的資料夾便可以在 Davinci 機器上執行 Red Hat9 虛擬機器上的執

行檔 (2)Target cd mnt 以上指令用來進入mnt(在 Davinci 機器上所預設的資料夾之一)的資料夾因

為mnt 資料夾已經對應到 192168136151homeuserworkdirfilesysopt workshopLinux 虛擬機的資料夾 (3)透過超級終端機進入此資料夾後可嘗試在 Linux 虛擬機器的homeuser workdirfilesysoptworkshop 隨意新增檔案看在 Davinci 端是否有出現新增的檔

案已確定連線是否成功

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)

67

(若輸入(1)指令出現如上圖之錯誤訊息請對 Red Hat 9 虛擬機輸入以下兩行指令

排除問題再重(1)開始 Host etcinitdiptables stop Host ifconfig eth0 19216813677)