You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 04:10:32