通常有这样的定义
#define __IO volatile /*!< Defines 'read / write' permissions */
就是C语言关键词volatile,有这个关键词的变量,保证每次读到的都是对应内存中的值。简单理解就是禁止优化。
举两个例子
如果在a赋值语句和b赋值语句之间触发了中断,中断里对testV改变值。
出中断后,由于优化的存在,恢复现场后R5的值和实际testV值不同了,就会造成错误。
[C] 纯文本查看 复制代码 uint8_t testV;
a = testV; // 这里会把testV的值给到寄存器例如R5然后赋给a
b = testV; // 如果有开优化 b变量可能会被直接赋值R5 节省几条语句操作
使用volatile 关键词,即使在a赋值语句和b赋值语句之间触发了中断,中断里对testV改变值。
出中断后,执行b赋值,程序也依然会从实际内存中重新读值。
[C] 纯文本查看 复制代码 volatile uint8_t testV;
a = testV; // 这里会把testV的值给到寄存器例如R5
b = testV; // 再次把testV的值给到寄存器再赋给b
对于硬件相关寄存器通常都会有这个__IO ,我觉得这也是徒增理解成本。
在硬件外设相关或者跨线程的变量一般要加 volatile 关键词修饰。
菜鸟教程讲的很详细
C/C++ 中 volatile 关键字详解 | 菜鸟教程 (runoob.com)
|