Вопрос

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

  

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

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

Другие советы

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

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

__sdcc_banked_call::
    ret                 ;make the call

__sdcc_banked_ret::
    ret                 ;return to caller

рутина?

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

Похоже, что это настройка сегментов кода:

//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)

но БАНК1 не определен.Существует ли файл компоновщика, и назначает ли он все пространство памяти / флэш-памяти этим сегментам кода?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top