实现功能,当任务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);
}
}
为了查看效果把串口任务优先级设置为最高,其他比串口低,阻塞时间相同
不知道这样使用方法对不对
后面更新以前调试过的任务通知功能。