volatile只能保证编译器每次都从内存中读取数据,修改完之后直接写会内存,而不是直接读取cpu内部寄存器,或者写入到cpu内部寄存器,但是如果内存存在cache,volatile仍然不能保证数据一致性,因为cpu对这块内存的读写,有可能只是操作了cache,所以:

  1. 有些mcu可能对寄存器地址区域默认做了nocache的软件配置操作,所以直接使用volatile关键字修饰寄存器地址即可保证对寄存器读写的的数据一致性
  2. 有些mcu需要手动调用接口设置某些区域为no cache,例如xtensor架构的某些dsp需要调用xt_set_region_attribute()接口设置寄存器区域为nocache
  3. 存在mmu 管理的,比如linux可以直接用ioremap映射寄存器区域,底层应该会修改对应的页表项中的属性为nocache的

(13条消息) c语言缓存一致性,嵌入式C语言关键字volatile以及cache对数据一致性的影响_凤陶的博客-CSDN博客

https://excalidraw.com/#json=zj5C0qyVHRrDJI2HHxTAR,VGSwNGJ8CKBSYTrFyUPtRw

volatile.svg