ucosii_中断服务中的任务调度

来源:互联网 发布:mac安装visual studio 编辑:程序博客网 时间:2024/06/05 14:24

 最近在调试lwip协议包的过程中,始终有个问题困扰我,就是在tcpip这层任务上的消息队列失效了。主要的操作:

1.   传输层收到数据包后发送消息队列,也就是sys_mbox_post操作

2.   传输层的任务进行sys_mbox_fetch操作来获取消息。

结果,在调试的过程中,程序进行了sys_mbox_post消息,而任务却获取不到这个消息。

分析原因:

1.  创建该层任务的时候,是否优先级设置问题

2.  sys_mbox_post/sys_mbox_fetch是通过OSQPost/OSQPend来实现的,是不是ucosii未移植好呢

3.  ucosii的消息队列任务调度的问题

 

于是

首先查看优先级是否设置重复,发现没问题之后,便翻阅了ucosii的教程,从中了解了一些任务调度的原理,以及任务

通讯的原理,发现任务间的通信:包括信号量,邮箱,消息队列在进行Post和Pend操作过程中便会进行OSSched.

而OSSched操作中,便会检测是否是中断触发而进行的调度。因为在ucosii的任务调度过程中,任务切换的过程是将

当前任务的寄存器压栈,讲优先级高的任务的参数写入寄存器。 而这个时候如果中断产生了,系统的寄存器值是中断

前系统的值,这个时候强行进行OSSched的话,会有错误产生。

因此在ucosii中,不能在中断服务中调用任务切换,如果一定要在中断服务中调用任务切换,则需要进行OSIntEnter和

OSIntExit操作来进行任务切换。这2个操作主要是禁止在中断服务程序中进行任务切换,而在中断服务程序结束后进行

任务切换。

这个时候基本上明了为什么sys_mbox_fetch失败的原因了。

 

不过我还是写了一个测试用例,来进行OSQPost和OSQPend的验证,结果证明是正常的。

于是确定了原因所在:在中断服务程序中如调用需要进行任务调度的函数,则需要

void __irq  ISR()

{

OSIntEnter();

//任务调度函数

OSIntExit();

}

 

如果不想用中断来进行触发数据操作的话,那也可以用轮询方式进行获取数据。