菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
447
0

【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步

原创
05/13 14:22
阅读数 47568

一、实验说明:

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

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

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

二、实验截图:

三、源代码下载链接:

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

发表评论

0/200
447 点赞
0 评论
收藏
为你推荐 换一批