This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320F2.8335万:使用编译器优化强制执行寄存器的虚拟读取

Guru**** 2609285 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/635514/ccs-tms320f28335-force-dummy-read-of-register-with-compiler-optimization

部件号:TMS320F2.8335万

工具/软件:Code Composer Studio

您好,是否有办法告诉编译器即使未使用读取值,也不从寄存器中删除读取?  例如,我具有从SPI从属设备读取的以下函数:

void esc_read8 (uint16_t地址,void*数据,uint16_t* al_event){
SPI_START

uINT16_t地址数据[2];
uINT16_t虚拟;

address_data[0]=(address & 0x1FE0)<<3;//address 12:5=>前8位
address_data[1]=((address & 0x001F)<< 11)| esc_CMD_READWS;//(address 4:0,command 2:0)=>前八位

//第一步:执行传输相位(推入txfio)

//写入地址/命令
dint;//将此部分设为原子部分
SPI_Transmit (address_data[0]);//将第一个字放入txfio中
SPI_Transmit (address_data[1]);//将第二个字放入txfio中
SPI_Transmit (ESC_WAIT);//发送等待状态字节(第三个字)
SPI_Transmit (ESC_TERM);//请求最后一个字节
EINT;

//第二步:执行接收阶段(从rxfio弹出)

//检查rxfifo是否有收到的单词
而(SpiaRegs.SPIFFRX.bit.RXFFST < 1){}//请在此处等待,直到我们在rxfio中收到至少1个单词
*al_event = SpiaRegs.SPIRXBUF;//读取所有事件数据,从rxfifo收到的第一个单词

//检查rxfifo是否有收到的单词
而(SpiaRegs.SPIFFRX.bit.RXFFST < 1){}//请在此处等待,直到我们在rxfio中收到至少1个单词
*al_event ||(SpiaRegs.SPIRXBUF <<8);//从rxfifo读取第二个收到的单词

//检查rxfifo是否有收到的单词
而(SpiaRegs.SPIFFRX.bit.RXFFST < 1){}//请在此处等待,直到我们在rxfio中收到至少1个单词
虚拟= SpiaRegs.SPIRXBUF;//从rxfifo读取第三个接收到的单词

//检查rxfifo是否有收到的单词
而(SpiaRegs.SPIFFRX.bit.RXFFST < 1){}//请在此处等待,直到我们在rxfio中收到至少1个单词
((uint16_t*)数据)[0]= SpiaRegs.SPIRXBUF;//从rxfifo收到第四个单词

SPI_STOP
}

因为我正在读入变量'Dummy’,并且以后从未在函数中使用过它,所以我得到了以下编译器警告:  

#552-D变量“dummy”已设置,但从未使用

我想确保编译器不会优化这种看似不必要的读取,因为从SPIRXBUF读取的值实际上会从SPSPI RXFIFO中弹出一个值,即使该值以后不会在函数中使用。

编译器版本:TI v 16.9。1LTs.

CCS版本:7.2 .0.0.0013万

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    I like to sure that the compiler does not optimize away this s坪 上不必要的read,因为从SPIRXBUF读取实际上会从SPI RXFIFO中弹出一个值,即使该值以后不会在函数中使用。

    尝试将变量声明为volatile:

    易失性uint16_t伪; 

    volatile限定符应防止编译器优化器删除 看似不必要的读取。

    我认为宣布 SpiaRegs为挥发也会有同样的效果。