网站flash制作教程收录平台
news/
2025/9/29 20:42:52/
文章来源:
网站flash制作教程,收录平台,ui设计师要学什么,网页制作电子教程FreeRTOS-事件标志组 一、事件标志组简介二、事件标志组API函数三、事件标志组实验 一、事件标志组简介
事件标志位#xff1a;用一个位来表示事件是否发生#xff0c;裸机中的中断标志位等等事件标志组#xff1a;是一组事件标志位的集合#xff0c;简单认为就是一个整数… FreeRTOS-事件标志组 一、事件标志组简介二、事件标志组API函数三、事件标志组实验 一、事件标志组简介
事件标志位用一个位来表示事件是否发生裸机中的中断标志位等等事件标志组是一组事件标志位的集合简单认为就是一个整数事件标志组特点它每一个位表示一个事件(高8位不算)。每一位事件的含义由用户自己决定(1表示发生0表示未发生)。任意任务或中断都可以读写这些位。可以等待某一位成立或者等待多位同时成立事件标志组的32位标志位其中的高8位用来存储事件标志组的控制信息低24位用作存储事件标志一个事件组最多可以存储24个事件标志位23表示事件标志23等以此类推
二、事件标志组API函数
下面是事件标志组相关的API函数
xEventGroupCreate();//动态方式创建事件标志组
xEventGroupCreateStatic();//静态方式创建事件标志组
xEventGroupClearBits();//清零事件标志位
xEventGroupClearBitsFromISR();//在中断中清零事件标志位
xEventGroupSetBits();//设置事件标志位
xEventGroupSetBitsFromISR();//在中断中设置事件标志位
xEventGroupWaitBits();//等待事件标志位
xEventGroupSync();//设置并等待事件标志位动态创建事件标志组
EventGroupHandle_t xEventGroupCreate(void)
//返回值判断是否创建成功清除事件标志位
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear)
//形参:待操作的事件标志组句柄 待清零的事件标志位
//返回值:清零事件标志位前事件组中事件标志位的值设置事件标志位
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet)
//形参:待操作的事件标志组句柄 待设置的事件标志位
//返回值:事件组中事件标志位值等待事件标志位可以等待某一位也可以等待多位
EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForALLBits,TickType_t xTicksToWait)
//形参:等待的事件标志组句柄 等待的事件标志位
//成功等待到事件标志位后,清除事件组中对应的事件标志位
//等待uxBitsToWaitFor中所有的事件标志位 等待阻塞时间
//返回值:判断等待是否成功设置其中某一个标志位后并等待其他标志位也置1—同步
EventBits_t xEventGroupSync(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait)
//形参:等待事件标志位所在事件组 达到同步点后,要设置的事件标志位
//等待的事件标志 等待阻塞时间
//返回值:等待是否成功三、事件标志组实验
实验设计设计三个任务start_task创建task1和task2并创建事件标志组。task1按键扫描不同按键值将事件标志组相应事件置1。task2同时等待事件标志组中的多个事件位当这些事件位都置1的话就执行相应的处理
#define configSUPPORT_DYNAMIC_ALLOCATION 1//动态创建任务/信号量宏定义配置//start_task参数宏定义
#define START_TASK_STACK_SIZE 128//堆栈大小
#define START_TASK_PRIO 1//任务优先级
TaskHandle_t start_task_handle; //任务句柄
//task1参数宏定义
#define TASK1_STACK_SIZE 128//堆栈大小
#define TASK1_PRIO 2//任务优先级
TaskHandle_t task1_handle; //任务句柄
//task2参数宏定义
#define TASK2_STACK_SIZE 128//堆栈大小
#define TASK2_PRIO 3//任务优先级
TaskHandle_t task2_handle; //任务句柄//task1任务函数:按键扫描,不同按键值将事件标志组相应事件置1
void task1( void * pvParameters )
{uint8_t KeyNum 0;while(1){KeyNum Key_GetNum();if(KeyNum 1)//key1按下,Bit0置1{xEventGroupSetBits(eventgroup_handle,0x01);//将事件标志组的Bit0置1}else if(KeyNum 2)//Key2按下,Bit1置1{xEventGroupSetBits(eventgroup_handle,0x02);//将事件标志组的Bit1置1}vTaskDelay(10);//自带延时函数}
}
//task2任务函数:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理
void task2( void * pvParameters )
{while(1){xEventGroupWaitBits(eventgroup_handle,0x01|0x02,pdTRUE,pdTRUE,portMAX_DELAY);//等待Bit0和Bit1标志位都为1}
}
EventGroupHandle_t eventgroup_handle;//事件标志组句柄
//Start_task任务函数:创建task1、task2和事件标志组
void Start_task( void * pvParameters )
{taskENTER_CRITICAL();//进入临界区//创建事件标志组eventgroup_handle xEventGroupCreate();//创建任务1xTaskCreate(task1,//任务函数task1,//任务名称TASK1_STACK_SIZE,//堆栈大小/字NULL,//入口参数没有TASK1_PRIO,//优先级task1_handle//任务句柄);//创建任务2xTaskCreate(task2,//任务函数task2,//任务名称TASK2_STACK_SIZE,//堆栈大小/字NULL,//入口参数没有TASK2_PRIO,//优先级task2_handle//句柄);vTaskDelete(start_task_handle);//删除自身任务Start_task,start_task_handle或NULL都可以taskEXIT_CRITICAL();//退出临界区
}void freertos_demo()
{xTaskCreate(Start_task,//任务函数Start_task,//任务名称START_TASK_STACK_SIZE,//堆栈大小/字NULL,//入口参数没有START_TASK_PRIO,//优先级start_task_handle//句柄);//创建Start任务vTaskStartScheduler();//开启任务调度器,开启执行Start任务,创建task123
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922236.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!