• 【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链接:

  • 相关阅读:
    Tomcat环境配置
    MySQL免安装版下载与配置
    CentOS6.5下连网以及输入法下载
    eclipse中编写运行c/c++
    eclipse中实现文本换行
    Tomcat调优及压力测试
    Tomcat调优
    Java的垃圾收集器
    GC中常见的算法
    使用VisualJVM连接远程tomcat
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/8425048.html
Copyright © 2020-2023  润新知