すべてのコードを収めるために、8051 マイクロコントローラーでコード バンキングを使用する必要があります。SDCC はサポートしていると言っていますが、リンクの段階で問題があります。
main.c、func1.c、bank.asm の 3 つのファイルを含むテスト プロジェクトがあります。メイン関数は 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.
これをリンクするにはどうすればよいですか?