원하는 주소대로 HEX 파일을 만드는 방법을 명시하고 있다. 다른 플래시와 관련한 문서들을 읽어봤다면, 알겠지만, 플래시에 R/W 를 하기 위해서는 HEX 파일을 만들어야 한다.
HEX 파일은 주소와 데이터, 이렇게 2개의 부분으로 나뉘어져 있다.
SD 의 경우(DACS1000), 소스를 컴파일하고 나서, HEX 파일을 만들어서, 그 파일의 내부를 들여다 보면, 대부분 이런식으로 되어있다.
7fe00000 24 00 00 00 00 00 00 80 7c 23 6c c0 04 00 00 00 5c 8d e3 7f a0 23 6c c0 24 00 00 00 00 00 00 80 .. .. .. 7fffffe4 20 20 20 27 2f 2e 20 20 28 21 44 f6 34 aa e3 7f 68 a6 e3 7f 01 00 00 00 20 20 61 07
가장 첫줄의 주소가 0x7fe00000, 그리고 마지막 주소가, 0x7fffffe4 이다. 이 주소 영역은 이해가 될 것이다. 그렇다. mb382_um.cfg 에서 잡아준 FLASH 영역 주소이다. 참고로 위의 같은 HEX 파일을 만들었을 때의 mb382_um.cfg 을 들여다 보기로 하자!
memory FLASH0 0x7Fe00000 (2*M) ROM
여기까지는 지극히 정상이다. 정상이라 함은, 기존의 해오던 방식이다. 싱글부트이다.
하지만, 이제 JUMP 문제가 해결됨에 따라 지금 부터는 듀얼부트를 시도해 볼 생각이다. 그렇게 되면, 기존의 만든 HEX 파일로는 불가능 하다. 왜냐하면, 주소가 맞지 않기 때문이다.
듀얼부트는 총 2개의 프로그램이 필요하다. 부트로더와 메인 프로그램이 그것이다.
또한 총 2M 의 플래시 영역을 2개로 쪼개야 한다. 마치 하드 디스크를 2개로 파티션을 나누듯이 말이다.
그림을 보면, 총 8번까지의 영역이 있다. 이제 하나하나씩 살펴보겠다.
영역번호 | 설명 |
---|---|
1 | 메인프로그램이 들어가는 영역이다. 시작주소는 플래시의 가장 윗번지인 0x7fe00000 이다 |
2 | 빈 공간이다. 이것은 어디까지나, 유동적이다. 메인프로그램의 용량이 늘어나면 이곳의 영역은 좁아진다 |
3 | 메인프로그램의 부트코드가 들어가는 부분. initfunc() 함수가 들어있는 부분이다. 기본으로는 0x7fffffe4 번지가 정해지지만, 임의의 주소로 수정해야 한다 |
4 | 0x7feffffe 에서 부터 0x7ff00000 까지의 부분이다. 이 영역은 크게 의미하는 바가 없다 |
5 | 부트로더 프로그램이다. 시작주소는 기본적으로 0x7fe00000 이지만, cfg 파일을 수정하여 주소를 0x7ff00000 으로 수정했다 |
6 | 2번영역과 비슷하다. 용량이 늘어나면, 좁아진다 |
7 | 부트로더의 부트코드이다. 역시 initfunc() 함수가 들어있다. 이것은 특별히 수정해줄 필요가 없다. 기본 주소로 쓸 것이기 때문이다 |
8 | 4번 영역과 마찬가지로 별 의미가 없다 |
두개의 프로그램을 플래시에 R/W 할 것이기 때문에 HEX 파일 역시 2개가 필요하다. 가장 중요한 부분이라고 할 수 있는, 4번 영역을 지정해보도록 하자!!
기본적으로는 0x7fffffe4 이다. 우선 mb382_um.cfg 파일의 아래의 부분을 수정해주어야 한다.
기본설정은 아래와 같다.
memory FLASH0 0x7Fe00000 (2*M) ROM ## 플래시 영역 지정 memory SDRAM 0xC0000000 (16*M) RAM ... ... ... proc board_init_hex { write Setup5517 reset Mem5517Space (0) (1) ST20C2MemoryInit ## procedure written by MCDT, replaces c2MemoryInit, reserves area 0x80000000 to 0x80000040 ## 기본적인 부트영역 주소는 0x7fffffe4 이다. }
이번에는 부트 영역을 바꿔보도록 하겠다. 시작 주소 번지는 0x7fe00000 으로 같다. 하지만, 부트영역 주소를 아래와 같이 변경했다. 잘 봐두기 바란다.
memory FLASH0 0x7Fe00000 (512*K) ROM ## 이부분을 수정해야 한다. memory SDRAM 0xC0000000 (16*M) RAM ... ... ... proc board_init_hex { write Setup5517 reset Mem5517Space (0) (1) ST20C2MemoryInit ## procedure written by MCDT, replaces c2MemoryInit, reserves area 0x80000000 to 0x80000040 bootiptr (0x7Fe00000 + (512*K)-2 ) ## 이 부분을 추가또는 수정한다. }
그리고 나서, HEX 파일을 만들어 보자!!
하나의 예를 더 들어보자!! 앞에서는 플래시 영역을 512K 로 했지만, 이번에는 1M 로 해보자!!
다음은 이에 대응하는 mb382_um.cfg 파일의 모습이다.
memory FLASH0 0x7Fe00000 (1*M) ROM ## 이부분을 수정해야 한다. memory SDRAM 0xC0000000 (16*M) RAM ... ... ... proc board_init_hex { write Setup5517 reset Mem5517Space (0) (1) ST20C2MemoryInit ## procedure written by MCDT, replaces c2MemoryInit, reserves area 0x80000000 to 0x80000040 bootiptr (0x7Fe00000 + (1*M)-2 ) ## 이 부분을 추가또는 수정한다. }
이제는 좀 감이 잡혔을 것이다. 어디를 어떻게 수정해주어야 하는 지 말이다. 이번에도 역시 HEX 파일을 만들어보자!!
그리고 HEX 파일의 가장 마지막 주소를 확인해보자!! 어떤가??? 의도한 대로 바뀌었는가??
이럴 때는 이렇게
HEX 를 만들 때 아래와 같은 에러가 난다면,
Setup5517 Setup5517 Warning-st20link- section ncache2_section has been placed in a configuration file but section does not exist Warning-st20link- section internal_section_noinit has been placed in a configuration file but section does not ex Warning-st20link- section system_section_noinit has been placed in a configuration file but section does not exis Information-st20link- Failed when storing section def_code <partial> (size 93056) in Information-st20link- the ROM image (default case) Information-st20link- Current ROM layout is as follows: Information-st20link- Segment FLASH0 (size 131072) Information-st20link- <initfuncs_text> (size 2068) Information-st20link- <romload_text> (size 120) Information-st20link- <romload2_text> (size 208) Information-st20link- <_ST_ProgramIdentifier> (size 4) Information-st20link- def_code <partial> (size 40864) Information-st20link- startblock (size 28) Information-st20link- Space left in segment is 87780 Serious-st20link- cannot fit section def_code <partial> into the ROM image st20cc: Error: in attempting to run st20link gmake[1]: *** [arena.hex] Error 1 gmake[1]: Leaving directory `C:/STM/DACS1000/obj' gmake: *** [arena.hex] Error 2
플래시 영역이 너무 작아서 나는 것이다. 용량을 늘려주면 된다.
마치면서
플래시도 저장장치의 일종이다. 그렇기 때문에, 용량의 낭비는 곧 제품의 비효율성과 직결된다. 일반적으로 부트로더 프로그램에는 가장 최소한의 디바이스만 초기화한다. 그래서 코드의 양이 최소한 일 수록 좋다.
우선 되는 대로 나는 부트로더 프로그램을 256K 안에 넣으려고 한다. 그리고 나서 나머지 부분은 메인 프로그램을 위한 공간으로 남겨둘 생각이다.