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

1、實驗說明:函數

  信號量是一個多任務內核提出的一個協議機構,上一個實驗中咱們介紹了信號量訪問共享資源工具

的功能,其實信號量最初是用來控制訪問共享資源的,它還能夠用來同步一箇中斷服務函數和一個任字體

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

2、實驗截圖:
code

3、源代碼下載連接:htm

連接:https://pan.baidu.com/s/1bpUaFmB 密碼:dwreblog

4、核心代碼:ip

/*
 * 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連接:資源

相關文章
相關標籤/搜索