zoukankan      html  css  js  c++  java
  • 【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源

    一、实验说明:

      信号量是操作系统中的一类事件,是实现任务间通信的一个中间环节。当系统中的多个任务

    在运行时,经常需要互相无冲突地访问同一个资源,或者需要互相支持的依赖,甚至有时还要互

    相加以必要的限制的制约才保证任务的顺利进行。信号量就像是一种上锁机制,一旦执行至上锁

    代码段则一直等待,直到获得相应的钥匙才能进入被锁部分的代码。使用信号量的最初目的是为了

    给共享资源设立一个标志,该标志表示共享资源的占用情况。当一个任务在访问共享资源之前,就

    可以先对这个标志进行查询,从而在了解资源被占用的情况之后,再来准定自己的行为。

    二、实验截图:

    三、源代码下载链接:

    链接: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("33[1;32;40m");                          //设置字体终端为绿色
        usart6.printf("
     Hello, I am iCore4!
    
    ");
    
        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("
     TASK 1:
    ");
            OSSemPend(TaskSem,0,&err); //请求信号量      
            memcpy(array, task1_mes, sizeof(task1_mes));                                      //将任务一信息放到共享资源中
            usart6.printf("
     %s
    ",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("
     TASK 2:
    ");
            OSSemPend(TaskSem,0,&err); //请求信号量            
            memcpy(array, task2_mes, sizeof(task2_mes));//将任务二信息放到共享资源中
            usart6.printf("
     %s
    ",array);
    
            OSSemPost(TaskSem);        //发送信号量    
    
            LED_GREEN_ON;               //绿灯亮
            OSTimeDlyHMSM(0,0,0,1000);  //延时1000ms
            LED_GREEN_OFF;              //绿灯灭
            OSTimeDlyHMSM(0,0,0,1000);  //延时1000ms
        }
    }

    iCore4链接:

  • 相关阅读:
    DOS命令
    vim学习
    Python学习笔记小结之猜数字游戏
    Python学习笔记函数之异常处理
    Python学习笔记函数之global语句
    Python学习笔记函数之局部和全局作用域
    Python学习笔记函数之关键字参数和print()
    Python学习笔记函数之None值
    Python学习笔记函数之返回值和return语句
    Python学习笔记函数之def语句和参数
  • 原文地址:https://www.cnblogs.com/xiaomagee/p/8420733.html
Copyright © 2011-2022 走看看