我需要在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.我如何让这个链接起来?
发布于 2009-10-22 22:39:14
摘自SDCC手册:
段可以使用通常的--*-loc选项放置在4兆地址空间中的任何位置。请注意,如果任何网段位于64K以上,则必须将-r标志传递给链接器以生成正确的网段位置,并且必须使用英特尔十六进制输出格式。可以使用SDCC命令行上的-Wl-r选项将-r标志传递给链接器。但是,目前链接器不能处理大于64k的代码段。
因此,将-Wl-r添加到链接器行。
发布于 2009-10-24 07:58:40
我不熟悉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。有链接器文件吗?它是否将所有内存/闪存空间分配给这些代码段?
https://stackoverflow.com/questions/1606926
复制相似问题