为什么Nios GCC编译器会对我的外设进行多次读取?

外设的读取通常通过使用指针来完成。例如,以下代码读取存储在peripheral_base_address中的值,并将其放在read_value变量中。
 int * pointer_to_peripheral =(int *)(peripheral_base_address); read_value = * pointer_to_peripheral; 

但是,可以优先选择来自同一地址的多次读取。例如,对于下面的代码,Nios CPU将从peipheral_base_address读取数据值并将其复制到read_value和read_value2中。但是,peripheral_base_address处的数据值可能在读取之间发生了变化,并且不会读取新数据值。

 int * pointer_to_peripheral =(int *)(peripheral_base_address);;
read_value = * pointer_to_peripheral;
read_value2 = * pointer_to_peripheral; 

所有指针都应声明为volatile类型,以防止后续读取被gcc编译器优化掉。上面使用的指针应声明如下:

 volatile int * pointer_to_peripheral =(int *)(peripheral_base_address); 
编辑 重设标签(回车键确认) 标为违禁 关闭 合并 删除

提问于 2018-08-17 21:07:27 +0800

这个帖子被标记为一个社区wiki

这个帖子是一个wiki(维基). 任何一个积分 >500的人都可以完善它