2013-01-16 4 views
8

임베디드 장치에서 작업 중이며 원래 IAR 컴파일러를 사용하여 컴파일 된 일부 코드가 있습니다.GCC의 '__IO'지시문은 무엇입니까?

GCC 컴파일러를 사용하여 해당 코드를 다시 컴파일하려고합니다.

특정 진술 : typedef __IO이 있습니다. 단순히 컴파일되지 않습니다 ("Unrecognized symbol error").

아무도 내가이 문장을 제대로 컴파일 할 수있는 방법을 제안 할 수 있습니까?

+2

'#DEFINE __IO volatile' 또는 단지 '#DEFINE의 __IO ' –

+0

@Eddy_Em : 답변을 코멘트가 아닌 답변으로 게시하십시오. – Clifford

+1

인식 할 수없는 기호 인 경우 어떻게 typedef인지 알 수 있습니까? (그 아닙니다). 언급하고있는 코드의 몇 가지 예가 유용 할 수 있습니다. – Clifford

답변

10

정의가 포함 된 적절한 시스템 헤더가 포함되지 않았기 때문에 인식되지 않는 것입니다.

툴체인과 함께 제공되는 칩 지원 헤더 파일에 정의됩니다. 유형 한정자이거나 형식 한정자로 확장되는 매크로 (#define)입니다. 다음과 같이, 예를 들어 사용된다 : 유형 유효 곳에 사용하지 않기 때문에 __IO없는 사실에 typedef을 할 수 있도록 여기

uint8_t
__IO uint8_t CSSR; 

는 유형이다. __IO 매크로는 올바른 I/O 액세스 및 주소 지정을 위해 특정 컴파일러에 필요한 모든 항목으로 확장됩니다. I/O가 메모리 맵핑되는 일반적인 경우에는 명시 적 액세스가 최적화되지 않았 음을 보장하기 위해 모든 I/O를 휘발성으로 선언해야하므로 간단히 volatile으로 확장됩니다.

확실한 경우 IAR 도구의 데모 버전을 다운로드하고 헤더 파일에서 특정 아키텍처에 대한 정의 방법을 살펴보십시오. 그렇지 않으면 단지 #define __IO volatile

7

_IO는 C 언어 에서처럼 휘발성을 나타냅니다. 코드를 최적화하지 않으며 _IO를 사용하는 변수에 대해 명시된 값은 컴파일러와 사용자에 대한 지식 없이는 예측할 수 없거나 변경 될 것입니다.

1

이 질문은 오래된 질문이지만 ARM 마이크로 컨트롤러에 대해 알고 싶다면 CMSIS 라이브러리에서 해당 정의를 사용할 수 있음을 알 수 있습니다. 외피 (M4)에 대해 예를 들어, 다음과 같이 __IO 정의된다 :

전체 블록 ( Source) 아래에 붙인 카피
#define  __IO volatile    /*!< Defines 'read/write' permissions */ 

:

#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 */