[ZLG-MCU] ucos-ii 任务间通信问题

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

可能的原因

可能的原因:<br />1)中断里面有没有按ucos-ii规范&quot;OSIntNesting++&quot;,最后“OSIntExit()”?<br />2)主堆栈和任务堆栈设得够不够大?<br />3)有没有使用较大的局部变量数组?如果局部变量较多会使堆栈溢出。<br />4)“OS_CRITICAL_INT_PRIO”是否为0&nbsp;?<br />5)建议首先把统计任务、任务A去掉,看看结果。<br /><br />(zlgarm_zsg)<br />
 楼主| dvx 发表于 2008-4-23 13:50 | 显示全部楼层

用官方移植

谢谢您(ZSG)的回复。<br />昨天晚上将移植代码改用官方新出的版本(2.86)。同样的代码运行到今天下午没有出现以前的问题。<br />我用的是从ZLG下载的1.0E版本的移植(IAR),也是您移植的。正好问一下官方移植的问题,能否详细些。<br />另OS_CRITICAL_INT_PRIO为(1&lt&lt5),关于OS_CRITICAL_INT_PRIO能否也详细一下呢?(工作机制)。论坛不方便可以发到邮箱lwd.cn@163.com
zlgarm 发表于 2008-4-23 17:07 | 显示全部楼层

回答

&nbsp;&nbsp;&nbsp;&nbsp;官方的移植模板有多处BUG,如使用不同优先级的中断可能死机,优化编译可能死机等。OS_CRITICAL_INT_PRIO的详细说明请看《ARM&nbsp;Cortex-M3开发指南》一书,关于os_cpu_a.asm的说明。<br /><br />(zlgarm_zsg)
 楼主| dvx 发表于 2008-4-23 21:03 | 显示全部楼层

能否说得详细些

“官方的移植模板有多处BUG,如使用不同优先级的中断可能死机,优化编译可能死机等”关于这一点能否详细介绍呢?<br />
zlgmcu 发表于 2008-4-25 09:43 | 显示全部楼层

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

有一定功底自己分析一下也就可以搞清楚。<br />我们不方便做这方面的支持,请凉解。<br /><br />推荐用户使用我们的移值代码,并且使用2.52版本的软件。<br /><br />我们可能维护我们的移植代码,如果使用其它的移植代码,我们不能提供任何技术支持。
 楼主| dvx 发表于 2008-4-25 13:34 | 显示全部楼层

中断优先级

给串口接收中断设优先级,消息队列就正常了(用邮箱也正常)
guo69 发表于 2008-7-1 16:19 | 显示全部楼层

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

设置合适的任务优先级&nbsp;或者&nbsp;将OS_CRITICAL_INT_PRIO为(1&lt&lt5)&nbsp;&nbsp;改为OS_CRITICAL_INT_PRIO为(0&lt&lt5)&nbsp;就行了。
zlgarm 发表于 2008-7-2 08:36 | 显示全部楼层

关于OS_CRITICAL_INT_PRIO

&nbsp;&nbsp;&nbsp;&nbsp;如果“OS_CRITICAL_INT_PRIO&nbsp;EQU(1&lt&lt5)”,则1和低于1的中断优先级被UCOS-II开关管理;如果“OS_CRITICAL_INT_PRIO&nbsp;EQU(0&lt&lt5)”,则所有中断被UCOS-II开关管理。这样做的原因是要留一些中断给电机、变频器等苛刻的中断使用。<br />&nbsp;&nbsp;&nbsp;&nbsp;IAR的1.0E版本,由于大意把默认的“OS_CRITICAL_INT_PRIO&nbsp;EQU(0&lt&lt5)”,错写成了“OS_CRITICAL_INT_PRIO&nbsp;EQU(1&lt&lt5)”。敬请原谅。<br /><br />(zlgarm_zsg)
jtingwang 发表于 2009-7-3 11:36 | 显示全部楼层

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

OS_CRITICAL_INT_PRIO&nbsp;EQU(0&lt&lt5)<br />不就是OS_CRITICAL_INT_PRIO&nbsp;EQU&nbsp;0吗?<br />这里5的含义是什么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

dvx

2

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部