2.4.8.使用 Volatile¶
2.4.8.2.外设访问¶
- 访问表示存储器映射外设的存储器位置时,必须使用 Volatile 关键字。
- 此类存储器位置可能会以编译器无法预测的方式更改值。
- 这可确保编译器完全按照 C 代码中的要求保留对存储器的读写次数。
- 缺少 Volatile 限定符可能会导致编译器错误地优化掉或重新排序读取/写入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | staticinlinevoidGPIO_writePin(uint32_tpin,uint32_toutVal){volatileuint32_t*gpioDataReg;uint32_tpinMask;//// Check the arguments.//ASSERT(GPIO_isPinValid(pin));gpioDataReg=(uint32_t*)GPIODATA_BASE+((pin/32U)*GPIO_DATA_REGS_STEP);pinMask=(uint32_t)1U<<(pin%32U);if(outVal==0U){gpioDataReg[GPIO_GPxCLEAR_INDEX]=pinMask;}else{gpioDataReg[GPIO_GPxSET_INDEX]=pinMask;}} |