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;

}

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 pixnote21 的頭像
    pixnote21

    pixnote21的隨手筆記

    pixnote21 發表在 痞客邦 留言(0) 人氣()