事件:UC/OS中,通过使用信号量、邮箱(消息邮箱)和消息队列来实现任务之间的通讯,这些环节统称为“事件”
信号量:
信号量通过OSSemCreate函数来创建。参数为应用计数器,一般设置为1。
请求任务时采用 OSSemPend 带超时函数的请求和OSSemAccept 无等待的函数,这两个函数进入以后,则会将信号计数器减一。
发送信号量:采用OSSemPost函数,发送信号量。
信号量的注意点:
1、信号量的释放将引发任务调度,但释放信号量时,如果有更好级别的任务处于就绪等待状态,将切换人物。
2、信号量的使用,实际上,是针对信号量计数器加一减一来实现,减到0则其他的任务进行等待。因此,可以创建信号量为0的任务,一个任务处于等待状态,另外一个任务负责发送信号量,使其运行。
另外一种信号量的使用采用传统做法,创建一个1的信号量,使用时Pend,用完Post,进行互斥操作。
3、优先级反转。所谓任务优先级反转指,ABC三个优先级任务,A等待C,B抢占C,因此导致了B优先于A运行程序的问题。
4、采用互斥型OSMutexCreate的方式,可以解决优先级反转的问题。
消息邮箱:
消息邮箱和信号量类似,但是区别是 1可以发送消息,第二可以以广播方式发送给所有不同等级的等待进程。
信号量:
信号量通过OSSemCreate函数来创建。参数为应用计数器,一般设置为1。
请求任务时采用 OSSemPend 带超时函数的请求和OSSemAccept 无等待的函数,这两个函数进入以后,则会将信号计数器减一。
发送信号量:采用OSSemPost函数,发送信号量。
信号量的注意点:
1、信号量的释放将引发任务调度,但释放信号量时,如果有更好级别的任务处于就绪等待状态,将切换人物。
2、信号量的使用,实际上,是针对信号量计数器加一减一来实现,减到0则其他的任务进行等待。因此,可以创建信号量为0的任务,一个任务处于等待状态,另外一个任务负责发送信号量,使其运行。
另外一种信号量的使用采用传统做法,创建一个1的信号量,使用时Pend,用完Post,进行互斥操作。
3、优先级反转。所谓任务优先级反转指,ABC三个优先级任务,A等待C,B抢占C,因此导致了B优先于A运行程序的问题。
4、采用互斥型OSMutexCreate的方式,可以解决优先级反转的问题。
消息邮箱:
消息邮箱和信号量类似,但是区别是 1可以发送消息,第二可以以广播方式发送给所有不同等级的等待进程。