实现功能,当任务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(使用前将#替换为@)