各位好,
我在搭建好系统并实现了Ram和Rom后,编写了如下的一段代码。
int main(void){
volatile uint8_t i = 0;
while(i < 10){
i++;
}
while(1);
}
我在while(1)的地方加上断点,程序会跑到这里。之后可以查看i的值。
神奇的是,这个时候i的值不是10,而是11.
这是为什么呢?
希望有人能帮帮我。。被这个卡好久了。。。
各位好,
我在搭建好系统并实现了Ram和Rom后,编写了如下的一段代码。
int main(void){
volatile uint8_t i = 0;
while(i < 10){
i++;
}
while(1);
}
我在while(1)的地方加上断点,程序会跑到这里。之后可以查看i的值。
神奇的是,这个时候i的值不是10,而是11.
这是为什么呢?
希望有人能帮帮我。。被这个卡好久了。。。
可以在调试时对着编译后反汇编出来的程序走一下单步看看。
请问你用的什么板子?
好久不见。
这个问题我已经解决了,通过在软件中仿真我知道原先的示例代码是有错的。主要原因是在AXI4 bus读写的地方。原先的写法在写操作后马上读,会读到旧的数据,因此会多循环一次。
这也是为什么不加volatile,或者单步,都看不出来,因为单步情况下写操作往往会延后几个时钟。而不加volatile由于编译器优化,则根本不会反复读写内存。