我正在使用嵌入式设备,并且有一些代码最初是使用IAR编译器编译的。
我正在尝试使用GCC编译器重新编译所述代码。
有一个特定的声明:typedef __IO
,它根本没有被编译(“无法识别的符号错误”)。
有人可以建议我如何正确编译这个语句吗?
答案 0 :(得分:11)
如果无法识别,那将是因为未包含包含该定义的适当系统头。
它将在随工具链提供的芯片支持头文件中定义。它是类型限定符,或者更确切地说是一个宏(#define
),它将扩展为类型限定符。它的使用例如如下:
__IO uint8_t CSSR;
此处uint8_t
是类型,因此__IO实际上不能是typedef
,因为在类型有效的情况下不使用它。 __IO宏扩展到特定编译器所需的任何内容,以确保正确的I / O访问和寻址。在I / O是内存映射的典型情况下,它将简单地扩展为volatile
,因为所有I / O都应该声明为volatile,以确保不优化显式访问。
如果您想确定,请下载IAR工具的演示版本,并查看头文件中的特定体系结构的定义方式。否则您可能只使用#define __IO volatile
答案 1 :(得分:7)
_IO意味着在C语言中使用volatile ...它不会优化代码,并且使用_IO为变量声明的值将是不可预测的,或者在不知道编译器和用户的情况下会发生变化
答案 2 :(得分:2)
这是一个老问题,但如果有人想知道ARM微控制器的这个问题,您可以看到该定义在CMSIS库中可用。例如,对于cortex-m4,__IO
定义如下:
#define __IO volatile /*!< Defines 'read / write' permissions */
完整的区块会在下面复制粘贴(Source):
#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 */