5137|19

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

程序执行到最后一句return时出现异常,帮帮忙! [复制链接]

ARM7 44b0,用ADS1.20编译调试。
代码中定义了这样一个函数device_run,如下。
BOOL device_run(BYTE type)
{
          BYTE setAttributeValue;
          MAC_ENUM status;
        PAN_DESCRIPTOR *pPanDescriptor;
          UINT8 n;
          ADDRESS coordAddr;
        MAC_SCAN_RESULT scanResult; // take( 6 + 23 * 4 = 98 ) bytes
       
        //Initialize variables
        myShortAddr = 0xFFFF;
        coordAddr.Extended=coorExtendaddr;


        mlmeResetRequest(TRUE);
       
        // Scan for coordinators
        mlmeScanRequest(ACTIVE_SCAN, CHANNEL_SCAN, 5, &scanResult);

        while (mscInfo.scanStatus == MSC_STATUS_ACTIVE);
        // Go through the result list and pick a coordinator to associate with
        pPanDescriptor = NULL;

        for (n = 0; n resultListSize; n++) {
               if ((mscInfo.pScanResult->a).pPANDescriptorList[n].superframeSpec & SS_ASSOCIATION_PERMIT_BM) {
                        pPanDescriptor = &(mscInfo.pScanResult->a).pPANDescriptorList[n];
                                   goto next;
                        }               
                }
        next:
        if (!pPanDescriptor)  
                return FALSE;
        // Set variables
        panId = pPanDescriptor->coordPanId;
        coordAddr = pPanDescriptor->coordAddress;
               
        // Update PIB attributes       
        mlmeSetRequest(MAC_PAN_ID, &panId);
        setAttributeValue = TRUE;
        mlmeSetRequest(MAC_RX_ON_WHEN_IDLE, &setAttributeValue);
               
        setAttributeValue = BF(pPanDescriptor->superframeSpec, SS_BEACON_ORDER_BM, SS_BEACON_ORDER_IDX);
        mlmeSetRequest(MAC_BEACON_ORDER, &setAttributeValue);
        setAttributeValue = BF(pPanDescriptor->superframeSpec, SS_SUPERFRAME_ORDER_BM, SS_SUPERFRAME_ORDER_IDX);
        mlmeSetRequest(MAC_SUPERFRAME_ORDER, &setAttributeValue);

         // Associate with the selected coordinator
            mlmeAssociateRequest(pPanDescriptor->logicalChannel, pPanDescriptor->coordAddrMode, panId, &coordAddr, 0x0E, TRUE);

            while (myShortAddr == 0xFFFF);
       
        if(type==FFD)
                {
                 mlmeSetRequest(MAC_SHORT_ADDRESS, (BYTE*) &myShortAddr);
                setAttributeValue=TRUE;
               mlmeSetRequest(MAC_ASSOCIATION_PERMIT, &setAttributeValue);
               mlmeStartRequest(panId, CHANNEL, 15, 15, TRUE, FALSE, FALSE, FALSE);
                }
        return TRUE;
}

device_run函数在main函数中以这样的形式调用:
while ( !device_run(FFD) ){...}
问题是这样的:当程序执行到最后一句return TRUE时,按理说应该回到调用它的main函数中,可是,每次都是回到evice_run()里面的return FALSE中(红色标出来了),然后再接着执行时到最后一个}前,接着就异常了,怎么也回不到main函数中。
为什么会这样?大家帮我分析分析,代码贴得有点长,但问题的现象挺明显的。谢谢大家!!

最新回复

不能DEBUG吗? 一步一步 走 就可以啦  详情 回复 发表于 2009-3-3 09:02
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
难道是程序跑飞了?还是调试信息不对呀
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
系统提示Dabort exception!
跳到return FALSE之后,到函数最末端的“}”,然后就是进入反汇编里了
fff15000 [0x00000000]   dcd      0x00000000  ....
之前的代码运行都是正常的。

 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
   while (mscInfo.scanStatus == MSC_STATUS_ACTIVE);
是什么意思呀
如果这个两个相等就循环?
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

5
 
是的,mscInfo.scanStatus这个状态在程序的其他地方会改变的,两个不等,跳出循环。
现在程序已经能够稳定执行到return TRUE 这一句之前,然后就跳回到device_run()函数里的return FALSE这一句中,而不是回到调用它的main函数中。


 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

6
 
没看代码

一般结束时跑飞,肯定是中间出现内存越界
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

7
 
内存越界?那可能跟什么有关系?
我在device_run中用了不少全局变量,会不会跟这个有关?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(中级)

8
 
5楼说得对,出现data abort就是CPU在访问内存时,地址不对了。
LZ可以在程序中多打一些LOG,看看在哪个地方出错了
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

9
 
这个函数中用到了不少全局变量,还用了一个goto,会不会跟这有关?
我仔细查查看。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
多DEBUG
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
多数是内存访问越界。用到数组和指针的地方多看看,分析分析。。。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

12
 
可以试着把return语句适当的返到前面一点,看看函数在哪个地方能够正常返回,这样可以确定函数是在哪里飞掉的。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

13
 
代码很庞大,很多的指针、数组,很多的函数调用、返回,我该怎样去排查错误?
能不能给个更清晰点的思路?
谢谢大家!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

14
 
在wince下能看map文件,ADS下就不知道了。

楼主,这个异常产生原因有这几种可能性:一,指针使用不对,二、CPU访问了不该访问的地址。你仔细检查分析可能产生异常的参数。一般就在附近的,顺藤摸瓜吧。

也只能这么提示了。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
二分法。
先将return TRUE;放到最开始,相当于一进来就return,应该没问题的。
然后放到一半的地方,看看能不能正常返回(功能可能会无法实现完全了)。
这样逐次判断,逐渐就逼近问题所在了。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 shuiyan 的回复:
二分法。
先将return TRUE;放到最开始,相当于一进来就return,应该没问题的。
然后放到一半的地方,看看能不能正常返回(功能可能会无法实现完全了)。
这样逐次判断,逐渐就逼近问题所在了。


厉害,厉害,就这个方法,很快找到什么问题了。就像在wince下使用打印信息一样,虽然有点费时,但是还是很有效的。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 13 楼 gooogleman 的回复:
在wince下能看map文件,ADS下就不知道了。

楼主,这个异常产生原因有这几种可能性:一,指针使用不对,二、CPU访问了不该访问的地址。你仔细检查分析可能产生异常的参数。一般就在附近的,顺藤摸瓜吧。

也只能这么提示了。

试了一下你们的办法,把问题的范围缩小了许多。

问一下怎样的地址算是CPU不该访问的地址?
还有指针使用不对一般都有哪些情况?
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

18
 
函数的传入指针参数,数组访问,调用外部函数,都涉及指针。将这些相关的语句先注释掉,然后再一个一个恢复。

因为你用ADS,所以这样速度更快捷。要是用CE的话,这样有的时候会郁闷死的。

ps:不过现在CE下用Kitl的RealTime Run,很方便。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

19
 
像是跑了,一般不会到RETURN TRUE那的问题。
 
 
 

回复

96

帖子

0

TA的资源

一粒金砂(初级)

20
 
不能DEBUG吗? 一步一步 走 就可以啦
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表