Embedded 与SDCC的代码银行业务

Embedded 与SDCC的代码银行业务,embedded,linker,microcontroller,sdcc,Embedded,Linker,Microcontroller,Sdcc,我需要在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 #pr

我需要在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兆地址空间使用通常的 --*-loc选项。请注意,如果任何段位于64K以上,则-r 必须将标志传递给链接器以 生成适当的段 重新定位和英特尔十六进制输出 必须使用格式。可以使用-r标志 通过使用 SDCC命令行上的选项-Wl-r。 但是,当前链接器无法 句柄代码段>64k


因此,将-Wl-r添加到链接器行。

我不熟悉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。是否有链接器文件,它是否将所有内存/闪存空间分配给这些代码段