打印
[ARM入门]

颠覆了我对C语言的认知

[复制链接]
1240|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
废话不多说,先上图!


此部分代码是将 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; ),这应该是编译器的问题吧!

解决for循环跳出问题.png (571.08 KB )

解决for循环跳出问题.png

使用特权

评论回复
板凳
HappyXue| | 2019-8-5 09:40 | 只看该作者
for循环条件的中间那个表达式每次都会重新计算。重新计算不可能只计算一个<号判断,肯定后面的减法也要重新计算。这个应该不算编译器的问题,应该是C标准规范定义的吧。

使用特权

评论回复
地板
sfesdm| | 2019-8-5 10:04 | 只看该作者

找找eaddr变成4700的原因

使用特权

评论回复
5
zwmasdf| | 2019-8-6 08:40 | 只看该作者
问题出在703行saddr += 256这一句话
由于你的saddr是动态改变的,导致for循环的 i<eaddr-saddr每次判断eaddr-saddr的值是动态改变的
而用变量赋值到z后,由于i < z是固定的,也就不存在图1的问题了

使用特权

评论回复
6
l435799304|  楼主 | 2019-8-6 12:47 | 只看该作者
HappyXue 发表于 2019-8-5 09:40
for循环条件的中间那个表达式每次都会重新计算。重新计算不可能只计算一个 ...

明白了,是我自己写的BUG

使用特权

评论回复
7
l435799304|  楼主 | 2019-8-6 12:47 | 只看该作者
sfesdm 发表于 2019-8-5 10:04
找找eaddr变成4700的原因

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

使用特权

评论回复
8
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 循环,谢谢!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

200

帖子

2

粉丝