|
汽车零部件采购、销售通信录 填写你的培训需求,我们帮你找 招募汽车专业培训老师
μcos-II和FreeRTOS任务间的通讯方式有:信号量、互斥量、邮箱、队列和标志位。这些通讯方式都不能在中断中进行等待(如在中断中不允许调用OSSemPend函数)。Autosar OS主要通过Event来实现任务间通信。1 μcos-II/FreeRTOS任务间通信方式介绍
1.1 信号量
信号量是一个16位计数器,当任务调用OSSemPost函数时如果有其他任务在等待这个信号量,那么会找到等待的任务的优先级最高的那个,让其从等待态转化会就绪态,然后判断与当前任务优先级进行对比来决定是否进行任务切换;如果没有其他任务在等待,则信号量直接加1.当任务调用OSSemPend函数时,如果信号量值大于0,那么将信号量值减1后接着运行改任务,否则将该任务从运行态置为等待态,然后执行任务调度来找到当前就绪的最高优先级的任务来运行。但是信号量有个缺点,就是会出现优先级反转,即高优先级的任务调用OSSemPend函数被阻塞后,可能需要等待一个比它优先级低的任务调用OSSemPost增加信号量后来让高优先级重新变为就绪态。
1.2 互斥量
互斥量是可以解决优先级反转问题的二值信号量。当低优先级任务获取到互斥量(OSMutexPend)后,假如此时被高优先级任务的抢占且高优先级的任务也想去获取互斥量(OSMutexPend),那么此时μcos-II就会把低优先级的任务优先级提高(提至天花板优先级),然后执行任务调度。这样就可以让低优先级的任务快速执行完后释放掉互斥量(OSMutexPost)让高优先级的任务得以获取互斥量。1.3 标志位一个事件标志组中可以包含多个事件标志位,每个标志位都可以独立设置或清除。任务可以等待一个或多个事件标志位的发生,并在发生时得到通知。
1.4 邮箱
邮箱可以用于任务间来传递数据。调用OSMboxCreate函数传入一块地址,这块地址对应的内容即为用户想要传递的消息,接下来即可在任务中用OSMboxPend函数来等待并读取邮箱中的数据,调用OSMboxPost函数来发送数据到邮箱中。
1.5 队列
队列也是用于任务间传递数据的,它可以看成是由多个邮箱组成的(邮箱是队列长度为1的特殊情况)。2 Autosar OS的Event介绍Event和μcos-II/FreeRTOS中的标志位有点像(通过eventmask来选择哪个事件来触发)。Event只能用在扩展任务中(extended task),扩展任务和基本任务(basic task)的区别在于,它多了一个等待的状态(waiting),具体如下图所示。
当任务在运行态(running)需要等待事件发生(waitevent)时便会进入等待态(waiting),此时OS就会查找处于就绪态(ready)的优先级最高的任务来运行。当所等待的事件发生后,任务就会变为(release)就绪态,等待操作系统调度至运行态。
我们知道在μcos-II或者FreeRTOS的中断处理函数中不能调用上述可能产生阻塞的OS服务函数,在Autosar OS中,我们调用WaitEvent函数也会让任务进入等待态,所以在调用WaitEvent之前,我们必须释放之前拿到的自旋锁(spinlock)! |
|