您的位置 首页 5G

STM32 uCOS_II 实践 之 事情标识组

在中断的那一章节里介绍了计数信号量,它可以有效的传递一个二值信号,而时间标识组是多个信号量运算后作用与一个任务的工具。主要应用场合…

在中止的那一章节里介绍了计数信号量,它能够有用的传递一个二值信号,而时刻标识组是多个信号量运算后效果与一个使命的东西。首要使用场合是两个以上的使命来同步一个使命。

在这儿ucos的运转进程应该都有必定的了解了,对信号量传递的进程能够检查别的一个帖子,这儿只重视事情标识组自身。

首要运用事情标识组需求四个过程:

  1. 声明一个标识组指针变量,
    
    

    void *SemGrp_Task_LED1;

    这个里边寄存的是事情操控块的指针,而且是一个大局的变量,需求在对应的头文件里进行大局声明(extern),在对标识组进行初始化的时分,也便是对事情操控块的初始化,事情操控块是办理和分配这个资源的模块;
  2. 初始化事情标识组,
    
    

    SemGrp_Task_LED1 = OSFlagCreate(0,&err);

    参数0为终究逻辑运算的成果初始值为0,参数&err为过错信息;
  3. 在用户使命里设置等候函数,
    
    

    OSFlagPend( SemGrp_Task_LED1, // 标识组指针
    0x03, // 标识为后两位
    OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME,// 设置与操作而且操作后铲除标识
    0,&err // 无等候超时
    );

    总共有5个参数,第一个参数设置标识组指针,阐明等候的是哪个标识组;第二个参数是标识组里有哪些操作位,0x03便是阐明有2个信号量参加这个组而且是一个字节的最低两位;第三个参数是这些信号量由哪种组合方法来构成一个有用的信息,就两种操作“与”和“或”,即一切单个信号量都为1时才触发或许是只需有一个信号量发送1就触发,对应的还有一个操作联系便是在操作后对单个信号量进行清零;第四个参数是等候时刻,单位是体系心跳数,0便是指无时刻约束的等候;第五个参数是过错类型。
  4. 在不同的用户使命里或许触发使命里设置发送信号量函数,
    
    

    OSFlagPost(SemGrp_Task_LED1,0x01,OS_FLAG_SET,&err);// 置位组标志位的第一位

    总共有四个参数,第一个参数为标识组指针,阐明你是发到哪个标识组里的;第二个参数阐明你操作的是第几位,在等候函数里设置了详细的有用位,在发送函数里阐明你发送的这一位是等候函数里的第几位,代码比如里是发送的最低位;第三个参数是设置置一仍是清零,OS_FLAG_SET为置一,OS_FLAG_CLR为清零;第四个参数是过错类型。


=====================================================================================
下面是在体系内部实践的代码:
过程2及过程3


void Task_LED1(void* p_arg)
{
(void) p_arg ;

SemGrp_Task_LED1 = OSFlagCreate(0,&err);
while(1)
{
OSFlagPend( SemGrp_Task_LED1, // 标识组指针
0x03, // 标识为后两位
OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME, // 设置与操作而且操作后铲除标识
0,&err // 无等候超时
);

LED1_HIGH;
OSTimeDlyHMSM(0,0,1,0);
LED1_LOW;
OSTimeDlyHMSM(0,0,1,0); // 延时,用来给其他使命留有运转的时刻
}
}

两个 过程4函数,别离在外部中止服务函数里:


void Interrupt_Handle_KEY2(void)
{
OSIntEnter();

// 在中止服务函数里假如调用ucos体系函数的话就必须加进步中止体系函数出去的时分要加上出中止体系函数

OSFlagPost(SemGrp_Task_LED1,0x01,OS_FLAG_SET,&err); // 置位组标志位的第一位
EXTI_ClearITPendingBit(EXTI_Line4); // 铲除标志位

OSIntExit();
}




void Interrupt_Handle_KEY3(void)
{
OSIntEnter();

// 在中止服务函数里假如调用ucos体系函数的话就必须加进步中止体系函数出去的时分要加上出中止体系函数

OSFlagPost(SemGrp_Task_LED1,0x02,OS_FLAG_SET,&err); // 置位组标志位的第二位
EXTI_ClearITPendingBit(EXTI_Line3); // 铲除标志位

OSIntExit();
}


总结:
关于事情标识组的操作,思路是十分简略的,在一个终究成果的使命里增加等候函数,体系运转到这儿会把这个使命挂起,然后依照逻辑去等候各个单一的信号量,在其他的使命里有发送函数,依照等候函数里设定好的操作位去把各个位去置高或许拉低,就能到达多个使命去同步一个使命的意图。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/5g/252255.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部