Код Банкинг с SDCC - PullRequest
       68

Код Банкинг с SDCC

2 голосов
/ 22 октября 2009

Мне нужно использовать код банка в микроконтроллере 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.

Как мне получить ссылку?

Ответы [ 2 ]

1 голос
/ 22 октября 2009

Из руководства SDCC:

Сегменты могут быть размещены в любом месте 4 Мб адресного пространства с использованием обычного - * - параметры локации. Обратите внимание, что если какие-либо сегменты расположены выше 64K, то -r флаг должен быть передан компоновщику создать правильный сегмент перестановки и выход Intel HEX формат должен быть использован. Флаг -r может быть переданы компоновщику с помощью опция -Wl-r в командной строке SDCC. Однако в настоящее время компоновщик не может обрабатывать сегменты кода> 64 тыс.

Итак, добавьте -Wl-r в строку компоновщика.

0 голосов
/ 24 октября 2009

Я не знаком с SDCC, но из других архитектур банковской памяти нам приходилось предоставлять вызовы функций перенаправленного банка.

Нужно ли вводить правильный код для настройки банковских регистров или что когда-либо устанавливает банк памяти в:

__sdcc_banked_call::
    ret                 ;make the call

__sdcc_banked_ret::
    ret                 ;return to caller

Подпрограммы

Хотя это, вероятно, не проблема компоновщика.
Вам нужно определить код сегмента для: BANK1?

Это похоже на настройку сегментов кода:

//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 не определен. Есть ли файл компоновщика, и он назначает все пространство памяти / флэш-памяти этим сегментам кода?

...