当前位置: 代码迷 >> VxWorks >> vxworks中如何唤醒一个任务
  详细解决方案

vxworks中如何唤醒一个任务

热度:2307   发布时间:2013-02-26 00:00:00.0
vxworks中怎么唤醒一个任务?
通常情况下,任务A执行完自身代码后挂起5ms(用nanosleep),想在中断中判断若收到某个信息就立刻将任务A变成就绪状态,应该怎么做?
用了taskActivate()函数,没效果,用示波器看到中断中用了taskActivate()函数,但任务A还是要等5ms

------解决方案--------------------------------------------------------
这个是同步问题:

偶一般这样处理

用 二进制 信号量

SEM_ID semSync;
semSync = semBCreate(SEM_Q_FIFO,SEM_EMPTY);
taskA(void)
{
semTake(semSync,WAIT_FOREVER); //等待信号量。
……..
}

ISR(void)
{
……….
semGive(semSync); //信号量释放,有效。
}

------解决方案--------------------------------------------------------
semTake(semSync,WAIT_FOREVER)
如果不指定WAIT_FOREVER,那就是等待时间啊,到时间就自动退出semtake了
------解决方案--------------------------------------------------------
(1)任务A创建一个消息队列,任务用msgQRecv循环接收消息,没有收到消息既是阻塞状态.
(2)用看门狗封装一个通用的定时器模块,每5s给你的任务A发一个定时器消息.这5s中任务A如果没有其他消息收到,则一直处于阻塞.
(3)如果有中断产生,也给任务A的消息队列发一个消息,任务A即进入到ready状态.

也就是说,依靠消息队列来控制任务状态的转换.还是比较方便的.
  相关解决方案