FreeRTOS 事件组

实现功能,当任务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 
#include 
#include 

#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);
		}
}

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

FreeRTOS 事件组_第1张图片

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

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

你可能感兴趣的:(RTOS,单片机,RTOS)