르네사스 MCU 컴파일시 발생할수 있는 에러.
[에러내용.]
(E) E3206 RA78K0R error E3206: Segment '@@CODEL' can't allocate to memory - ignored
(E) E3206 RA78K0R error E3206: Segment 'xxxxxx' can't allocate to memory - ignored
[해결방법]
<RA78K0R error E3206: Segment '@@CODEL' can't allocate to memory - ignored Error 대처법>
■Error내용 : @@CODEL섹션의 C코드 일부가 Memory(ROM)영역에 배치되지 않아서 발생하는 Error.
■Error원인 : RL78의 경우, Const변수를 사용하게 되면 특정영역(Mirror영역)에 배치가 되도록 설정되어 있고
이로 인해, ROM 안의 비어있는 영역(gap)이 발생하게 됩니다.
(*ROM안의 GAP영역 탓에 전체 Memory영역은 여유가 있음에도 불구하고, 해당 C코드가 배치되지 못하여 컴파일에러가 발생합니다.)
GAP영역에는 자동으로 배치되지 않으므로, 소프트웨어 처리를 통해 GAP영역 안에 배치되지 못한 코드를 직접 배치 시켜야 합니다.
[원인파악]
dr 파일내에서의 user3 섹션 설정값
MEMORY user3 : ( 01E000H, 003000H )
user3 섹션의 사이즈가 3000H, Battery 관련 코드 사이즈가 2608H로 user3의 사이즈에 맞게
코드가 들어가는 것이 맞지만, 실제로 user3영역을 잡아보니 영역이 시작하는 1E000H 부터 크기가 2000H정도인 원인 모를 GAP영역이 별도로 잡히게 됩니다.
MEMORY=user3
BASE ADDRESS=1E000H SIZE=03000H
OUTPUT INPUT INPUT BASE SIZE
SEGMENT SEGMENT MODULE ADDRESS
Battery 1E000H 00000H CSEG PAGE64KP
* gap * 1E000H 03000H
위에 메모리 영역을 3000h 나 잡았는데도 불구하고 원인 모를 GAP 영역이 잡히는 바람에 문제가 발생한것임.
따라서, user3는 2000H 크기의 GAP영역과 1000H의 유저영역으로 나뉘면서, 2608H사이즈의 Battery관련 코드가 배치되지 못하는 에러를 발생시켰습니다.
만약 ROM에 더이상 사용할 공간이 없을경우엔 GAP 영역을 사용해야 하는데 이때 C 코드 최상단에 아래의 전처리 이용하면 GAP 영역안에 배치될수 있다.
#pragma section @@CODEL subCODEL
위의 C코드를 선언하면, 해당 선언문 밑에 존재하는 @@CODEL영역의 C코드들은 자동적으로 GAP영역 안의 subCODEL Section에 자동으로 배치되게 됩니다.
'개발 > MCU' 카테고리의 다른 글
르네사스 MCU __near __far (0) | 2019.06.26 |
---|---|
IAR 내부 명령어 (0) | 2018.08.10 |
[solved]Atmel.VsIde.AvrStudio.Utils.MemoryPressureReliever exception (0) | 2018.04.17 |
IAR 파일 정보 (0) | 2018.04.10 |
MCU 이해하기 -실무자 이야기 (0) | 2016.05.25 |