7429|29

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

pxa303 boot启动 全局变量被意外修改 惊险刺激 请大虾解答。 [复制链接]

在boot启动的过程中发现全局变量莫名其妙地被修改了。

因为这个时候系统还没有跑起来,所以我分析故障有三个原因。

指针越界访问:
    因为修改前后根本没有修改变量的任何代码,所以这个我基本排除。

中断服务程序:
    我查看了中断服务程序,修改的都是些局部变量,而且地址都是向着增加的方向。全局变量的地址比临时变量的地址小,临时变量存储在堆中。

栈溢出:
    觉得这个可能性很大。因为我在调试的时候发现,当代码量增加的时候程序就特别不稳定,呈现递增趋势,多到一定程度程序会非常慢,再多的话程序就根本无法运行了。当大量减少代码的时候程序运行很稳定。
    可是我的疑惑出来了。在分析代码的时候栈空间是非常大的呀。我的这部分boot程序镜像只有22K,从sp指向的地址到全局数据区一共也有2多k的空间。这个空间应该是足够用的呀。这时怎么回事那?

期待大虾解答。

最新回复

学习经验了  详情 回复 发表于 2009-12-15 16:19
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我以前碰到过这种问题,当时是stack溢出导致,建议你先调整一下
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
看看全局变量都在哪里被修改的,如果没有被非法修改,再看自己的程序,有没有内存覆盖的问题吧

如果还没有,再考虑stack

从简单的问题开始,一个个排除
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
标题很雷人啊,呵,刺激

某些局部函数内有无用到static?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

5
 
LZ 怀疑是 stack, 那就用 assembly 写一个 GetSP 的 function

GetSP
mov    a1, sp
mov    pc, lr

再在每一个 function 的 entry point 加入一句

DWORD GetSP(void);

RETAILMSG(1, (TEXT("SP=0x%X @ function XXX\r\n"), GetSP()));

再去对对看您对 Stack 的规划即可

Paul, Chao @ Techware
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
是不是全局变量没有正确的从flash复制到内存.
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
内存覆盖
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 3 楼 programmerno1 的回复:
标题很雷人啊,呵,刺激

某些局部函数内有无用到static?


吸引眼球用的,呵呵。

有用到的,但是我没有仔细查,变量太多了。但是在数据被修改前后是没有用到static的,中断服务程序不知道用到没有。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 4 楼 paul_chao 的回复:
LZ 怀疑是 stack, 那就用 assembly 写一个 GetSP 的 function

GetSP
mov? ? a1, sp
mov? ? pc, lr

再在每一个 function 的 entry point 加入一句

DWORD GetSP(void);

RETAILMSG(1, (TEXT("SP=0x%X @ function XXX\r\n"), GetSP()));

再去对对看您对 Stack 的规划即可

Paul, Chao @ Techware


顶礼膜拜,回头试一下这种方法,强悍
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 
各位大侠,如果调整堆栈的话是不是修改sp的初始值就可以?例如
  MOV     SP, r2             ; Assign stack pointer for IRQ handler
  MOV     SP, r2             ; Assign stack pointer for SVC handler

IRQ的sp是固定的,我缩小了IRQ stackzize的大小。向下移动了SVC的sp指针。这样就加大了SVC的stack size。可是故障仍然存在。
我这样调整堆栈对吗?

让我奇怪的是代码量减少的话数据就不会出错,而且很稳定。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
paul_chao大侠,返回值为什么放在a1中?a1就是r1吧?没有参数的话是不是返回值放在r0中?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

12
 
标题党,嘿嘿
友情帮顶
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

13
 
中断全部关闭还是出现那个问题。
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 9 楼 sailorlyq 的回复:
各位大侠,如果调整堆栈的话是不是修改sp的初始值就可以?例如
? MOV? ? SP, r2? ? ? ? ? ? ; Assign stack pointer for IRQ handler
? MOV? ? SP, r2? ? ? ? ? ? ; Assign stack pointer for SVC handler

IRQ的sp是固定的,我缩小了IRQ stackzize的大小。向下移动了SVC的sp指针。这样就加大了SVC的stack size。可是故障仍然存在。
我这样调整堆栈对吗?

让我奇怪的是代码量减少的话数据就不会出错,而且很稳定。


呵呵,典型的stack问题的特征
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

15
 
guopeixin大侠能不能说的更详细一些呀,多谢。
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

16
 
学习
 
 
 

回复

49

帖子

0

TA的资源

一粒金砂(初级)

17
 
在调试的时候发现一个问题,常量的话是放在代码段中还是数据段中呢?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

18
 
找到答案了,在代码段中。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

19
 
刚才试验了
GetSP
mov    a1, sp
mov    pc, lr

但是出现了一个问题,程序执行的时候被中止了。
我可以这样调用GetSP吗?

int tem = GetSP();
编译的时候没有出错。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 4 楼 paul_chao 的回复:
LZ 怀疑是 stack, 那就用 assembly 写一个 GetSP 的 function

GetSP
mov? ? a1, sp
mov? ? pc, lr

再在每一个 function 的 entry point 加入一句

DWORD GetSP(void);

RETAILMSG(1, (TEXT("SP=0x%X @ function XXX\r\n"), GetSP()));

再去对对看您对 Stack 的规划即可

Paul, Chao @ Techware



Paul, Chao大侠给的原型是DWORD GetSP(void);返回值为DWORD型。
楼主用int tem = GetSP(); 的话,函数编译时自己做了类型转换。不清楚楼主的具体用法,个人感觉这样来用并不能解决程序执行中止的问题。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表