如何阻止Keil v5.36的armclang优化C/C++特定代码块?
问题:Armclang v6 如何让指定代码块/类相关函数跳过-Oz+LTO优化?
开启 -Oz(镜像大小优化)+ LTO 优化后,我编写的C++字符串比较代码出现异常。尝试用volatile修饰变量,但变量仍被编译器优化。
问题代码
getBusStatus函数
bool INA239::getBusStatus() { volatile uint8_t ManfId[3] = "TI"; volatile uint8_t* data = readReg(INA239_REG_MANUFACTURER_ID); volatile bool result = !memcmp((uint8_t*)data, (uint8_t*)ManfId, 2); return result; }
readReg函数(SPI DMA读取)
该函数通过SPI DMA读取数据,SPI缓冲区显示读取操作本身正常:
uint8_t* INA239::readReg(uint8_t RegNo) { SPITxBuffer[0] = (RegNo << 2) | 0x01; SPITxBuffer[1] = 0x00; SPITxBuffer[2] = 0x00; while(!DSPI->ModeChange(GPort, GPin, INA239_CPOL, INA239_CPHA)); while(!DSPI->TXRX(SPITxBuffer, SPIRxBuffer, INA239_SPIBUFFERSIZE + (RegNo == INA239_REG_POWER))); while(DSPI->Maintain); return &SPIRxBuffer[1]; }
函数内部会发送数据并等待HAL_SPI_TxRxCpltCallback回调完成。
临时解决方案与现状
在volatile uint8_t* data = readReg(INA239_REG_MANUFACTURER_ID);后添加HAL_Delay(1)能临时解决问题,但关闭优化(-O0)时无需此操作,说明优化后的代码与DMA逻辑存在兼容性问题。
将DSPI->Maintain设为volatile bool后,汇编代码恢复正常,但我希望让所有INA239相关函数都不被优化。尝试过#pragma系列指令、__attribute__属性等方法均无效,请问Armclang v6下有没有可靠的方法让指定代码块/类的所有函数跳过优化?
内容的提问来源于stack exchange,提问作者lazba
相关产品推荐
相关产品推荐

