自顶向下学习RTOS第2讲-RTOS任务间通信
自己瞎理解一下RTOS的通信:
“通信”中的“通”表示拨通,建立联系,就像我们只拨通别人的手机而不与之通话;
“信”表示信息,表示要传递的具体内容。
1 全局变量
全局变量只能承担通信中的“信”的作用
全局变量可以承载通信的内容,但是接收方无法意识到信息的到达,除非接收方不断轮询该全局变量;
如:task1与task2通过全局变量val进行通信
global int val; // "信"
void task1(void) // 发送方
{
val = 1;
}
void task2(void) // 接收方
{
while (1) {
if (val == 1) {
// do something
}
}
}
很显然,需要发送与接收方都处于运行状态,接收方需一直检测全局变量。
2 信号量
信号量与全局变量有什么不同呢?
信号量只能承担通信中的“通”的作用。
信号量的本质是一个等待队列。简单的理解:当一些任务需要等待某个信号量,可以把这些任务从运行队列中摘除,放到等待队列中,等条件成熟后,通知方使用信号量将等待队列的任务重新放回到运行队列中,这些任务重新参与调度了。
3 消息邮箱与消息队列
消息邮箱 = 信号量 + 消息指针,既能拨通电话而且能通话传递内容。
消息队列相当与消息邮箱数组,因为一个邮箱只能装一封信。把多上邮箱集中到一起管理和使用就变成了消息队列。