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

原文地址:https://www.cnblogs.com/xiaomagee/p/8420733.html