【iCore4 雙核心板_uC/OS-II】例程六:訊號量——任務同步

XiaomaGee發表於2018-02-07

一、實驗說明:

  訊號量是一個多工核心提出的一個協議機構,上一個實驗中我們介紹了訊號量訪問共享資源

的功能,其實訊號量最初是用來控制訪問共享資源的,它還可以用來同步一箇中斷服務函式和一個任

務,或者同步一個任務和另一個任務。

二、實驗截圖:

三、原始碼下載連結:

連結:https://pan.baidu.com/s/1bpUaFmB 密碼:dwre

四、核心程式碼:

/*
 * Name                : main
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
/*實驗現象:
  開啟串列埠工具putty.exe,終端顯示此時訊號量的值為0,按下ARM.KEY後,訊號量的值每隔500ms增加1,
  當鬆開ARM.KEY後,訊號量的值開始減小,綠色ARM.LED開始閃爍,知道訊號量的值減小為0,綠色LED熄滅。
  */
int main(void)
{
    system_clock.initialize();                               //系統時鐘初始化
    led.initialize();                                        //LED初始化
    usart6.initialize(115200);                               //串列埠初始化
    key.initialize();

    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                : AppTask1_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void AppTask1_task(void *pdata)
{
    while(1){
        if(ARM_KEY_STATE == KEY_DOWN){
            OSSemPost(TaskSem);                                           //傳送訊號量    
        }
        usart6.printf("\x0c");                                           //清屏    
        usart6.printf("\033[1;32;40m");                                  //設定字型終端為綠色
        usart6.printf("\r\n Hello, I am iCore4!\r\n\r");
        usart6.printf("\r\n The value of Sem: %d\r",TaskSem->OSEventCnt);//列印出訊號量的值    
        OSTimeDlyHMSM(0,0,0,500);                                        //延時500ms        
    }
}
/*
 * Name                : AppTask2_task
 * Description         : ---
 * Author              : liu.
 *
 * History
 * --------------------
 * Rev                 : 0.00
 * Date                : 07/12/2017
 * 
 * create.
 * --------------------
 */
void AppTask2_task(void *pdata)
{
    u8 err;

    while(1){    
        if(ARM_KEY_STATE == KEY_UP){
            OSSemPend(TaskSem,0,&err); //請求訊號量                
            LED_GREEN_ON;              //綠燈亮
            OSTimeDlyHMSM(0,0,0,500);  //延時500ms
            LED_GREEN_OFF;             //綠燈滅
            OSTimeDlyHMSM(0,0,0,500);  //延時500ms
        }else{
            OSTimeDlyHMSM(0,0,0,500);  //延時1000ms
        }
    }
}

iCore4連結:

相關文章