Question

Je dois utiliser le code bancaire dans un microcontrôleur 8051 pour adapter tout le code. SDCC dit qu’il le soutient, mais j’ai du mal à l’étape de la liaison.

J'ai un projet test avec 3 fichiers: main.c, func1.c et bank.asm. La fonction principale doit appeler func1 (), puis rester en boucle while. Mais func1 () est dans une banque de codes différente.

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

J'ai un fichier batch de construction pour tout compiler et tout lier.

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

Je reçois cette erreur de l'éditeur de liens:

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

Comment puis-je obtenir ce lien?

Était-ce utile?

La solution

Extrait du manuel SDCC:

  

Les segments peuvent être placés n’importe où dans la   4 Mo d'espace d'adressage en utilisant l'habituel   - * - options de loc. Notez que si des segments sont situés au-dessus de 64 Ko, le paramètre -r   drapeau doit être passé à l'éditeur de liens pour   générer le segment approprié   délocalisations, et la sortie Intel HEX   le format doit être utilisé. Le drapeau -r peut   être passé à l'éditeur de liens en utilisant le   option -Wl-r sur la ligne de commande SDCC.   Cependant, actuellement, l'éditeur de liens ne peut pas   gérer les segments de code > 64k.

Ajoutez donc -Wl-r à la ligne de l'éditeur de liens.

Autres conseils

Je ne connais pas bien SDCC, mais à partir d'autres architectures de mémoire en banque, nous avons dû fournir les appels de fonction de banque redirigés.

Avez-vous besoin de saisir le code correct pour configurer les registres de banque ou ce qui ne définit jamais la banque de mémoire dans:

__sdcc_banked_call::
    ret                 ;make the call

__sdcc_banked_ret::
    ret                 ;return to caller

des routines?

Bien que ce ne soit probablement pas le problème de l'éditeur de liens.
Avez-vous besoin de définir un segment de code pour: BANK1?

Cela ressemble à la configuration des segments de code:

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

mais il n'y a pas de BANK1 défini. Existe-t-il un fichier de l'éditeur de liens et attribue-t-il toute la mémoire / l'espace flash à ces segments de code?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top