打印
[ZLG-MCU]

ucos-ii 任务间通信问题

[复制链接]
3821|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dvx|  楼主 | 2008-4-22 21:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问周工:
    我用easyarm615学习cortex-m3和ucos-ii。
    现在写了这样一段程序(使用ZLG的移植模板):
    系统中有两个任务,一个任务A定时翻转LED1状态(优先级为10),一个任务B从消息队列中接收数据,并发送到串口(优先级为7),另有两个系统任务,系统统计任务(优先级为30),空闲任务(优先级为31)。
    系统中有一个定时器中断,定时翻转LED2状态(优先级2<<5)。另有一个串口接收中断(未设优先级)。
    系统是这样工作的:当串口产生接收中断后,将接收到数据作为消息向消息队列发送,任务B接收到数据后再通过串口发送出去。
    程序运行后通过PC串口工具向EasyARM615发送数据,程序按照预定方式工作,PC机串口接收的数据与发送的数据相同。
    但当程序运行时间较长时(有时一个多小时),任务B即停止工作(状态是ready),不再从消息队列中取消息,此时串口中断仍不断地向队列中发送消息,定时器中断仍在工作(LED2闪),任务A不工作(LED1不闪)。如果调整任务A的优先级高于任务B,则任务B停止工作时(状态是ready),任务A仍在工作(LED1闪)。
    将串口中断优先级也设为2<<5时,程序连续工作了11个小时,但最终还是出现了上述情况。
    PC串口每次发送10个字节数据,发送间隔300ms。
请问为什么会现这种情况呢?是这种工作机制有问题?任务B为什么不能从消息队列中收到数据?感觉是消息队列被破坏了?
    在使用消息队列前我用了邮箱,是同样的结果。

相关帖子

沙发
zlgarm| | 2008-4-23 09:32 | 只看该作者

可能的原因

可能的原因:
1)中断里面有没有按ucos-ii规范"OSIntNesting++",最后“OSIntExit()”?
2)主堆栈和任务堆栈设得够不够大?
3)有没有使用较大的局部变量数组?如果局部变量较多会使堆栈溢出。
4)“OS_CRITICAL_INT_PRIO”是否为0 ?
5)建议首先把统计任务、任务A去掉,看看结果。

(zlgarm_zsg)

使用特权

评论回复
板凳
dvx|  楼主 | 2008-4-23 13:50 | 只看该作者

用官方移植

谢谢您(ZSG)的回复。
昨天晚上将移植代码改用官方新出的版本(2.86)。同样的代码运行到今天下午没有出现以前的问题。
我用的是从ZLG下载的1.0E版本的移植(IAR),也是您移植的。正好问一下官方移植的问题,能否详细些。
另OS_CRITICAL_INT_PRIO为(1<<5),关于OS_CRITICAL_INT_PRIO能否也详细一下呢?(工作机制)。论坛不方便可以发到邮箱lwd.cn@163.com

使用特权

评论回复
地板
zlgarm| | 2008-4-23 17:07 | 只看该作者

回答

    官方的移植模板有多处BUG,如使用不同优先级的中断可能死机,优化编译可能死机等。OS_CRITICAL_INT_PRIO的详细说明请看《ARM Cortex-M3开发指南》一书,关于os_cpu_a.asm的说明。

(zlgarm_zsg)

使用特权

评论回复
5
dvx|  楼主 | 2008-4-23 21:03 | 只看该作者

能否说得详细些

“官方的移植模板有多处BUG,如使用不同优先级的中断可能死机,优化编译可能死机等”关于这一点能否详细介绍呢?

使用特权

评论回复
6
zlgmcu| | 2008-4-25 09:43 | 只看该作者

这方面没有一定的ucos-ii 的功底很难说明白

有一定功底自己分析一下也就可以搞清楚。
我们不方便做这方面的支持,请凉解。

推荐用户使用我们的移值代码,并且使用2.52版本的软件。

我们可能维护我们的移植代码,如果使用其它的移植代码,我们不能提供任何技术支持。

使用特权

评论回复
7
dvx|  楼主 | 2008-4-25 13:34 | 只看该作者

中断优先级

给串口接收中断设优先级,消息队列就正常了(用邮箱也正常)

使用特权

评论回复
8
guo69| | 2008-7-1 16:19 | 只看该作者

好像是中断优先级的问题,我也碰到过类似的问题。

设置合适的任务优先级 或者 将OS_CRITICAL_INT_PRIO为(1<<5)  改为OS_CRITICAL_INT_PRIO为(0<<5) 就行了。

使用特权

评论回复
9
zlgarm| | 2008-7-2 08:36 | 只看该作者

关于OS_CRITICAL_INT_PRIO

    如果“OS_CRITICAL_INT_PRIO EQU(1<<5)”,则1和低于1的中断优先级被UCOS-II开关管理;如果“OS_CRITICAL_INT_PRIO EQU(0<<5)”,则所有中断被UCOS-II开关管理。这样做的原因是要留一些中断给电机、变频器等苛刻的中断使用。
    IAR的1.0E版本,由于大意把默认的“OS_CRITICAL_INT_PRIO EQU(0<<5)”,错写成了“OS_CRITICAL_INT_PRIO EQU(1<<5)”。敬请原谅。

(zlgarm_zsg)

使用特权

评论回复
10
jtingwang| | 2009-7-3 11:36 | 只看该作者

OS_CRITICAL_INT_PRIO EQU(0<<5)中5的含义

OS_CRITICAL_INT_PRIO EQU(0<<5)
不就是OS_CRITICAL_INT_PRIO EQU 0吗?
这里5的含义是什么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

dvx

2

主题

5

帖子

0

粉丝