硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2954|回复: 3
收起左侧

[有问必答] JLINK单步追踪程序时,只要追踪的程序段有字符串操作,写I2C的缓冲区数组10%的机率

[复制链接]

13

主题

56

回帖

95

积分

初级会员

积分
95
发表于 2017-4-22 18:18:52 | 显示全部楼层 |阅读模式
    请教版主:

          我之前遇到过奇怪的问题,用JLINK单步追踪F407程序,只要追踪的程序段有字符串操作,程序就乱执行。
但是该程序我用TURBO C++3.0编译器下用“模拟数据”单步追踪,则完全正确。


      今天我又遇到另外1个奇怪的问题,我的主程序有大量字符串操作代码,当某个条件触发时,我会写I2C。
单步追踪时,我明明往一个全局的缓冲区数组中填写的是1000,2000,3000,结果把该全局缓冲区数组的数值写到I2C后,该缓冲区数组的数值10%的机率会变成的随机数。
      我确信(1)、RAM未超限
                  (2)、字符串操作代码和全局的缓冲区数组没有什么关联。
      当我把主程序有大量字符串操作代码屏蔽后,测试了200次,每次写I2C都正确,写完I2C后,全局缓冲区数组的数值一直是1000,2000,3000.


          请教版主,为什么呀!
         
我是新手,请多多关照。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2017-4-22 22:46:48 | 显示全部楼层
问题找到啦,我的KEIL栈大小设置为400.。应该是栈空间溢出导致的。


    我把下面的子程序A,程序B,子程序C,子程序D内的局部变量数组定义为全局数组,故障排除。

    .


    子程序A内定义了局部变量 uint16_t a[125];,而且子程序A有1个入口参数,该入口参数是1个数组,实参长度为uint8_t aa[255]
    子程序B内定义了局部变量uint16_t b[125];
    子程序C的入口参数为一个结构体,结构体包含1个int16_t c[125]的数组
    子程序D内定义了局部变量 uint8_t [34];

      子程序A结构如下:

     func_a(uint8_t aa[255])
   {
       调用子程序B;
           调用子程序C;
       调用子程序D;
}

      请教版主,是这个原因吗?
我是新手,请多多关照。
回复

使用道具 举报

13

主题

56

回帖

95

积分

初级会员

积分
95
 楼主| 发表于 2017-4-22 22:49:28 | 显示全部楼层
STACK.png
我是新手,请多多关照。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2017-4-23 11:12:24 | 显示全部楼层
应该是栈溢出了,一般情况下,你的栈空间最好搞个0x1000大小。另外局部变量大的话,还得继续加大。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 13:50 , Processed in 0.051160 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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