查看: 10850|回复: 11

[MQX] MQX使用中的几个问题,请教于高人

[复制链接]

该用户从未签到

33

主题

441

帖子

0

新手上路

Rank: 1

积分
7703
最后登录
1970-1-1
发表于 2012-3-4 13:54:24 | 显示全部楼层 |阅读模式
 特别请老居帮忙看看
 
这个是实际的一个产品,用mcf522259+MQX。MQX BSP从M52259EVB修改过来。这个东西做完后再长时间运行过程中发现了一些莫名其妙问题,主要是稳定性方面的问题。
1. MQX系统时不时会死;由于我用了硬件看门狗,症状就是是不时会重启复位。看门狗溢出了。频率大概是每2-3小时会有一次。跟踪发现产生系统节拍的那个定时器好像死了,那个系统节拍定时器的中断服务程序会永远得不到调用,整个系统节拍就停止了,所有任务调度也跟着停止。这里我是完全抄FSL M52259EVB BSP代码,没有改动什么。
 
2. 发现_int_disable这个东西并不真的禁止中断,看代码知道他其实只是把BASEPRIO提到一个高的level,从而禁止cpu响应低于其level的中断,于是我修改这个level为7,想尽可能的禁止中断。但发现调用这个函数后,竟然调度器还在调度。比如下面的代码片段:
打开sd card上文件
_int_disable
write data to MFS on sd card
_int_enable
结果发现在_int_disable后,写数据到sd card还是可能被打断,导致MFS文件格式破坏,通过printf插桩看到,在_int_disable后,调度器仍然工作,调度了其他任务运行
3. 在开发中,原来是想用MQX的软timer来实现一个定时操作,就是定时10分钟,如果用户不按键,则关闭LCD背光,但代码写好后,发现只要加上这个timer,在初始化中调用create_timer_componet创建定时器组件和定时器,就发现一个奇怪现象,系统根本启动不了。代码片段大致如下:
main()
{
 
初始化内部数据
安装MFS
其他杂七杂八初始化
创建各个任务
创建定时器
 
}
跟踪发现:在创建定时器前,即创建各个任务时,系统就死了,然后看门狗复位,导致系统不断重启。去掉创建定时器那句就没问题了。
 
以上问题请高手指教
 
 
我知道答案 目前已有10人回答
回复

使用道具 举报

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2012-3-5 09:37:19 | 显示全部楼层

RE:MQX使用中的几个问题,请教于高人

不是高手,试给你分析一下......

你检查或计算你内存的用量没有?
如果你的内存用量已接近上限,那什么奇怪的现象都会发生。特别是你的第3个问题,如果你确认加的这个定时器没有影响程序其他逻辑,十有八九就是你新开的这个任务正好使系统栈溢出了。
2. 看你是否真的需要屏蔽中断?你要写自己的中断程序,可能要处理的东西很多,保护现场什么的。你对SD card的操作要关中断是MFS的要求还是你的多个任务有可能同时使用SD或SPI,如果是后者你可能用互斥好一些。
MQX使用的内存可能比你想象的要多一些,特别是你还用它的MFS或RTCS时。
回复 支持 反对

使用道具 举报

该用户从未签到

33

主题

441

帖子

0

新手上路

Rank: 1

积分
7703
最后登录
1970-1-1
 楼主| 发表于 2012-3-5 23:03:29 | 显示全部楼层

RE:MQX使用中的几个问题,请教于高人

多谢楼上的回复
不过问题不是你分析的那个原因,所有任务堆栈使用情况我们都跟踪了,远远没有用完,可以这么说,每个任务的堆栈使用了1/3都不到。
关中断的问题,我们发现在往SD内写文件时,如果此时被打算,比如调度器调度了另一个优先级更高的任务,那么经常导致写入文件数据出错,联系运行几个小时,几乎肯定会导致文件系统崩溃,即文件系统彻底被破坏,只有重新格式化才行。
所以我们就想每次在往SD卡内写文件是,禁止中断,希望不被任何东西打断。但是那个_int_disable根本就起不到效果,居然连调度器都还在继续调度,实在不解
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2012-3-5 23:06:35 | 显示全部楼层

RE:MQX使用中的几个问题,请教于高人

你用什么监视堆栈?监视MQX了吗?
回复 支持 反对

使用道具 举报

该用户从未签到

33

主题

441

帖子

0

新手上路

Rank: 1

积分
7703
最后登录
1970-1-1
 楼主| 发表于 2012-3-6 12:07:54 | 显示全部楼层

RE:MQX使用中的几个问题,请教于高人

用klog,mqx本身就自带的
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2012-3-6 12:29:18 | 显示全部楼层

RE:MQX使用中的几个问题,请教于高人

klog只能看你自己的任务吧?MQX的要TAD才行。
如果你自己的任务分配太多栈,MQX可能再开新任务没栈可用,会导致部分功能不起作用,表象就是不稳定。
我就是被这个问题憋了近一个月,后来用TAD分析才发现。
回复 支持 反对

使用道具 举报

该用户从未签到

33

主题

441

帖子

0

新手上路

Rank: 1

积分
7703
最后登录
1970-1-1
 楼主| 发表于 2012-3-7 20:19:39 | 显示全部楼层

RE:MQX使用中的几个问题,请教于高人

klog可以看所有任务堆栈使用情况啊,我们通过shell,周期性输出堆栈使用情况,仔细观察了,从没有超过分配量的1/3
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2012-3-7 21:34:06 | 显示全部楼层

RE:MQX使用中的几个问题,请教于高人

klog看不到底层如IO驱动等占用的内存吧?MFS我没用过,但我用RTCS时,ENET部分在IO内存就用掉近10K,而在klog是看不到这部分的,只能看到我自己给TCP等留的缓冲区。你的MFS应该有同样的问题
回复 支持 反对

使用道具 举报

该用户从未签到

33

主题

441

帖子

0

新手上路

Rank: 1

积分
7703
最后登录
1970-1-1
 楼主| 发表于 2012-3-11 11:09:56 | 显示全部楼层

RE:MQX使用中的几个问题,请教于高人

你说的IO内存,那应该是堆的内存,不是任务的堆栈内存啊,跟这个没关系。堆内存分配如果失败,比如内存不够了,那么应该是你所发起的操作终止,不会导致系统挂掉。比如enet如果收发数据时,buffer分配就失败了,则会导致网络收发数据出错,但不会导致系统挂掉。
另外,我后来把mfs干掉了,自己写了个巨简单的“文件系统”,好用内存极小,不会超过1KB,SD卡的问题是解决了,但系统死机复位还是老样子。应该跟MFS无关系
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

99

帖子

0

中级会员

Rank: 3Rank: 3

积分
322
最后登录
1970-1-1
发表于 2012-3-12 09:56:32 | 显示全部楼层

RE:MQX使用中的几个问题,请教于高人

你现在能确认是系统内核挂掉了吗?还是系统IO或你的任务分配不到应得内存导致部分功能失效?
因为不了解你的硬件和软件结构,不好乱分析。但不管是堆或任务的栈,如果你没扩内存,总共就64K,哪部分分不到足够的内存都会出问题。
就像你提到的定时关LCD任务,不应该影响到其它任务。我建议你试一下暂时关掉这个任务,新加一个测试任务,你算一下你的任务,系统IO等占的内存,把64K剩下内存全用在测试任务内,而且测试任务不调用任何系统资源、函数,只做简单运算把全部分配的内存用掉。如果你的系统没有内存问题,这个任务应该不会影响到你的系统。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-12 17:06 , Processed in 0.105238 second(s), 30 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表