1、打開S+core IDE,使用“S+core IDE eCos Project"範本採用預設設置新建一個專案;
2、刪除專案資料夾目錄下的“default_install"資料夾;
3、打開eCos config tool,使用預設範本建立源碼包,並添加“File IO", “IOB support for Score SPCE3200"兩個 packages
4、以“default.ecc"為檔案名將eCos範本保存至專案目錄下並將其編譯;
5、編寫程式;
6、修改、編譯(Rebuild All)直到沒有任何錯誤;
7、執行程式觀察運行結果
//============================================================
//程式功能:
// 創造多執行緒使LED1,LED2,LED3以不同頻率閃爍
//============================================================
#include <cyg/kernel/kapi.h>
#include <stdio.h>
#include <cyg/fileio/fileio.h>
#include <cyg/io/spce3200_iob.h>
#include <unistd.h>
#define C_LED1 0x20 // 定義常量,IOB對應的LED燈
#define C_LED2 0x10
#define C_LED3 0x08
#define C_LED4 0x04
//IOB口輸出使能
#define C_IOB2_OUT_EN 0x00000400 // P_IOB_GPIO_SETUP
#define C_IOB3_OUT_EN 0x00000800 // P_IOB_GPIO_SETUP
#define C_IOB4_OUT_EN 0x00001000 // P_IOB_GPIO_SETUP
#define C_IOB5_OUT_EN 0x00002000 // P_IOB_GPIO_SETUP
cyg_int32 fd_LED; // 驅動控制碼
cyg_uint32 LED_Value; // 全域變數,從IOB輸出的值
cyg_uint8 Stack[3][4096]; // 執行緒用到的堆疊
cyg_handle_t Thread_Handle[3]; // 執行緒控制碼
cyg_thread Thread_Info[3]; // 執行緒訊息結構體
//====================================================
// 語法格式:void thread1(cyg_addrword_t data)
// 功能描述: 執行緒1控制D12每秒鐘閃爍一次
//====================================================
void thread1(cyg_addrword_t data) // 執行緒1
{
printf(" thread1 start\n");
while(1)
{
cyg_scheduler_lock(); // 調度器鎖定,因為下面要操作全域變數
LED_Value |= C_LED2; // 操作全域變數
cyg_scheduler_unlock(); // 調度器解鎖
write(fd_LED, &LED_Value, 1); // 從IOB驅動輸出,點亮LED2
cyg_thread_delay(50); // 延時500ms
cyg_scheduler_lock(); // 調度器鎖定,因為下面要操作全域變數
LED_Value ^= C_LED2; // 操作全域變數,熄滅LED2
cyg_scheduler_unlock(); // 調度器解鎖
write(fd_LED, &LED_Value, 1); // 熄滅LED2
cyg_thread_delay(50); // 延時500ms
}
}
//====================================================
// 語法格式:void thread2(cyg_addrword_t data)
// 功能描述: 執行緒2控制LED1每兩秒鐘閃爍一次
//====================================================
void thread2(cyg_addrword_t data)
{
printf("thread2 start\n");
while(1)
{
cyg_scheduler_lock(); // 調度器鎖定,因為下面要操作全域變數
LED_Value |= C_LED1; // 操作全域變數,點亮LED1
cyg_scheduler_unlock(); // 調度器解鎖
write(fd_LED, &LED_Value, 1); // 點亮LED1
cyg_thread_delay(100); // 延時1000ms
cyg_scheduler_lock(); // 調度器鎖定,因為下面要操作全域變數
LED_Value ^= C_LED1; // 操作全域變數,熄滅LED1
cyg_scheduler_unlock(); // 調度器解鎖
write(fd_LED, &LED_Value, 1); // 熄滅LED1
cyg_thread_delay(100); // 延時1000ms
}
}
//====================================================
// 語法格式:void MainThread(cyg_addrword_t data)
// 功能描述: 執行緒MainThread控制LED3每半秒鐘閃爍一次
//====================================================
void MainThread(cyg_addrword_t data)
{
int Key;
printf("MainThread thread start\n");
fd_LED = open("/dev/iob", O_RDWR|O_NONBLOCK); // 打開IOB驅動
Key = C_IOB2_OUT_EN
| C_IOB3_OUT_EN
| C_IOB4_OUT_EN
| C_IOB5_OUT_EN
;
cyg_fs_fsetinfo(fd_LED, CYGNUM_DEVS_IOB_SPCE3200_ATTRIB, &Key, 4); // 初始化IOB
while(1)
{
cyg_scheduler_lock(); // 調度器鎖定,因為下面要操作全域變數
LED_Value |= C_LED3; // 操作全域變數,點亮LED3
cyg_scheduler_unlock(); // 調度器解鎖
write(fd_LED, &LED_Value, 1); // 點亮LED3
cyg_thread_delay(25); // 延時250ms
cyg_scheduler_lock(); // 調度器鎖定,因為下面要操作全域變數
LED_Value ^= C_LED3; // 操作全域變數,熄滅LED3
cyg_scheduler_unlock(); // 調度器解鎖
write(fd_LED, &LED_Value, 1); // 熄滅LED3
cyg_thread_delay(25); // 延時250ms
}
}
//====================================================
// 語法格式:void cyg_user_start(void)
//====================================================
void cyg_user_start(void)
{
cyg_thread_create( 10, // 創建執行緒MainThread
MainThread,
0,
"MainThread",
(void *)Stack[0],
4096,
&Thread_Handle[0],
&Thread_Info[0]);
cyg_thread_create( 10, // 創建執行緒Thread1
thread1,
0,
"Thread1",
Stack[1],
4096,
&Thread_Handle[1],
&Thread_Info[1]);
cyg_thread_create( 10, // 創建執行緒Thread2
thread2,
0,
"Thread2",
&Stack[2],
4096,
&Thread_Handle[2],
&Thread_Info[2]);
cyg_thread_resume(Thread_Handle[0]);
// 恢復執行緒MainThread運行
cyg_thread_resume(Thread_Handle[1]);
// 恢復執行緒Thread1運行
cyg_thread_resume(Thread_Handle[2]);
// 恢復執行緒Thread2運行
return;
}