티스토리 뷰

Hardware

AVR BootLoader 구성하기(3)

비회원 2006. 6. 3. 16:26

시작하기전에...
이글은 연재성글이 아니라, 본인의 프로젝트(작업) 진행시 일어난 문제를 해결하는 과정을 올리는 글임을 다시 한번 밝힙니다.
본 문에 나오는 __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 - 컴파일러 매뉴얼

'Hardware' 카테고리의 다른 글

삑소리로 보드체크  (0) 2006.06.05
“구운 CD의 수명은 기껏해야 5년에 불과”  (0) 2006.06.05
AVR BootLoader 구성하기(3)  (0) 2006.06.03
AVR BootLoader 구성하기(2)  (0) 2006.06.03
AVR BootLoader 구성하기  (0) 2006.06.03
PC용 리모콘 제작  (1) 2006.06.03
댓글
댓글쓰기 폼