μC/OS-II的任务之间的通讯与同步
哪个通道进行采样,告诉它增加采样频率等等,从而使得我们的应用更智能化。换句话说,我们可以告诉A/D采样程序,“现在马上读取通道3的输入值!”之后,该采样任务将重新开始在消息队列中等待消息,准备开始一次新的扫描过程。

图F6.11读模拟量输入——Figure6.11
6.8.9 使用一个消息队列作为计数信号量
在消息队列初始化时,可以将消息队列中的多个指针设为非NULL值(如void*1),来实现计数信号量的功能。这里,初始化为非NULL值的指针数就是可用的资源数。系统中的任务可以通过OSQPend()来请求“信号量”,然后通过调用OSQPost()来释放“信号量”,如程序清单L6.28。如果系统中只使用了计数信号量和消息队列,使用这种方法可以有效地节省代码空间。
这时将OS_SEM_EN设为0,就可以不使用信号量,而只使用消息队列。值得注意的是,这种方法
为共享资源引入了大量的指针变量。也就是说,为了节省代码空间,牺牲了RAM空间。另外,
对消息队列的操作要比对信号量的操作慢,因此,当用计数信号量同步的信号量很多时,这种
方法的效率是非常低的。
程序清单L6.28使用消息队列作为一个计数信号量
OS_EVENT*QSem;
void*QMsgTbl[N_RESOURCES]
voidmain(void)
{
OSInit();
.
QSem=OSQCreate(QMsgTbl[0],N_RESOURCES);
for(i=0;i
OSQPost(Qsem,(void*)1);
}
.
.
OSTaskCreate(Task1,..,..,..);
.
.
OSStart();
}
voidTask1(void*pdata)
{
INT8Uerr;
for(;;){
OSQPend(QSem,0,err);/*得到对资源的访问权*/
.
./*任务获得信号量,对资源进行访问*/
.
OSMQPost(QSem,(void*)1);/*释放对资源的访问权*/
}
}
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
