2009-10-22 99 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。是否有鏈接器文件,並且是否將所有內存/閃存空間分配給這些代碼段?