邮箱存储的是一个void类型的指针
新建的时候
OS_EVENT *Key_Mbox;//声明OS_EVENT 类型的指针,指针名字是Key_Mbox,按键值邮箱
Key_Mbox = OSMboxCreate((void *)0);//创建邮箱
OSMboxPost(Beep_Mbox, (void *)2);//发送一个邮件
这里分析一下,把原本一个数字二强制转为一个void类型的指针值。
等效于下面
void *p;//p是一个指针变量,变量里面存储的值是4字节的地址
p = 2;//p变量值改为0x0000 0002
OSMboxPost(Key_Mbox, p);//发送一个邮件,就是把0x0000 0002存进去
void *msg;
msg = (void *)(OSMboxPend(Key_Mbox, 0, &err));//等待邮件
如果等到了
msg = p;
这时候它俩都是指针类型的变量
可以这样得到p的值
val = (u32)msg;//强制类型转换
这就可以得到p的值是2了
实际上下面这样更容易理解
char msg1[]="cmd1";
char msg1[]="cmd2";
OS_EVENT *cmd_Mbox;//声明OS_EVENT 类型的指针,指针名字是cmd_Mbox,命令字符串邮箱
cmd_Mbox = OSMboxCreate((void *)0);//创建邮箱
OSMboxPost(Beep_Mbox, (void *)msg1);//发送一个邮件,把msg1的地址发出去了
char *msg;
msg = (char *)(OSMboxPend(Key_Mbox, 0, &err));//等待邮件
等到的邮件转换为char类型指针
那msg[0] = 'c'; msg[1] = 'm'; msg[1] = 'd';
那如果,我邮件发出去后
有某个地方msg1[0] = 'd';操作
过一会儿邮件才收到
那么收到的时候得到的msg[0] = 'd';
所以邮箱传递的是地址,地址上的数据值在任何时候都是可以改变的。使用中要注意发送和接收处理的速度
上面两种方式我们可以总结
1.我们可以把邮箱记住的哪个指针值作为一个四字节的空间来用
2.正确情况应该是在下次发送前,邮件已经被取出。
搜索
复制
OSMboxPost(Beep_Mbox, (void *)2);OSMboxPost(Beep_Mbox, (void *)2);OSMboxPost(Beep_Mbox, (void *)2);