最近在调试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个操作主要是禁止在中断服务程序中进行任务切换,而在中断服务程序结束后进行