【iCore4 雙核心板_uC/OS-II】例程五:訊號量——共享資源

XiaomaGee發表於2018-02-06

一、實驗說明:

  訊號量是作業系統中的一類事件,是實現任務間通訊的一箇中間環節。當系統中的多個任務

在執行時,經常需要互相無衝突地訪問同一個資源,或者需要互相支援的依賴,甚至有時還要互

相加以必要的限制的制約才保證任務的順利進行。訊號量就像是一種上鎖機制,一旦執行至上鎖

程式碼段則一直等待,直到獲得相應的鑰匙才能進入被鎖部分的程式碼。使用訊號量的最初目的是為了

給共享資源設立一個標誌,該標誌表示共享資源的佔用情況。當一個任務在訪問共享資源之前,就

可以先對這個標誌進行查詢,從而在瞭解資源被佔用的情況之後,再來準定自己的行為。

二、實驗截圖:

三、原始碼下載連結:

連結:https://pan.baidu.com/s/1eSQ6IXW 密碼:vg2c

四、核心程式碼:

/*
 * Name                : main
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
/*實驗現象:
  紅燈和綠燈同時以固定頻率閃爍,開啟串列埠工具,可以看到有資料顯示。
  */
int main(void)
{
    system_clock.initialize();                               //系統時鐘初始化
    led.initialize();                                        //LED初始化
    usart6.initialize(115200);                               //串列埠初始化
    usart6.printf("\x0c");                                   //清屏    
    usart6.printf("\033[1;32;40m");                          //設定字型終端為綠色
    usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n");

    OSInit(); 

    //UCOS初始化
    OSTaskCreate(start_task,                                 //建立開始任務
            (void*)0,                                   //任務引數
            (OS_STK*)&START_TASK_STK[START_STK_SIZE-1], //任務堆疊
            START_TASK_PRIO);                           //任務優先順序
    OSStart();                                               //開啟UCOS    
}
/*
 * Name                : start_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void start_task(void *pdata)
{
    OS_CPU_SR cpu_sr;

    TaskSem = OSSemCreate(1);        //建立訊號量    

    OSStatInit();//初始化統計任務

    OS_ENTER_CRITICAL();//關中斷

    OSTaskCreate(AppTask1_task,(void*)0,(OS_STK*)&AppTask1_TASK_STK[AppTask1_STK_SIZE-1],AppTask1_TASK_PRIO);//建立AppTask1任務
    OSTaskCreate(AppTask2_task,(void*)0,(OS_STK*)&AppTask2_TASK_STK[AppTask2_STK_SIZE-1],AppTask2_TASK_PRIO);//建立AppTask2任務
    OSTaskSuspend(OS_PRIO_SELF);//掛起start_task任務

    OS_EXIT_CRITICAL();//開中斷
}
/*
 * Name                : led0_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void AppTask1_task(void *pdata)
{
    u8 err;
    unsigned char task1_mes[60] = "The first task is running and the red LED is flashing!"; //任務一執行的資訊

    while(1){
        usart6.printf("\r\n TASK 1:\r");
        OSSemPend(TaskSem,0,&err); //請求訊號量      
        memcpy(array, task1_mes, sizeof(task1_mes));                                      //將任務一資訊放到共享資源中
        usart6.printf("\r\n %s\r",array);        
        OSSemPost(TaskSem);        //傳送訊號量

        LED_RED_ON;                //紅燈亮
        OSTimeDlyHMSM(0,0,0,500);  //延時500ms
        LED_RED_OFF;               //紅燈滅
        OSTimeDlyHMSM(0,0,0,500);  //延時500ms            
    }
}
/*
 * Name                : led_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void AppTask2_task(void *pdata)
{
    u8 err;
    unsigned char task2_mes[60] = "The second task is running and the green LED is flashing!"; //任務一執行的資訊

    while(1){    
        usart6.printf("\r\n TASK 2:\r");
        OSSemPend(TaskSem,0,&err); //請求訊號量            
        memcpy(array, task2_mes, sizeof(task2_mes));//將任務二資訊放到共享資源中
        usart6.printf("\r\n %s\r",array);

        OSSemPost(TaskSem);        //傳送訊號量    

        LED_GREEN_ON;               //綠燈亮
        OSTimeDlyHMSM(0,0,0,1000);  //延時1000ms
        LED_GREEN_OFF;              //綠燈滅
        OSTimeDlyHMSM(0,0,0,1000);  //延時1000ms
    }
}

iCore4連結:

相關文章