FreeRTOS 事件组

2023-10-26

实现功能,当任务A,B完成后执行串口任务。

不同任务用不同的位表示

configUSE_16_BIT_TICKS=1,bitx(0~7);

configUSE_16_BIT_TICKS设置为0 ,bitx(0~23);

//串口任务的头文件
#ifndef __TRANSMIT_H
#define __TRANSMIT_H

#include "cmsis_os.h"
#include "UsartDMA.h"
#include <string.h>
#include <stdarg.h>
#include <stdio.h>

#define MY_BIT0 (1 << 0)  // 定义自己的BIT0为二进制数的最低位
#define MY_BIT1 (1 << 1)  // 定义自己的BIT1为二进制数的次低位

extern TaskHandle_t Transmit_Handle;

extern void Transmit_Task( void *pvParameters );
extern TaskHandle_t Recive_Handle;
extern void Recive_Task( void *pvParameters );

extern EventGroupHandle_t Event_Test;
#include "Transmit.h"

//创建事件组句柄
EventGroupHandle_t Event_Test;

TaskHandle_t Transmit_Handle;
TaskHandle_t Recive_Handle;

void Transmit_Task( void *pvParameters )
{
		UsartIDLE_Init();
        //创建事件组
	    Event_Test = xEventGroupCreate();
		for( ;; )
		{
			//Wait Event
			EventBits_t xEventBits = xEventGroupWaitBits(Event_Test, MY_BIT0 | MY_BIT1, pdTRUE, pdTRUE, portMAX_DELAY);
			
			/* 判断任务一和任务二的事件是否都已经完成 不加if效果相同*/
			if ((xEventBits & (MY_BIT0 | MY_BIT1)) == (MY_BIT0 | MY_BIT1)) {
				print_usart1("Transmit_Task ok\r\n");
				
				osDelay(1);
			}
//			else {
//					/* 等待任务一和任务二的事件完成通知超时 */
//				
//			}

		}
}

用来等待事件的函数,可以等待个或者多位。

EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
                const EventBits_t uxBitsToWaitFor,
                const BaseType_t xClearOnExit,
                const BaseType_t xWaitForAllBits,
                TickType_t xTicksToWait );

xEventGroup :等待的事件组

uxBitsToWaitFor:哪些位


xClearOnExit :pdTRUE: 清除uxBitsToWaitFor指定的位 ;pdFALSE: 不清除

(一般清除)

xWaitForAllBits:pdTRUE: 等待的位,bit全部为1; pdFALSE: 等待的位,其中一bit为1

(用来判断条件位数是否达成)

AB两个任务其他无关代码删除,保留框架


void OLED_Task( void *pvParameters )
{
	//创建存放队列的数据和返回标志位

		for( ;; )
		{
	
			//设置位

			xEventGroupSetBits(Event_Test, MY_BIT0);
			print_usart1("Oled_Task ok\r\n");
			
			osDelay(200);
		}
}

void Sensor_Task( void *pvParameters )
{

		for( ;; )
		{

			xEventGroupSetBits(Event_Test, MY_BIT1);
			print_usart1("Sensor_Task ok\r\n");
			
			osDelay(200);
		}
}

为了查看效果把串口任务优先级设置为最高,其他比串口低,阻塞时间相同

不知道这样使用方法对不对 

后面更新以前调试过的任务通知功能。 

补充 单个事件组触发

//传感器检测任务
void Sensor_Task( void *pvParameters )
{
	//创建任务通知
		Event_Child = xEventGroupCreate();
	
		for( ;; )
		{
			
			Child_Check=LDOUT_IN;
			
			//高电平雷达检测到人,标志位置高,任务标志Set
			if(Child_Check==1)
				xEventGroupSetBits(Event_Child, MY_BIT0);
			
			else
				xEventGroupClearBits(Event_Child, MY_BIT0);
				

			
			//任务进入阻塞时间 100ms
			//传感器检测1秒刷新一次
			osDelay(100);
			uxHighWaterMark_Sensor = uxTaskGetStackHighWaterMark( NULL );
		}
}

EventBits_t xEventBits;
uint8_t a=0;
//报警任务
void Sound_Play( void *pvParameters )
{
		for( ;; )
		{
			
			//形参:事件组句柄  事件组位 完成清零 所有事件触发    等待时间
			xEventBits= xEventGroupWaitBits(Event_Child, MY_BIT0, pdTRUE, pdTRUE, 100);
			
			/* 判断任务一的事件是否都已经完成 */
			if ((xEventBits & MY_BIT0) ==MY_BIT0)                       
			{
					
				a=1;
			}
			else 
			{
					
					a=0;
				
				
			}
			
				osDelay(1);
			uxHighWaterMark_Sound = uxTaskGetStackHighWaterMark( NULL );
		}

}

任意事件组 

			xEventBits= xEventGroupWaitBits(Event_Child, MY_BIT0|MY_BIT1, pdTRUE, pdFALSE, 100);
			

			if ((xEventBits & MY_BIT0) !=0)                       
			{
					
				
			}
            else if ((xEventBits & MY_BIT1) !=0)  
            {


            }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS 事件组 的相关文章

随机推荐