IAR이라는 컴파일러에서 신기한걸 목격했습니다.더불어 질문포함.
IAR컴파일러로 컴파일되던 소스코드를 avr-gcc에서 돌수 있도록 포팅 하고 있습니다.
근데 포팅하다보니 신기한걸 발견했습니다.
__io union {
unsigned char SREG; // The sfrb as 1 byte
struct { // The sfrb as 8 bits
unsigned char SREG_Bit0:1,
SREG_Bit1:1,
SREG_Bit2:1,
SREG_Bit3:1,
SREG_Bit4:1,
SREG_Bit5:1,
SREG_Bit6:1,
SREG_Bit7:1;
};
} @ 0x3F;
위에서 보면 @ 0x3F라고 되어있네요. 이건 avr-gcc에서는 컴파일이 안되는지 error: stray '@' in program 만 뱉어 내는군요.
혹시 저게 어떤의미를 가지는지 정확히 아시는분 계신가요?
gcc에서도 비슷한 의미를 가지게 만들수가 있을까요?
특정 어드레스를
특정 어드레스를 지정하는 것입니다. 특정 번지를 지정한 후 그 비트들을 쉽게 조작할 수 있도록 한 것인데, 어떤 컴파일러는 비트필드가 아니라 그 비트들을 바로 변수로 지정하는 것도 가능합니다. 이렇게 하면 귀찮은 논리 연산 없이도 특정 비트를 조작할 수 있습니다.
그 특정 어드레스는 CPU의 주변 장치에 대한 제어를 위한 것이거나 빠른 레지스터로 이용하능하게 하는 것있습니다. 해당 CPU (8051 계열 같습니다.) 의 그 번지가 어떤 의미인지 조사해보시면 될 것입니다.
아마도 avr-gcc 에서도 이와 같은 것을 컴파일러 확장으로 제공할 것입니다. 찾으시면 여기에 한번 남겨 주세요.
8051인 듯 하군요.
SREG는 SFR의 주소로 접근할 수 있습니다. (그 주소를 지정한 문법일 것이고요...) avr-gcc에서는 SREG가 이미 선언되어 있으므로 따로 선언하지 않아도 됩니다. 다만 bit를 union 형태로 선언해서 접근하는 건 프로그램을 좀 바꿔야 할 듯 싶네요.
IAR을 AVR-GCC로 포팅하기
질문과 관계된 댓글은 아니지만 저역시 IAR로 만들었던 프로그램을 AVR-GCC로 바꾸려는 작업을 하고 있습니다.
글쓰신 분께서는 포팅 작업을 한다고 하셨는데 단순히 헤더부분만 INCLUDE 해서는 정상적으로 되지 않아서 그런 것인가요?
제 단순한 생각으로는 컴파일러만 IAR에서 AVR-GCC로 바꾸고 단지 CPU포트에 관계된 IOM128.H 라던가 IO.H 같은 것들만 IAR의 INC를 가리키게끔 하면 된다고 생각했습니다.
그런데 이런 INCLUDE 작업조차도 에디터에서 지정하던 makefile에서 지정하던 관계없이 정상적으로 읽어들이지 못하네요.
혹시 같은 문제로 인해 소스를 수정하시는 건지 궁금합니다.
며칠째 이문제로 골머리를 앓고 있네요.
make life meaningful!
흐흐
소스 수정해야 됩니다.
IAR compiler가 @ 문자를 어떻게 해석하는가를 찾고 그에 맞는 avr-gcc 문법을 찾아서 바꿔야 합니다.
제가 8051용 IAR만 있어서;;
다음 경로에서 관련 문서를 찾을 수 있었습니다.
C:\Program Files\IAR Systems\Embedded Workbench 4.05\8051\doc\EW8051_CompilerReference.pdf
page 86을 보면 다음과 같이 '@'에 대해서 설명되어 있더군요
그럼 이제 '@'를 어떤 의미로 사용한 건지 알았으니 avr-gcc 문서 보시고 같은 기능을 하는 문법을 찾아서 바꿔야겠죠;; ^^;
avr-gcc에서는 avr/sfr_defs.h를 참고하시면 아마 문법이 어떻게 되는지는 알 수 있을겁니다.
댓글 달기