通常情况下,任务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); //信号量释放,有效。
}
不是这样理解的,我希望实现的功能是:
正常情况下taskA每隔5ms执行一次,如果有突发事件则立即唤醒taskA。也就是说正常情况下taskA每执行一次自身代码便交出cpu,5ms后才变成就绪状态,如果中断发生,将taskA立刻变成就绪状态。
我现在是不知道在中断里边怎样将taskA变成就绪状态。
ps:如果网页能提供自由画图的功能就好了,画个cpu的执行图你一下子就能明白我说的了^_^
semTake(semSync,WAIT_FOREVER)
如果不指定WAIT_FOREVER,那就是等待时间啊,到时间就自动退出semtake了
(1)任务A创建一个消息队列,任务用msgQRecv循环接收消息,没有收到消息既是阻塞状态.
(2)用看门狗封装一个通用的定时器模块,每5s给你的任务A发一个定时器消息.这5s中任务A如果没有其他消息收到,则一直处于阻塞.
(3)如果有中断产生,也给任务A的消息队列发一个消息,任务A即进入到ready状态.
也就是说,依靠消息队列来控制任务状态的转换.还是比较方便的