【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源

本文介绍了一个基于UCOS操作系统的信号量应用实例,通过两个任务交替控制红绿灯的闪烁,演示了信号量如何协调任务间的资源访问。代码实现了任务间的同步,并确保资源的正确共享。

一、实验说明:

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

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

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

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

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

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

二、实验截图:

三、源代码下载链接:

链接: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("\033[1;32;40m");                          //设置字体终端为绿色
    usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n");

    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("\r\n TASK 1:\r");
        OSSemPend(TaskSem,0,&err); //请求信号量      
        memcpy(array, task1_mes, sizeof(task1_mes));                                      //将任务一信息放到共享资源中
        usart6.printf("\r\n %s\r",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("\r\n TASK 2:\r");
        OSSemPend(TaskSem,0,&err); //请求信号量            
        memcpy(array, task2_mes, sizeof(task2_mes));//将任务二信息放到共享资源中
        usart6.printf("\r\n %s\r",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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值