AVR BootLoader 구성하기(3)

시작하기전에…
이글은 연재성글이 아니라, 본인의 프로젝트(작업) 진행시 일어난 문제를 해결하는 과정을 올리는 글임을 다시 한번 밝힙니다.
본 문에 나오는 __flash 지정자라는 표현은 저만의 임의 표현이며, 올바른 표현은 아닙니다만, 형지정자(const, volatile)와 같은 위치에 쓰이며, 그 의미도 코드나 변수가 놓일 메모리를 가르키는 곳을 나타내는 것이므로, 지정자라는 표현이 많이 벗어난 표현은 아닙니다.

본문
Bootloader 두번째글에서 언급했던, __flash 지정자(IAR 확장 키워드)를 사용하지 못하는 당연한 이유를 알게되었습니다.

알다시피, ATmega128 은 Flash 영역이 0x0000 ~ 0x1FFFF 까지 입니다. 그런데, 매뉴얼을 보니 __flash 지정자는
0x0000 ~ 0xFFFF 를 지시할수 있는 지시자였네요. NEAR_F 라는 CODE 세그먼트에 영역에 위치하니, NEAR_F 세그먼트가 선언되어야 합니다.

Fatal Error[e72]: Segment NEAR_F must be defined in a segment definition option (-Z, -b or -P)

Boot Section 만 사용하는 *.xcl 설정으로는 위와 같은 에러가 나는 것은 당연한 것입니다.
ATmega128 에서 Boot Section 은 최대 0x1E000 ~ 0x1FFFF 입니다.
Bootloader를 만드는 경우나, 문자상수를 나타내는 포인터를 플래쉬(코드영역)로 놓으려면, __farflash 를 사용하여야 합니다.

__farflash는 0x0-0xFFFFFF 영역을 지시할수 있습니다.

위에 언급한대로 정말 당연한 문제였던 것이었습니다. 역시나 컴파일러 매뉴얼이나, 기술노트등을 잘 살펴봐야 하는 것입니다. 단지 조금은 짧은 영어가 문제입니다.

아직 __eeprom 지시자를 쓸수 있게끔 하는 법은 모르겠습니다. 수요가 공급을 만들듯이, 뜻하는 곳에 길이 있다는 것을 다시한번 깨닫게 해주는 하루였습니다.

아래는 Bootloader 에서 Application 으로, Application 에서 Bootloader로 전환하는 코드입니다.
disable() 은 전체인터럽트금지 명령을 define 한것입니다.

#define GoApp() do{                                disable();                       /* Enable change of interrupt vectors */   MCUCR = (1 < < IVCE);   /* Move interrupts to application flash section */  MCUCR = 0;                     ((void (*)())0x0000)();       }while(0)  #define GoBoot() do{                                RAMPZ = 1;                    ((void (*)())0x1E000)();    }while(0)

– 참고 문서 –
IAR 기술노트
ATmel 어플노트 AVR106
EWAVR_CompilerReference.pdf – 컴파일러 매뉴얼

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중