雪希年 · 2020年05月07日

FPGA + Cortex-M3核 Keil示例代码出错?

各位好,
我在搭建好系统并实现了Ram和Rom后,编写了如下的一段代码。

int main(void){
    volatile uint8_t i = 0;
    while(i < 10){
        i++;
    }
    while(1);
}

我在while(1)的地方加上断点,程序会跑到这里。之后可以查看i的值。
神奇的是,这个时候i的值不是10,而是11.
这是为什么呢?
希望有人能帮帮我。。被这个卡好久了。。。

3 个回答 得票排序 · 时间排序
黄乐天@UESTC · 2020年05月10日

可以在调试时对着编译后反汇编出来的程序走一下单步看看。

雪希年 · 2021年12月16日

好久不见。
这个问题我已经解决了,通过在软件中仿真我知道原先的示例代码是有错的。主要原因是在AXI4 bus读写的地方。原先的写法在写操作后马上读,会读到旧的数据,因此会多循环一次。
这也是为什么不加volatile,或者单步,都看不出来,因为单步情况下写操作往往会延后几个时钟。而不加volatile由于编译器优化,则根本不会反复读写内存。

海大赵兄 · 2020年05月22日

请问你用的什么板子?

你的回答