在中断的那一章节里介绍了计数信号量,它可以有效的传递一个二值信号,而时间标识组是多个信号量运算后作用与一个任务的工具。主要应用场合是两个以上的任务来同步一个任务。
在这里ucos的运行过程应该都有一定的了解了,对信号量传递的过程可以查看另外一个帖子,这里只关注事件标识组本身。
首先运用事件标识组需要四个步骤:
- 声明一个标识组指针变量,
void *SemGrp_Task_LED1;
这个里面存放的是事件控制块的指针,并且是一个全局的变量,需要在对应的头文件里进行全局声明(extern),在对标识组进行初始化的时候,也就是对事件控制块的初始化,事件控制块是管理和调配这个资源的模块;
-
初始化事件标识组,
SemGrp_Task_LED1 = OSFlagCreate(0,&err);
参数0为最终逻辑运算的结果初始值为0,参数&err为错误信息;
-
在用户任务里设置等待函数,
OSFlagPend( SemGrp_Task_LED1, // 标识组指针
0x03, // 标识为后两位
OS_FLAG_WAIT_SET_ALL + OS_FLAG_CONSUME, // 设置与操作并且操作后清除标识
0,&err // 无等待超时
);
总共有5个参数,第一个参数设置标识组指针,说明等待的是哪个标识组;第二个参数是标识组里有哪些操作位,0x03就是说明有2个信号量参与这个组并且是一个字节的最低两位;第三个参数是这些信号量由哪种组合方式来形成一个有效的信息,就两种操作“与”和“或”,即所有单个信号量都为1时才触发或者是只要有一个信号量发送1就触发,对应的还有一个操作关系就是在操作后对单个信号量进行清零;第四个参数是等待时间,单位是系统心跳数,0就是指无时间限制的等待;第五个参数是错误类型。
-
在不同的用户任务里或者触发任务里设置发送信号量函数,
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();
}
总结:
对于事件标识组的操作,思路是非常简单的,在一个最终结果的任务里添加等待函数,系统运行到这里会把这个任务挂起,然后按照逻辑去等待各个单一的信号量,在其他的任务里有发送函数,按照等待函数里设定好的操作位去把各个位去置高或者拉低,就能达到多个任务去同步一个任务的目的。
关键字:STM32 uCOS 事件标识组
引用地址:
STM32 uCOS_II 实践 之 事件标识组
推荐阅读最新更新时间:2024-03-16 15:13
STM32中USART常用的发送函数
1.中断模式 void USART2_IRQHandler(void) //串口2中断服务程序 { u8 u8Temp; /*****************发送中断************************************/ if (USART_GetITStatus(USART2, USART_IT_TXE) == SET) { if(TX2_cn == TX2_no) { DIS_485TX(); USART_ITConfig(USART2, USART_IT_TXE, DISABLE); USART_ITConfig(USART2, USART_IT_RXNE, EN
[单片机]
在S3C44B0上的μCOS-II中实现CAN总线智能节点
在系统越来越复杂,功能越来越强大的今天,嵌入式系统的设计中采用实时多任务操作系统已经成为嵌入式应用设计的主流。μCOS-II是一个开源嵌入式实时操作系统(Real TIme OperaTIng System, RTOS),它已经被成功移植到各种CPU上。但是基于μCOS-II的应用软件需要在移植操作系统后自行完成。模块化的应用程序设计可以使得嵌入式设计变得更加方便,产品的开发更加迅速。S3C44B0是三星公司生产的一种ARM7芯片,性能强大,在通用嵌入式设计中运用广泛。CAN总线(Control Area Network)是一种有效支持分布式控制和实时控制的现场总线,由于其高性能和高可靠性,CAN总线的应用范围广布过程工业、机器人
[单片机]
μC/OS-II实时操作系统内存管理的改进
C/OS-II是一种开放源码的实时操作系统,具有抢先式、多任务的特点,已被应用到众多的微处理器上。虽然该内核功能较多,但还是有不甚完善的地方。笔者在分析使用中发现,内核在任务管理(包括任务调度、任务间的通信与同步)和中断管理上是比较完善的,具有可以接受的稳定性和可靠性;但在内存管理上显得过于简单,内存分区的建立方式有不合理之处。 1 内存管理不足之处的分析 在分析许多 C/OS-II的应用实例中发现,任务栈空间和内存分区的创建采用了定义全局数组的方法,即定义一维或二维的全局数组,在创建任务或内存分区时,将数组名作为内存地址指针传递给生成函数。这样实现起来固然简单,但是不够灵活有效。 编译器会将全局数组作为未初始化的全局变量,放
[单片机]
STM32 中断实现的程序步骤
本程序实现的功能:将GPIO.13端口设置成下降沿触发中断,当中断事件发生后,与GPIOD.8相连的LED变亮。 步骤: ① 配置要使用到的端口的时钟,输入输出以及端口的第二功能(这里的第二功能是指把端口配置成EXTI口) void GPIO_Configuration(void) { /* Configure PC13 as input floating (EXTI Line13) */ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = G
[单片机]
STM32关于使用定时器触发ADC转换的解决办法和详细说明
以STM32 ADC的常规通道为例(注入通道类似): 如上图,STM32 ADC的常规通道可以由以上6个信号触发任何一个,我们以使用TIM2_CH2触发ADC1,独立模式,每次仅测一条通道,则ADC的配置如下:(以下代码使用STM32固件库V3.5) void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; //关闭通道扫描模式 ADC_InitStructur
[单片机]
电动汽车快速充电机监控终端的设计
0 引言 随着国家对新能源技术的大力扶持,电动汽车逐渐成为国家在新能源汽车产业大力发展的对象,而电动汽车充电站、快速充电机是电动汽车大规模化后不可或缺的服务基础设施之一。大量分布于各住宅小区、停车场的电动汽车用非车载智能快速充电机,实现高效、安全、智能化的管理必定成为主流。针对目前快速充电机群实行无人值守的运行情况,这就要求快速充电机须具有较高的可靠性和自动化程度,功能更加完善,可远程维护等功能。 这样,使得分布式、模块化、智能化成为快速充电机的发展方向,而高性能、低成本的充电机监控终端是其中的关键技术。为管理区域多台充电机的资源优化利用与管理的智能化,监控终端与Internet网的交互成为一种必然。 1 监
[单片机]
STM32_按键中断
*************************************************************************************************************************************** 开发板 :奋斗STM32 CPU :STM32F103 开发环境:keil uVsion4 *****************************************************************************************************************************
[单片机]
基于μC/OS-II的显示控制系统开发
引 言
随着性能的提高和价格的降低,越来越多的嵌入式应用采用了ARM处理器。在强大功能及丰富外设的支持下,嵌入式实时操作系统凭借较高的开发效率、可维护性和可靠性成为开发设计的理想选择。
μC/OS-II是一个完整的、可移植、可裁减的占先式实时多任务内核。它是用ANSI C语言编写的,包含一小部分汇编语言代码,可以供不同架构的微处理器使用。μC/OS由美国人Jean J.Labrosse于1992年完成,1998年发展到μC/OS-II,目前的版本为μC/OS-II v2.83。2000年,μC/OS得到美国航空管理局(FAA)的认证,可以用于飞行器中。作为一个典型的嵌入式操作系统,μC/OS-II的应用非常
[嵌入式]