l435799304 发表于 2019-8-4 22:27

颠覆了我对C语言的认知

废话不多说,先上图!


此部分代码是将 W25Q128JV 内部的数据读出,然后写入到芯片内部 FLASH ,也就是在线更新功能。
原文的想法是,做一个 for 循环,每次写入 256 byte。当写入的数据达到了 eaddr-saddr 长度后,退出该函数。
从串口打印可以看到,写入数据到 0x00004700 的时候退出了函数,理论上不应该是要写到 0x00004D00 才退出函数吗?

l435799304 发表于 2019-8-4 22:33

将 for(i=0; i<eaddr-saddr; ) 中的   i<eaddr-saddr; 改用成固定变量 z 来判断就没有问题 for(i=0; i<z; ),这应该是编译器的问题吧!

HappyXue 发表于 2019-8-5 09:40

for循环条件的中间那个表达式每次都会重新计算。重新计算不可能只计算一个<号判断,肯定后面的减法也要重新计算。这个应该不算编译器的问题,应该是C标准规范定义的吧。

sfesdm 发表于 2019-8-5 10:04


找找eaddr变成4700的原因

zwmasdf 发表于 2019-8-6 08:40

问题出在703行saddr += 256这一句话
由于你的saddr是动态改变的,导致for循环的 i<eaddr-saddr每次判断eaddr-saddr的值是动态改变的
而用变量赋值到z后,由于i < z是固定的,也就不存在图1的问题了

l435799304 发表于 2019-8-6 12:47

HappyXue 发表于 2019-8-5 09:40
for循环条件的中间那个表达式每次都会重新计算。重新计算不可能只计算一个 ...

明白了,是我自己写的BUG

l435799304 发表于 2019-8-6 12:47

sfesdm 发表于 2019-8-5 10:04
找找eaddr变成4700的原因

每次都会递增256,变成4700是正常的

l435799304 发表于 2019-8-6 12:49

zwmasdf 发表于 2019-8-6 08:40
问题出在703行saddr += 256这一句话
由于你的saddr是动态改变的,导致for循环的 i ...

感谢大佬解答,
所以每次递增到4700的时候, 4C74 - 4700 = 574,然后 i 此时等于 700,所以会退出 for 循环,谢谢!
页: [1]
查看完整版本: 颠覆了我对C语言的认知