4

我需要在 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.

我怎样才能得到这个链接?

4

2 回答 2

2

来自 SDCC 手册:

可以使用常用的 --*-loc 选项将段放置在 4 兆地址空间中的任何位置。请注意,如果任何段位于 64K 以上,则必须将 -r 标志传递给链接器以生成正确的段重定位,并且必须使用 Intel HEX 输出格式。可以使用 SDCC 命令行上的选项 -Wl-r 将 -r 标志传递给链接器。但是,目前链接器无法处理大于 64k 的代码段。

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

于 2009-10-22T14:39:13.743 回答
0

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

于 2009-10-23T23:58:39.950 回答