zoukankan      html  css  js  c++  java
  • 【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步

    一、实验说明:

      信号量是一个多任务内核提出的一个协议机构,上一个实验中我们介绍了信号量访问共享资源

    的功能,其实信号量最初是用来控制访问共享资源的,它还可以用来同步一个中断服务函数和一个任

    务,或者同步一个任务和另一个任务。

    二、实验截图:

    三、源代码下载链接:

    链接: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("33[1;32;40m");                                  //设置字体终端为绿色
            usart6.printf("
     Hello, I am iCore4!
    
    ");
            usart6.printf("
     The value of Sem: %d
    ",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链接:

  • 相关阅读:
    Aizu 0033
    Aizu 0118
    【思维】贪心+细节——cf1361B
    【思维】构造+凸包+向量叉积——LEETCODE 游乐园的迷宫
    【思维】三元环计数+鸽笼定理/贪心——LEETCODE 游乐园的游览计划 好题
    dp+线性筛——LEETCODE切分数组
    【经典】带障碍的铺砖块——LEETCODE 覆盖
    【思维】树形dp+构造——leetcode二叉树任务调度
    【思维】状压dp—— 2020 联想杯 M
    【思维】建图+排列组合+预处理+最短路—— 2020 联想杯 E
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/8425048.html
Copyright © 2011-2022 走看看