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();
}
如果不想用中断来进行触发数据操作的话,那也可以用轮询方式进行获取数据。
- ucosii_中断服务中的任务调度
- VxWorks任务调度与中断
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- OpenMP中的任务调度
- SQL 日期函数小总结
- 去除恼人的单击以激活和使用此控件
- cisco命令
- 一个不错的有关C++网站
- Factory Method - 工厂模式
- ucosii_中断服务中的任务调度
- JAVA处理日期时间常用方法
- Building a Web 2.0 Portal with asp.net ajax 第一章
- 查看Linux系统属性的相关命令
- SQL Server:定时作业的设置方法
- jsgraphics图形库基本函数说明
- ACM全文电子期刊数据库介绍2009
- CSS初始化代码,重置浏览器中CSS默认属性(2)
- 感觉不错的一个帖子