事件标志组 前面的章节我们已经讲解了任务管理和时间管理,从本章节开始讲解任务间的通信和同步机制。首先讲解任务间的通信和同步机制之一,事件标志组。 本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407。 13.1 事件标志组 13.2 事件标志组API函数 13.3 实验例程说明(任务间通信) 13.4 实验例程说明(中断方式通信) 13.5 总结
13.1 事件标志组
13.1.1 为什么要使用事件标志 事件标志组是实现多任务同步的有效机制之一。也许有不理解的初学者会问采用事件标志组多麻烦,搞个全局变量不是更简单,其实不然。在裸机编程时,使用全局变量的确比较方便,但是在加上RTOS后就是另一种情况了。使用全局变量相比事件标志组主要有如下三个问题: (1)使用事件标志组可以让RTOS内核有效的管理任务,全局变量是无法做到的,任务的超时等机制需要用户自己去实现。 (2)使用了全局变量就要防止多任务的访问冲突,使用事件标志组已经处理好了这个问题。用户无需担心。 (3)使用事件标志组可以有效的解决中断服务程序和任务之间的同步问题。
13.1.2 RTX任务间事件标志组的实现 任务间事件标志组的实现是指各个任务之间使用事件标志组实现任务的通信或者同步机制。 RTX每个任务创建的时候,会自动创建16个事件标志,事件标志被存储到每个任务的任务控制块中。也就是说每个任务支持16个事件标志。下面我们通过如下的框图来说明一下RTX事件标志的实现,让大家有一个形象的认识。 运行条件: 创建2个任务Task1和Task2 运行过程描述如下: 1. 任务Task1运行过程中调用函数os_evt_wait_and,等待事件标志位被设置,任务Task1由运行态进入到挂起态 2. 任务Task2设置了任务Task1的事件标志,任务Task1由挂起态进入到就绪态,在调度器的作用下由就绪态又进入到运行态。
上面就是一个简单RTX任务间事件标志通信过程。
13.1.3 RTX中断方式事件标志组的实现 RTX中断方式事件标志组的实现是指中断函数和RTX任务之间使用事件标志。下面我们通过如下的框图来说明一下RTX事件标志的实现,让大家有一个形象的认识。 运行条件: 创建1个任务和一个串口接收中断 运行过程描述如下: 1. 任务Task1运行过程中调用函数os_evt_wait_and,等待事件标志位被设置,任务Task1由运行态进入到挂起态 2. Task1挂起的情况下,串口接收到数据进入到了串口中断服务程序,在串口中断服务程序中设置Task1的事件标志,任务Task1由挂起态进入到就绪态,在调度器的作用下由就绪态又进入到运行态。
上面就是一个简单RTX中断方式事件标志通信过程。实际应用中,中断方式的消息机制切记注意以下四个个问题: (1)中断函数的执行时间越短越好,防止其它低于这个中断优先级的异常不能得到及时响应。 (2)实际应用中,建议不要在中断中实现消息处理,用户可以在中断服务程序里面发送消息通知任务,在任务中实现消息处理,这样可以有效的保证中断服务程序的实时响应。同时此任务也需要设置为高优先级,以便退出中断函数后任务可以得到及时执行。 (3)中断服务程序中一定要调用专用于中断的事件标志设置函数isr_evt_set。 (4)在RTX操作系统中实现中断函数跟裸机编程是一样的。 A. 另外强烈推荐用户将Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407的NVIC优先级分组设置为4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断优先级的管理将非常方便。 B. 用户要在RTX多任务开启前就设置好优先级分组,一旦设置好切记不可再修改。
|