GCC中的'__IO'指令是什么?

Cha*_*nya 13 embedded gcc

我正在使用嵌入式设备,并且有一些代码最初是使用IAR编译器编译的.

我试图使用GCC编译器重新编译所述代码.

有一个特殊的声明:typedef __IO,它根本没有被编译("无法识别的符号错误").

任何人都可以建议我如何正确地编译这个语句?

Cli*_*ord 12

如果无法识别,那将是因为未包含包含该定义的适当系统头.

它将在随工具链提供的芯片支持头文件中定义.它是类型限定符,或者更确切地说是一个#define将扩展为类型限定符的宏().它用于例如如下:

__IO uint8_t CSSR;
Run Code Online (Sandbox Code Playgroud)

uint8_t是类型,所以__IO实际上不能是a,typedef因为它不适用于类型有效的地方.__IO宏扩展到特定编译器所需的任何内容,以确保正确的I/O访问和寻址.在I/O是内存映射的典型情况下,它将简单地扩展为,volatile因为所有I/O都应声明为volatile,以确保未优化显式访问.

如果您想确定,请下载IAR工具的演示版本,并查看头文件中的特定体系结构的定义方式.否则你可能只是使用#define __IO volatile


小智 7

_IO意思挥发性按C语言...这将不会优化代码,并且其中值使用_IO会产生不可预测的变量声明或不编译器和用户的知识将被改变


Pla*_*ove 6

这是一个老问题,但如果有人想了解 ARM 微控制器的问题,您可以看到 CMSIS 库中提供了该定义。例如,__IOcortex-m4 的定义如下:

#define     __IO    volatile             /*!< Defines 'read / write' permissions */
Run Code Online (Sandbox Code Playgroud)

完整的块复制粘贴在下面(来源):

#ifdef __cplusplus
  #define   __I     volatile             /*!< Defines 'read only' permissions */
#else
  #define   __I     volatile const       /*!< Defines 'read only' permissions */
#endif
#define     __O     volatile             /*!< Defines 'write only' permissions */
#define     __IO    volatile             /*!< Defines 'read / write' permissions */

/* following defines should be used for structure members */
#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */
#define     __OM     volatile            /*! Defines 'write only' structure member permissions */
#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */
Run Code Online (Sandbox Code Playgroud)