外设驱动代码编写中有一个问题值得注意,不单是外设驱动,所有对外设寄存器进行操
作的代码都必须注意一个问题,即对外设寄存器的操作必须使用
volatile
修饰符。虽然可以在
VxWorks
提供的
sysPhysMemDesc
数组初始化时将外设寄存器区间设置为
non-cachable
,但是
还是要使用
volatile
修饰符,因为
MMU
机制并非在任何条件下都有效,如
bootrom
运行期间
就不使用
MMU
机制,且
VxWorks
启动的早期阶段也没有
MMU
机制的帮助,而在这个过程
中都需要对外设进行操作。
很多驱动程序出现一些异常的问题,仔细检查每个寄存器的配置都没有问题,甚至从网
上下载一个针对该硬件的标准配置程序,在其他平台上可用,但是就是在自己的平台上运行
不正常,此时就需要特别注意设备的寄存器区域是否都定义在
volatile
型。
volatile
是一个
C
语言规范中定义的修饰符,当一个变量使用该修饰符进行定义时,就表示
CPU
对该变量的每
次访问都从
RAM
中(寄存器实际上也是
RAM
)取,而不要使用
CPU
内部的
cache
值,或
者简单地说,使用
volatile
修饰符就是从单个变量的层次上禁止
cache
。