- 简述
- 事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输
- 可以实现一对多,多对多的同步,即一个任务可以等待多个事件的发生
- 事件仅用于同步,不提供数据传输功能
- 允许多个任务对同一事件进行读、写操作
- 事件无排队性,即多次向任务设置同一事件(如果任务还未来得及读走),等效于只设置一次
- 事件不与任务相关联,事件相互独立,一个32位的变量就是事件的集合,标识该任务发生的事件类型,
- 0:事件类型未发生,1:事件类型己发生
- 应用场景
- 事件做标志位,判断某些事件是否发生,然后做数据处理
- 事件可使用于多种场合,它能够在一定程度上替代信号量,用于任务与任务,中断与任务间的同步
- 事件运作机制
- 等待接收:可以根据感兴趣的事件类型等待事件的单个/多个事件
- 等待成功:必须使用OS_OPT_PEND_FLASG_CONSUME选项来清除己接收到的事件类型,否则不会清除己接收到的事件
- 设置事件:对指定事件写入指定的事件类型,设置事件集合的对应事件位为1,可一次同时写多个事件类型
- 清除事件:根据写入参数事件句柄和待清除的事件类型,对事件相应位进行清0操作‘
- 相关函数
- OSFlagCreate(); 创建事件标志组
- OSFlagDel(); 删除事件标志组
- OSFlagPend(); 等待事件标志组
- OSFlagPendAbort(); 取消等待事件标志组
- OSFlagPendGetFlagsRdy(); 获取使任务就绪的事件标志
- OSFlagPost(); 向事件标志组发布标志
- 常用函数:创建、发布、等待
- 例程
- 创建
//创建事件标志组 flag_grp OSFlagCreate((OS_FLAG_GRP *)&flag_grp, //指向事件标志组的指针 (CPU_CHAR *)"flag for test", //事件标志组的名字 (OS_FLAGS )0, //事件标志组的初始值 (OS_ERR *)&err); //返回错误类型
- 发布
/************************************************** * 函数名:static void AppTaskKey(void *p_arg) * 描述 :按键检测 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskKey(void *p_arg) { OS_ERR err; uint8_t KeyValue; (void)p_arg; for(;;) { KeyValue = BSP_KEY_Scan(0); if(KeyValue == Key0_PH3_Value) { printf("\r\n Key0被按下 \r\n"); OSFlagPost( (OS_FLAG_GRP *)&flag_grp, (OS_FLAGS )KEY0_EVENT, (OS_OPT )OS_OPT_POST_FLAG_SET, (OS_ERR *)&err); } if(KeyValue == Key1_PH2_Value) { printf("\r\n Key1被按下 \r\n"); OSFlagPost( (OS_FLAG_GRP *)&flag_grp, (OS_FLAGS )KEY1_EVENT, (OS_OPT )OS_OPT_POST_FLAG_SET, (OS_ERR *)&err); } if(KeyValue == Key2_PC13_Value) { printf("\r\n Key3被按下 \r\n"); OSFlagPost( (OS_FLAG_GRP *)&flag_grp, (OS_FLAGS )(KEY0_EVENT | KEY1_EVENT), (OS_OPT )OS_OPT_POST_FLAG_SET, (OS_ERR *)&err); } } }
- 等待
/************************************************** * 函数名:static void AppTaskLed(void *p_arg) * 描述 :led应用 * 输入 :无 * 输出 :无 * 返回 :无 * 调用 :内部调用 **************************************************/ static void AppTaskLed(void *p_arg) { OS_ERR err; OS_FLAGS flags_rdy; (void)p_arg; for(;;) { flags_rdy = OSFlagPend( (OS_FLAG_GRP *)&flag_grp, (OS_FLAGS )(KEY0_EVENT | KEY1_EVENT), (OS_TICK )0, (OS_OPT )OS_OPT_PEND_FLAG_SET_ALL | OS_OPT_PEND_BLOCKING | OS_OPT_PEND_FLAG_CONSUME, (CPU_TS *)0, (OS_ERR *)&err); if((flags_rdy & (KEY0_EVENT | KEY1_EVENT)) == (KEY0_EVENT | KEY1_EVENT)) { printf("\r\n key0与key1都按下 \r\n"); LED1_TOGGLE; } } }
- 创建
- 下载验证
- 总结
- 相同优先级的任务,按顺序执行
- 参考资料:
- 正点原子《STM32F767 UCOS开发手册》
- 野火《uC/OS-III内核应用与开发》
- 《嵌入式实时操作系统 uC/OS-II原理及应用(第二版)》
- 官方源码
- 硬件平台:
- 正点原子阿波罗F767
- 软件平台:
- MDK5.2.5
- 库版本:
- TM32Cube_FW_F7_V1.4.0
- uC/OS-III版本
- UCOSIII 3.04
【7】uC/OS-III应用开发————>事件(STM32F767)
最新推荐文章于 2020-05-07 23:24:38 发布