代码之家  ›  专栏  ›  技术社区  ›  Robert Deml

SDCC代码银行

  •  2
  • Robert Deml  · 技术社区  · 15 年前

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

    我该如何让这个链接?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Robert Deml    15 年前

    从SDCC手册:

    段可以放置在 使用通常的4兆地址空间 --*-LOC选项。注意,如果任何段位于64K以上,则-R 标志必须传递到链接器 生成正确的段 重新定位和英特尔十六进制输出 必须使用格式。-R标志可以 通过使用 选项-wl-r在sdcc命令行上。 但是,当前链接器不能 处理代码段>64K。

    所以,在链接器行中添加-wl-r。

        2
  •  0
  •   simon    15 年前

    我不熟悉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)
    

    但是没有定义银行1。是否有链接器文件,它是否将所有内存/闪存空间分配给这些代码段?