工具/软件:TI C/C++编译器
我遇到了很多问题,编译器优化删除了有用的变量。 我使用TI 16.9 3 LTS C2000编译器。 此时,我让一切都变得不稳定,但即使这样也不总是有效。
我正在寻找一个好的示例。 因此,我可以询问问题是什么:
我有一些SPI通信似乎不起作用:
//! \brief定义串行外设接口(SPI)对象
//!
typedef结构_SPI_Obj_
{
UINT16_t SPICCR; //!< SPI配置控制寄存器
UINT16_t SPICTL; //!< SPI操作控制寄存器
UINT16_t SPIST; //!< SPI状态寄存器
UINT16_t rsvd_1; //!<保留
UINT16_t SPIBRR; //!< SPI波特率寄存器
UINT16_t rsvd_2;//!< 保留
UINT16_t SPIEMU; //!< SPI仿真缓冲寄存器
UINT16_t SPIRXBUF; //!< SPI串行输入缓冲寄存器
UINT16_t SPITXBUF; //!< SPI串行输出缓冲寄存器
UINT16_t SPIDAT; //!< SPI串行数据寄存器
UINT16_t SPIFFTX; //!< SPI FIFO传输寄存器
UINT16_t SPIFFRX; //!< SPI FIFO接收寄存器
UINT16_t SPIFFCT; //!< SPI FIFO控制寄存器
UINT16_t rsvd_3[2]; //!<保留
UINT16_t SPIPRI; //!< SPI优先级寄存器
} SPI_Obj;
//! \brief定义串行外设接口(SPI)句柄
//!
typedef结构_SPI_Obj_ volatile *SPI_handle;
我将其更改为:
//! \brief定义串行外设接口(SPI)对象
//!
typedef结构_SPI_Obj_
{
UINT16_t SPICCR; //!< SPI配置控制寄存器
UINT16_t SPICTL; //!< SPI操作控制寄存器
UINT16_t SPIST; //!< SPI状态寄存器
UINT16_t rsvd_1; //!<保留
UINT16_t SPIBRR; //!< SPI波特率寄存器
UINT16_t rsvd_2;//!< 保留
UINT16_t SPIEMU; //!< SPI仿真缓冲寄存器
volatile uint16_t SPIRXBUF; //!< SPI串行输入缓冲寄存器
volatile uint16_t SPITXBUF; //!< SPI串行输出缓冲寄存器
UINT16_t SPIDAT; //!< SPI串行数据寄存器
UINT16_t SPIFFTX; //!< SPI FIFO传输寄存器
UINT16_t SPIFFRX; //!< SPI FIFO接收寄存器
UINT16_t SPIFFCT; //!< SPI FIFO控制寄存器
UINT16_t rsvd_3[2]; //!<保留
UINT16_t SPIPRI; //!< SPI优先级寄存器
} SPI_Obj;
//! \brief定义串行外设接口(SPI)句柄
//!
typedef结构_SPI_Obj_ volatile *SPI_handle;
之后一切都正常。
那么,我如何防止编译器删除功能代码。只需使每个变量都具有易失性,或者是否有更好的方法。
谢谢!
注:导致此问题的代码:
SPI->SPITXBUF =数据;
SPI->SPITXBUF =数据;
多次写入同一内存位置。 我在硬件I/O,CLA通信和void指针处理方面遇到了这个问题。