内核中操作寄存器的方法
由于Linux开启了MMU,所以我们在访问寄存器时,必须要使用寄存器物理地址对应的虚拟地址来访问。
1.内核提供的读写接口
利用内核提供的寄存器读写接口会有较好的可移植性,最重要的是拥有“读写屏障”
- 何谓“读写屏障”?其有何意义?试看以下代码
#define XXX_SET 0xe0200240
#define XXX_EN 0xe0200244
*((volatile unsigned int *)XXX_SET) = 0xffffffff;
*((volatile unsigned int *)XXX_EN) = 0xffffffff;
- 现代编译器为了提高效率,采用的乱序编译,同样,现代soc采用的是乱序执行。对于soc和编译器来说,它们判断这两个寄存器设置的先后顺序没有逻辑关系,所以上述两个寄存器的设置顺序是不定的。但是某些外设硬件来说,需要先配置再使能