1 eCos 基礎實驗
Tel:010-62981113-2940/2942/2940/2945 http://www.unsp.com
E-mail:unsp@sunplus.com.cn 3
1 eCos 基礎實驗
实验一 跑馬燈實驗
【實驗目的】
1、 熟悉 eCos 下編程方法;
2、 掌握線程的創建、啟動方法。
【實驗設備】
1、 裝有 Windows 系統和 S+core IDE 集成開發環境的 PC 機一台;
2、 淩陽 SPCE3200 嵌入式精簡開發板一套;
3、 本實驗用到開發板的模組有:SPCE3200 模組,LED 燈電路模組。
【實驗要求】
1、 實現功能:使用設備檔案系統,完成對 IOB 口輸出控制;
2、 實驗現象:實現跑馬燈功能,LED1~LED4 不停迴圈閃爍。
【實驗原理】
本實驗是 eCos 作業系統下的應用程式常式。eCos 作業系統以庫的形式,與應用程式進行靜態 編譯,因此首先要利用 eCos config tool 生成 eCos 庫,然後才能編譯 eCos 應用程式。在 eCos 庫中已 完成相關驅動的編寫,如 IOB、IOA、4×4Key 等。本書屬於 eCos 三本書的最後一本,之前的兩本 書分別是 eCos 傻瓜書、SPCE3200 嵌入式 eCos 系統驅動開發。因此對於一些前面已有的內容,如 eCos 環境配置、eCos 驅動編寫,這裏不再贅述。
eCos 應用程式入口函數是 cyg_user_start(),在這個函數中需要做的事情有:
1、 創建線程,根據需要創建一個或多個;
2、 啟動線程,創建的每個線程都需要啟動一次;
創建線程需要調用 API 函數 cyg_therad_create(),調用方法如下:
【函數原形】void cyg_thread_create(
cyg_addrword_t sched_info, cyg_thread_entry_t *entry, cyg_addrword_t entry_data, char * name,
實驗指導書(SPCE3200 精簡開發板——eCos 平臺篇)
4 Tel:010-62981113-
void * stack_base, cyg_ucount32 stack_size, cyg_handle_t * handle, cyg_thread * thread);
【功 能】創建一個線程
【參 數】 sched_info : 設置線程優先順序,範圍 0~31。其中優先順序 0 優先順序別最高 entry : 線程的入口函數
entry_data : 線程入口函數的參數 name : 線程的識別字
stack_base : 線程堆疊的基底位址 stack_size : 線程堆疊的大小 handle : 線程的返回控制碼 thread : 線程資訊的返回指標
【頭 文 件】使用本函數需要包含<cyg/kernel/kapi.h>
注:本函數可以在初始化或線程中調用。
創建完線程以後,預設線程狀態是掛起態,因此需要調用 cyg_thread_resume()恢 復掛起的線程,調用方法如下:
【函數原形】cyg_thread_resume(cyg_handle_t thread);
【功 能】可以在初始化、線程或 DSR 中調用,使線程繼續執行。
【參 數】cyg_handle_t thread---創建線程時返回的線程控制碼。
【頭 文 件】使用本函數需要包含<cyg/kernel/kapi.h>
eCos 完成線程的創建後,開始線程調度並跳越到各個線程的入口函數執行。在 eCos 系統中,
所有設備都是以檔案的形式被打開並進行讀/寫操作的,本實驗中使用 POSIX 相容的檔案操作介面函 數對底層設備進行操作。POSIX 是 Portable Operating System Interface for UNIX 的首字母縮寫詞,是 一套 IEEE 和 ISO 標準。這個標準定義了應用程式和作業系統之間的一個介面。只要保證他們的程 式設計的符合 POSIX 標準,開發人員就能確信他們的程式可以和支援 POSIX 的作業系統互聯。這 樣的作業系統包括大部分版本的 UNIX。 POSIX 標準現在由 IEEE 的一個分支機搆 Portable Applications Standards Committee(PASC)維護。POSIX 常用的介面函數如下:
【函數原型】int open(const char *path, int oflag, ...);
【功 能】打開名為 path 的檔案或設備,成功打開後返回檔案控制碼。
【參 數】path : 檔案路徑或設備名,如 IOB 設備的名稱為“/dev/iob"
2940/2942/2944/2945 http://www.unsp.com E-mail:unsp@sunplus.com.cn
1 eCos 基礎實驗
Tel:010-62981113-2940/2942/2940/2945 http://www.unsp.com
E-mail:unsp@sunplus.com.cn 5
oflag : 打開方式。可選值可以參考表 1.1
【返 回 值】成功打開後返回檔案控制碼,失敗返回-1
【頭 文 件】使用本函數需要包含<unistd.h>和<cyg/fileio/fileio.h>
表 1.1 打開方式對照表
打開方式 意義
唯讀方式打開 O_RDONLY
只寫方式打開 O_WRONLY
讀寫方式打開(等同於 O_RDONLY | O_WRONLY)
O_RDWR
如果檔案不存在則首先創建 O_CREAT
獨佔方式打開 O_EXCL
禁止取得終端控制 O_NOCTTY
清除檔案原有內容 O_TRUNC
追加方式打開 O_APPEND
採用非阻塞檔案/O 方式 O_NONBLOCK
注:可以使用“|"運算同時使用多種打開方式。
【函數原型】int cyg_fs_fsetinfo( int fd, int key, void *buf, int len );
【功 能】向 fd 檔案發送 key 命令,命令參數由 buf 確定,命令長度由 len 確定。
【參 數】fd : 檔案控制碼 key : 命令 buf : 命令參數 len : 命令長度
【返 回 值】成功操作返回 0,否則返回錯誤
【頭 文 件】使用本函數需要包含<cyg/fileio/fileio.h>
【函數原型】ssize_t write(int fd, const void *buf, size_t nbyte);
【功 能】向檔案寫入資料
【參 數】fd : 檔案控制碼
buf : 待寫入的資料的首位址
nbyte : 待寫入資料的長度(單位:位元組)
【返 回 值】成功寫入的資料長度(單位:位元組)
實驗指導書(SPCE3200 精簡開發板——eCos 平臺篇)
6 Tel:010-62981113-
【頭 文 件】使用本函數需要包含<cyg/fileio/fileio.h>
本實驗中,需要創建一個線程來完成跑馬燈功能,線程中首先初始化IOB驅動,IOB驅動使用設 備檔案系統存取。然後定義一個變數賦初值為 0x04,向IOB驅動輸出這個變數,每輸出一次變數左 移一位元,然後延時一段時間,使LED燈依次閃爍實現跑馬燈效果。程式流程如圖 1.1。
圖 1.1 IOB 主程序流程圖
【實驗步驟】
1、 打開 S+core IDE,使用“S+core IDE eCos Project"範本採用預設設置新建一個工程;
2、 刪除工程檔案夾下的“default_install"目錄;
3、 打開 eCos config tool,使用預設範本建立源碼包,並依次添加“File IO"、“IOB support for Score SPCE3200"兩個組件包;
4、 以“default.ecc"為檔案名將 eCos 範本保存至工程目錄下並將其編譯;
5、 按照實驗原理的描述編寫程式;
6、 修改、編譯(Rebuild All)直到沒有任何錯誤;
7、 用跳線將J17 的插腳都短接,如圖 1.2:
圖 1.2開發板硬體跳線連接圖
8、 利用 EZWriter 或 RedBoot 下載程式到開發板上並脫機運行(注:eCos 工程不能用 RedBoot 除錯),觀察 LED1~LED4 依次點亮。
2940/2942/2944/2945 http://www.unsp.com E-mail:unsp@sunplus.com.cn
1 eCos 基礎實驗
Tel:010-62981113-2940/2942/2940/2945 http://www.unsp.com
E-mail:unsp@sunplus.com.cn 7
【範例路徑】
在大學計畫網站(score.unsp.com)或者 32 位元嵌入式開發系統光碟都會提供本實驗的參考程 式,路徑如下:
\Example_eCos_Board\1.Kernel_Exa\ex01_Run_LED