FREERTOS事件标志组
描述:事件位:一个事件发生后就置1,当没有发生这个事件就置0;
事件组:一个事件组表示多个事件位组成的事件,BIT0表示一个事件0,BIT1表示事件1,BIT2表示事件2
这些事件可以通过事件标志位来管理,可以置0或者置1,可以等待多个任务全部置1然后再处理,也可以读取事件标志位的值。
事件标志组相当于裸机的多个全局变量取&|关系,但是裸机没有阻塞这一功能,必须轮询全局变量的值,而且中断服务函数中的全局变量与主函数同步不及时,所以处理裸机的多个全局变量的|| || && &&关系可以不是很及时。
#define configUSE_16_BIT_TICKS 0
定义位1时只能有8个事件标志位可以用。
定义位0 时有24个事件标志位可以用。
创建事件标志组
#include "event_groups.h" //头文件
EventGroupHandle_t EventGroupHandler;//事件标志组句柄声明
#define EVENTBIT_0 (1<<0)//事件标志位 0
#define EVENTBIT_1 (1<<1)//事件标志位 1
#define EVENTBIT_2 (1<<2)//事件标志位 2
#define EVENTBIT_ALL (EVENTBIT_0|EVENTBIT_1|EVENTBIT_2)
EventGroupHandler=xEventGroupCreate();//创建一个事件标志组
**1、xEventGroupSetBitsFromISR();**事件标志位置1
xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken )
{
BaseType_t xReturn;
traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet );
xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken );
return xReturn;
}
实列
if(Que_data[2]==0xdd)
xEventGroupSetBitsFromISR(EventGroupHandler,EVENTBIT_0,&xTaskWokenByReceive);//事件标志组设置标志位0 置1
else if(Que_data[2]==0x35)
xEventGroupSetBitsFromISR(EventGroupHandler,EVENTBIT_1,&xTaskWokenByReceive);//事件标志组设置标志位1 置1
else if(Que_data[2]==0xf4)
xEventGroupSetBitsFromISR(EventGroupHandler,EVENTBIT_2,&xTaskWokenByReceive);//事件标志组设置标志位2 置1
**2、xEventGroupGetBits();**获取事件标志组的值
返回值:事件标志组的值
实例:
if(EventGroupHandler!=NULL) //读取事件标志组的值
{
new_value=xEventGroupGetBits(EventGroupHandler);
}
**3、xEventGroupWaitBits();**等待指定的事件位
实列:
void eventquery_task(void *pvParameters)//事件标志组任务,该任务为等待事件标志位0、1、2事件,事件都为1则进入任务,并且清除任务标志位
{
u8 data_change=0;
EventBits_t event_value=0;
while(1)
{
if(EventGroupHandler!=NULL)
{
event_value=xEventGroupWaitBits((EventGroupHandle_t )EventGroupHandler,//句柄声明
(EventBits_t)EVENTBIT_ALL, //事件的标志位 全部标志位
(BaseType_t)pdTRUE, //退出是否清除标志位 pdTRUE为清除标志位
(BaseType_t)pdTRUE, //是否等待所有的标志位都置1 pdTRUE为全部都置1
(TickType_t)portMAX_DELAY ); //阻塞事件设置
data_change=event_value&0xff;
USART2_data(&data_change,1);
}
else
{
vTaskDelay(100);
}
}
}
**4、xEventGroupClearBits();**将事件标志组的指定位清零 该函数只能用于任务中,不能用于中断服务函数中。
xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
该函数不经常使用,用函数xEventGroupWaitBits(); 可以替代该函数将指定标志位清零。