搜索
bottom↓
回复: 22

msp430一个全局变量 无故 自动改变,不知道怎么回事

[复制链接]

出0入0汤圆

发表于 2016-11-22 13:24:04 | 显示全部楼层 |阅读模式
编译器用的是IAR FOR 430,在main里定义了个变量text_key_flag=0, 这个变量只在外部中断中将其值修改为1。  头文件声明为extern变量,在另个.c文件中包含该头文件,然后把这个变量用仿真器调试显示出来,

发现这个变量会自己变化,但每次值都是0x39, 不知道为什么会无故变化?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2016-11-23 19:29:30 | 显示全部楼层
本帖最后由 circle_head 于 2016-11-23 19:37 编辑

感谢各位的帮助:

问题解决了  是数组越界了, 下面就说下是怎么越界的。

msp430通过串口给GPRS模块发送数据, GPRS模块有个 回显 功能,在使用的时候这个功能是打开的, 每次发送完数据GPRS模块都会将指令返回回来,程序中定义了一个专门接收GPRS数据的数组,

要接收GPRS数据的长度m是固定的(自己规定的),所以定义的接收数组长度也固定为m,  但是每次发送完AT指令后,回显得数据长度大于m,就导致了接收数组越界。

解决方法有两种

1 通过ATE1指令关闭GPRS模块的回显功能。

2 增加接收数组的长度。


******************************************************************************************************************************************************

补充: 如何看在IAR中看栈的大小(下面是转载)

在tool选项中有个options 里面有message选项 选择ALL

编译完成后,IAR会给出有多少代码和ram被占用。如果要看具体语句占用的容量,需要看汇编后的汇编代码,找C预言对应产生的汇编代码那段,会给出每条语句地址,这样就能知道具体占用多大。

以msp430f135为例,它是512bytes的ram,起始地址为200h,终止地址为3ffh,所以它的变量是从200h开始,向3ffh方向存放,而堆栈是从3ffh开始,向200h方向压栈。

当变量存储空间和堆栈最大占用空间在中间相遇时,就发生了堆栈溢出。

最近在MSP430-169LCD(MSP430F169,RAM为2KB)调试一些ucos演示例子,IAR for MSP430默认的堆栈大小是80字节,编译可以通过,运行结果不确定性,调试过程会提示"the stack pointer for stack is outside the stack range",堆栈溢出。那么,到底设置多大的堆栈够用且不浪费呢。
一、合理设置堆栈大小
首先,查看程序共需要多大的堆栈,生成map文件,方法如下:

图1 生成map文件
    生成的map文件在项目目录下的/Debug/List,打开map文件在CALL GRAPH找到找到栈的最大使用量(我的理解是main主函数,用栈最多,所以直接拉到文件末尾,靠近SEGMENTS IN ADDRESS ORDER的地方),如下图所示:

图2 最大栈使用
    由上图可知,最大栈使用量是00000076(注意这里是16进制),即118字节。
接着,设置堆栈大小,方法如下,可以设置比最大栈稍微大一些:-)

图3 设置栈大小

二、一点小心得
通过上述方法,设置堆栈后,再编译有可能会报如下连接错误(受限的内存远不够使用):

图4 内存不够用链接错误
此时,唯一的办法就是重新设计程序了。在单片机上跑uC/OS,可以通过以下方法来减少内存使用:
    (1)如果是跑uC/OS,可以在os_cfg.h文件配置系统,如将最大任务数(OS_MAX_TASKS)设小一些,关掉一些扩展功能(以EN结尾的变量)
    (2)将一些局部变量数组设成全局变量(我就遇到这个问题,我想在MSP430-169LCD完成类似printf功能,难免需要一些字符数组)



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2016-11-22 13:42:48 | 显示全部楼层
数组越界、堆栈溢出

出0入49汤圆

发表于 2016-11-22 13:44:03 | 显示全部楼层
加volatile 声明吧

出0入0汤圆

发表于 2016-11-22 14:45:03 | 显示全部楼层
真相在二楼

出0入8汤圆

发表于 2016-11-22 15:45:46 | 显示全部楼层
加数据断点  调试 看看

出0入0汤圆

发表于 2016-11-22 16:53:43 | 显示全部楼层
数组越界、堆栈溢出+1

出0入0汤圆

发表于 2016-11-22 18:29:12 来自手机 | 显示全部楼层
自古二楼出真相

出0入31汤圆

发表于 2016-11-22 19:31:44 来自手机 | 显示全部楼层
栈溢出啦

出0入0汤圆

 楼主| 发表于 2016-11-22 21:36:48 | 显示全部楼层

什么能导致堆栈溢出呢?

出0入0汤圆

 楼主| 发表于 2016-11-22 21:50:47 | 显示全部楼层
本帖最后由 circle_head 于 2016-11-23 19:07 编辑
tirion 发表于 2016-11-22 13:42
数组越界、堆栈溢出


程序中有一个一秒的定时中断  用来读取实时时间,还有个外部中断用来触发事件,   不知道什么导致堆栈溢出的可能性比较大?

出0入0汤圆

发表于 2016-11-22 22:25:07 | 显示全部楼层
如果调试器支持数据断点就方便了

出0入0汤圆

发表于 2016-11-22 22:28:54 | 显示全部楼层
数组越界

出0入0汤圆

发表于 2016-11-22 22:49:25 | 显示全部楼层
在main里定义了个变量text_key_flag=0 ?

extern可以定义在main里吗?要不放在main外试试?

出0入0汤圆

发表于 2016-11-22 23:08:03 | 显示全部楼层
wistarky 发表于 2016-11-22 22:49
在main里定义了个变量text_key_flag=0 ?

extern可以定义在main里吗?要不放在main外试试? ...

他应该是说在mian.c里定义了那个变量,然后在另外一个.h文件声明为extern,我是猜的。另问题应该就是二楼所说的,被越界的操作改写了你变量所在地址,可以反推看你那个变量所在地址附近是什么变量,看哪里对它操作,是否操作越界了。我都是乱说的,自己查查看了。

出0入0汤圆

发表于 2016-11-22 23:49:17 | 显示全部楼层
如果支持数据断点,直接可以找出谁改写了数据
如果不支持,在BSS清零之后,查看该值是否为0;然后在main初始化之后,查看该变量是否为0
另,优化级设置成O0,加volatile

出0入0汤圆

发表于 2016-11-23 09:15:57 来自手机 | 显示全部楼层
二楼的意思就是你代码有其他地方变量使用有问题导致这块内存数据被覆盖了。

出0入0汤圆

发表于 2016-11-23 09:37:00 | 显示全部楼层
二楼正解  遇到过相同问题

出0入0汤圆

 楼主| 发表于 2016-11-23 19:04:44 | 显示全部楼层
wistarky 发表于 2016-11-22 22:49
在main里定义了个变量text_key_flag=0 ?

extern可以定义在main里吗?要不放在main外试试? ...

extern 没有放在main里面的

出0入0汤圆

 楼主| 发表于 2016-11-23 19:08:45 | 显示全部楼层
tirion 发表于 2016-11-22 13:42
数组越界、堆栈溢出

嗯,堆栈溢出了,现在问题解决了

出0入17汤圆

发表于 2016-11-24 11:28:30 | 显示全部楼层
circle_head 发表于 2016-11-23 19:29
感谢各位的帮助:

问题解决了  是数组越界了, 下面就说下是怎么越界的。

数组的连续赋值,要先判断大小,看看是否越界

出0入4汤圆

发表于 2016-11-24 11:29:45 | 显示全部楼层

数组越界、堆栈溢出+10086
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-28 00:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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