我需要在8051微控制器中使用代码存储来适应所有代码。 SDCC说它支持它,但我在连接步骤时遇到了麻烦。

我有一个包含3个文件的测试项目:main.c,func1.c和bank.asm。 main函数应该调用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   flag必须传递给链接器   生成适当的段   重定位和英特尔HEX输出   必须使用格式。 -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。是否有链接器文件,它是否将所有内存/闪存空间分配给这些代码段?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top