ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

UCOSIII 信号量 的使用和区别

2020-09-22 16:04:32  阅读:508  来源: 互联网

标签:OPT UCOSIII err 区别 信号量 SEM OS POST


1. 一般信号量 共享资源 同时访问 

    定义 : OS_SEM MY_SEM

    创建 :OSSemCreate( (OS_SEM *) &MY_SEM,

                                            (CPU_CHAR*) "MY_SEM",

            (OS_SEM_CTR)1,   // 重要 创建1个信号量 0 的话必须先发送一个信号量 才能请求

            (OS_ERR* )&err);

  使用 :OSSemPend("信号量地址",“超时tick 默认是5ms的倍数”,OS_OPT_PEND_BLOCKING (没请求到信号量任务挂起),0(时间戳),&err)

            OS_OPT_PEND_NON_BLOCKING   (没请求到信号量任务不挂起)

   OS_OPT_PEND_BLOCKING   (没请求到信号量任务挂起)

         释放信号量   OSSemPost (&MY_SEM,OS_OPT_POST_1,&err); //发送信号量 

              * OS_OPT_POST_1 POST and ready only the highest priority task waiting on semaphore (if tasks are waiting).  仅等待的最高级别的一个任务

          * OS_OPT_POST_ALL POST to ALL tasks that are waiting on the semaphore   所有等待该信号量的任务 
          * OS_OPT_POST_NO_SCHED Do not call the scheduler   不引起任务调度
          * Note(s): 1) OS_OPT_POST_NO_SCHED can be added with one of the other options.

2,任务同步信号量  

    

    创建 :OSSemCreate( (OS_SEM *) &MY_SEM,

                                            (CPU_CHAR*) "MY_SEM",

            (OS_SEM_CTR)0,   // 重要 

            (OS_ERR* )&err);

     发送 信号量 :-----》OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);  //发送信号量 

    等待的任务 --------》OSSemPend(&SYNC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); //请求信号量  

               接收到信号量  开始工作  创建的 默认信号量是0 所以一般 工作信号量  超时都是 0  就是 没有发送信号量就阻塞 在这里

3 互斥信号量  解决 优先级反转 的问题 (只能 发一个信号量) 多个信号 要创建多个 对象  (低优先级在执行时候被打断 ,在其他需要使用信号量的 高优先级的任务在使用信号量时候会自动提升 低优先级的任务 执行完 释放信号量,高优先级的会继续执行)

                     OS_MUTEX TEST_MUTEX; //定义一个互斥信号量      

      //创建一个互斥信号量
      OSMutexCreate((OS_MUTEX* )&TEST_MUTEX,
              (CPU_CHAR* )"TEST_MUTEX",
              (OS_ERR* )&err);

    使用          //请求互斥信号量

      OSMutexPend (&TEST_MUTEX,0,OS_OPT_PEND_BLOCKING,0,&err);   //超时是0  没请求到会一直等待

      {    任务1  。。。} 

      //释放互斥信号量

      OSMutexPost(&TEST_MUTEX,OS_OPT_POST_NONE,&err);

 4.任务内嵌 信号量   task 创建的任务自带的 不用创建 直接 发送和请求 就行

      当前任务只能 请求自己的信号量 ,可以给其他任务发送信号量 

//任务2的任务函数
void task2_task(void *p_arg)
{	
	u8 num;
	OS_ERR err;
	while(1)
	{ 
		OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err);		//请求任务内建的信号量   只能是自己的 
		num++;
		LCD_ShowxNum(150,111,Task2_TaskTCB.SemCtr,3,16,0);	//显示任务内建信号量值
		LCD_Fill(6,131,233,313,lcd_discolor[num%14]);		//刷屏
		LED1=!LED1;
		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
	}
}

 

//任务1的任务函数
void task1_task(void *p_arg)
{
    u8 key;
    u8 num;
    OS_ERR err;
    while(1)
    {
        key = KEY_Scan(0);  //扫描按键
        if(key==WKUP_PRES)    
        {
            OSTaskSemPost(&Task2_TaskTCB,OS_OPT_POST_NONE,&err);//使用系统内建信号量向任务task2发送信号量
            LCD_ShowxNum(150,111,Task2_TaskTCB.SemCtr,3,16,0);  //显示信号量值
        }
        num++;
        if(num==50)
        {
            num=0;
            LED0=!LED0;
        }
        OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);      //延时10ms
    }
}

 

 

 

 

 

 

 

 

                           

 

标签:OPT,UCOSIII,err,区别,信号量,SEM,OS,POST
来源: https://www.cnblogs.com/mrguoguo/p/13712456.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有