문제

모든 코드에 맞게 8051 마이크로컨트롤러에서 코드 뱅킹을 사용해야 합니다.SDCC에서는 지원한다고 하는데 연결 단계에서 문제가 발생합니다.

3개의 파일이 포함된 테스트 프로젝트가 있습니다.main.c, func1.c 및bank.asm.기본 함수는 func1()을 호출한 다음 while 루프에 있어야 합니다.그러나 func1()은 다른 코드 뱅크에 있습니다.

// main.c
int func1(void) banked;

void main()
{
    int i = func1();

    while(i)
    {
    }
}

// func1.c
#pragma codeseg BANK1

int func1(void) {
    return 99; }

//bank.asm
    .area HOME    (CODE)
    .area GSINIT0 (CODE)
    .area GSINIT1 (CODE)
    .area GSINIT2 (CODE)
    .area GSINIT3 (CODE)
    .area GSINIT4 (CODE)
    .area GSINIT5 (CODE)
    .area GSINIT  (CODE)
    .area GSFINAL (CODE)
    .area CSEG    (CODE)
    .area HOME    (CODE)

__sdcc_banked_call::
    ret             ;make the call

__sdcc_banked_ret::
    ret         ;return to caller

모든 것을 컴파일하고 함께 링크하는 빌드 배치 파일이 있습니다.

sdcc -c func1.c
sdcc -c main.c
asx8051 -ol bank.asm
sdcc "-Wl -b BANK1=0x018000" main.rel func1.rel bank.rel

다음 링커 오류가 발생합니다.

?ASlink-Error-Insufficient ROM/EPROM/FLASH memory.

이걸 어떻게 링크시키나요?

도움이 되었습니까?

해결책

SDCC 매뉴얼에서:

세그먼트는 일반적인-*-loc 옵션을 사용하여 4 meg 주소 공간의 어느 곳에도 배치 될 수 있습니다.세그먼트가 64K 이상인 경우 -R 플래그를 링커로 전달하여 적절한 세그먼트 재배치를 생성해야하며 Intel Hex 출력 형식을 사용해야합니다.-R 플래그는 SDCC 명령 줄에서 -WL -R을 사용하여 링커로 전달할 수 있습니다.그러나 현재 링커는 코드 세그먼트> 64K를 처리 할 수 ​​없습니다.

따라서 링커 줄에 -Wl-r을 추가하세요.

다른 팁

SDCC에 익숙하지는 않지만 다른 은행 메모리 아키텍처에서 리디렉션 된 은행 기능 호출을 제공해야했습니다.

은행 레지스터를 설정하기 위해 올바른 코드를 넣거나 메모리 뱅크를 다음과 같이 설정해야합니까?

__sdcc_banked_call::
    ret                 ;make the call

__sdcc_banked_ret::
    ret                 ;return to caller

루틴?

이것은 아마도 링커 문제가 아닐 것입니다.
Bank1에 대한 코드 SEG를 정의해야합니까?

코드 세그먼트를 설정하는 것처럼 보입니다.

//bank.asm
    .area HOME    (CODE)
    .area GSINIT0 (CODE)
    .area GSINIT1 (CODE)
    .area GSINIT2 (CODE)
    .area GSINIT3 (CODE)
    .area GSINIT4 (CODE)
    .area GSINIT5 (CODE)
    .area GSINIT  (CODE)
    .area GSFINAL (CODE)
    .area CSEG    (CODE)
    .area HOME    (CODE)

그러나 Bank1은 정의되지 않았습니다. 링커 파일이 있습니까?이 코드 세그먼트에 모든 메모리/플래시 공간을 할당합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top