2009-10-22 110 views
1

我需要在8051微控制器中使用代码银行业务以适应所有的代码。 SDCC表示它支持它,但我在链接步骤遇到麻烦。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. 

我如何得到这个链接?

回答

0

从SDCC手册:

Segments may be placed anywhere in the 4 meg address space using the usual --*-loc options. Note that if any segments are located above 64K, the -r flag must be passed to the linker to generate the proper segment relocations, and the Intel HEX output format must be used. The -r flag can be passed to the linker by using the option -Wl-r on the SDCC command line. However, currently the linker can not handle code segments > 64k.

因此,添加-Wl-R的连接线。

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