通常情况下,任务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状态.
也就是说,依靠消息队列来控制任务状态的转换.还是比较方便的.