OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6547|回复: 8

For循环中局部变量的奇怪问题,应不是栈溢出或优化的问题

[复制链接]

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-11-1
在线时间
37 小时
发表于 2023-4-1 19:34:25 | 显示全部楼层 |阅读模式
10金钱
void Led_08UpdateDisplay()
{
  u8 Row;
  u8 Col;//1
  for(Row=0;Row<LED_HALF_HIGHT;Row++)
  {
    Col=0; //2
    for(Col=0;Col<16;Col++)//3
    {
      Led_08WriteCol(LedDvice.Led08GRam[Row][Col],LedDvice.Led08GRam[Row+16][Col],LedDvice.Led08GRam[Row+32][Col],LedDvice.Led08GRam[Row+48][Col]);
    }
环境:KEIL MDK ,芯片STM32F103C8T6, 0优化  ,这个函数会定时调用。
问题:如果2不赋值,则第二次调用函数的时候Col=16,即上次结束的值。

      内层for循环也就是3,对Col的赋值不起作用。

      在1处定义时直接赋值0,同样不起作用。

      尝试定义为全局变量,结果依然时第二次开始就是16,=0不起任何作用


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-11-1
在线时间
37 小时
 楼主| 发表于 2023-4-1 19:36:13 | 显示全部楼层
应该也不是其他访问越界的问题,因为我把循环控制改成7,第二次进入就是7
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2023-4-2 12:03:23 | 显示全部楼层
你这字体看着真难受
这种奇葩问题 只能debug测试了
光看一个for循环啥也看不出来
回复

使用道具 举报

33

主题

982

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7862
金钱
7862
注册时间
2014-8-13
在线时间
1584 小时
发表于 2023-4-2 15:59:58 | 显示全部楼层
确实不应该是这样的结果。这种bug没遇到过。在MDK里下断点,转到反汇编里看一下能不能发现什么问题,如果反汇编里也是这样的结果,应该是编译器或者IDE的问题。还可以把程序下载到mcu里,用串口输出一下Col的值,说不定调试的时候不正常,下载之后正常了
回复

使用道具 举报

70

主题

6698

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12692
金钱
12692
注册时间
2012-11-26
在线时间
3711 小时
发表于 2023-4-2 21:53:21 | 显示全部楼层
你怎么确定的是几?打印出来的还是怎么确定的
学无止境
回复

使用道具 举报

0

主题

451

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3316
金钱
3316
注册时间
2016-3-19
在线时间
815 小时
发表于 2023-4-3 08:20:50 | 显示全部楼层
for嵌套一直在使用,并未出现楼主所说问题

如果可以读懂汇编   直接读汇编程序看看是哪里问题
Nothing is impossible
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-11-1
在线时间
37 小时
 楼主| 发表于 2023-4-3 11:42:34 | 显示全部楼层
babyrabbit 发表于 2023-4-2 12:03
你这字体看着真难受
这种奇葩问题 只能debug测试了
光看一个for循环啥也看不出来

就是调试发现是这个地方不对,不调试,这个地方怎么看都不会有问题
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-11-1
在线时间
37 小时
 楼主| 发表于 2023-4-3 11:45:03 | 显示全部楼层
mack13013 发表于 2023-4-2 15:59
确实不应该是这样的结果。这种bug没遇到过。在MDK里下断点,转到反汇编里看一下能不能发现什么问题,如果反 ...

我遇到过你说的问题,在线调试,一个简单if语句,里面还不是表达式,就是一个简单的变量,条件为真,KEIL给我既指向if,又执行ELSE,但是下载进去没有问题。这次这个是一会儿对一会儿不对,开始我怀疑是优化问题,于是关了,直接LEVEL0 ,下载进去就是不对
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2016-11-1
在线时间
37 小时
 楼主| 发表于 2023-4-3 11:47:42 | 显示全部楼层
jermy_z 发表于 2023-4-2 21:53
你怎么确定的是几?打印出来的还是怎么确定的

在线调试,因为程序执行不对,所以就在线调试,断点处发现这个值不对,开始以为是什么地方越界误修改了,但是这个地方是栈不是堆,可能性很小,也查看了这个地址周围,都没有越界。就感觉这个值莫名其妙,然后发现是上次循环退出时的值,于是修改循环条件,确定就是循环结束的值。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 12:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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