在多任务运行时,会出现多个任务访问一个数据的情况,这样会造成数据的不确定性。为了保护这些共享数据引入了信号量的概念,信号量即访问上限,例如网吧有三台电脑,其信号量即3,超过三个人同时要使用电脑时,第四个人就得等待,而不是到电脑上捣乱。信号量在程序中比较常用的值为1,即只能一个任务访问,而这样的信号量就称为互斥信号量。
邮箱与信号量的区别在于通讯。互斥信号量中 使用中的任务,结束占用时需与正在等待使用的任务进行通讯,说我用完了,轮到你用了。同样电脑的例子,一个人说我不会使用电脑,但我要电脑的数据或是数据是我所需要的值才能继续工作,为了让他不在偷懒我们需要另一个人去用这台电脑得到数据发送给这个人这样工作就能继续。
下面开始说明ucos中邮箱框架。
首先邮箱需要一个OS_EVENT(快递员)Str_Box,
他知道OSEventTbl(发送人标识) 及 OSEventPtr(邮件)
在OS运行前我们从预备快递员中创建一个什么也没有的快递员Str_Box = OSMboxCreate((void*)0);
程序运行过程中,有一个任务请求Str_Box送来一个邮箱,然后进入等待:void *mail = OSMboxPend(Str_Box,10);
在请求时告知Str_Box它的门牌号(任务优先级别),等待时挂起这个任务,运行其他任务,为了防止这个任务无休止在等待,我们给了等待超时的时间,这与任务延时跳转机制一样,这里不多说。
而我们要做的是在其他任务中让Str_Box送一个邮件给这个任务。
OSMboxPost(Str_Box,&s);
发送邮箱时告知这个任务不用再等待了,接收信息吧,然后任务跳回
这个任务在收到邮箱后 可以对邮箱中的信息进行判断、访问、修改等。这样就能灵活安全地使用变量。
需要注意的是发送的邮件需要是全局变量,因为在任务跳转时局部变量会被覆盖。 |