百问网Linux技术区Linux系统开发 裸跑程序链接错误undefined reference to `__divsi3',怎么解决?

1  /  1  页   1 跳转 查看:1615

裸跑程序链接错误undefined reference to `__divsi3',怎么解决?

裸跑程序链接错误undefined reference to `__divsi3',怎么解决?

我编写了一个2440下面的PWM的裸跑测试程序,控制蜂鸣器,然后在链接时出现如下错误:
arm-linux-gcc -c -o pwm.o pwm.c
arm-linux-gcc -c -o main.o main.c
arm-linux-ld -Ttext 0x00000000 -o pwm.a head.o init.o serial.o pwm.o main.o
pwm.o(.text+0xe0): In function `Buzzer_Freq_Set':
: undefined reference to `__divsi3'
make: *** [pwm] Error 1

下面列出Buzzer_Freq_Set的代码:
void Buzzer_Freq_Set(U16 c)

//设置GPB0即TOUT0作为PWM输出
GPBCON &= ~3;
GPBCON |= 2;
TCFG0 &= ~0xff;
TCFG0 |= 15;
TCFG1 &= ~0xff;
TCFG1 |= 2;
 
TCNTB0 = (PCLK>>7)/c;
TCMPB0 = TCNTB0>>1; // 50%

//disable deadzone, auto-reload, inv-off, update TCNTB1&TCMPB1, start timer 1
TCON &= ~0x1f;
TCON |= 0xb; //clear manual update bit
TCON &= ~2; //clear manual update bit
}

如果把上面红色那行的c修改成具体的数值,就不会有这样的错误,请问在不修改c为具体数值时,怎么解决这个链接的错误。
 

回复:裸跑程序链接错误undefined reference to `__divsi3',怎么解决?

我觉得可能跟c的初始值有关,如果是0的话,除以0肯定是不对的
 

回复:裸跑程序链接错误undefined reference to `__divsi3',怎么解决?

c是在这个函数被调用时赋值的,此时还没有赋值,这个错误应该是和那个链接语句的使用有关,应该是那个链接语句没有写对导致的,就是不知道怎么写那个链接语句哦。
 

回复:裸跑程序链接错误undefined reference to `__divsi3',怎么解决?

如果给定了c值,编译器就会帮你做点处理,不会使用除法。
否则,它就是个除法,需要加浮点运算。
`__divsi3'对应的就是那个除号
 

回复:裸跑程序链接错误undefined reference to `__divsi3',怎么解决?

thisway.diy提供的解决办法,
在TCNTB0 = (PCLK>>7)/c;语句中c当直接赋值之后,链接时,编译器会计算出它的值的;而c没有赋值时,这里就是一个除法,这就需要浮点数计算了,需要libgcc.a的库文件的支持和交叉编译器的软件浮点的支持。所以链接语句应该写为:arm-linux-ld -Ttext 0x00000000 -o pwm.a head.o init.o serial.o pwm.o main.o /xxx/xxx/xxx/libgcc.a或者是arm-linux-ld -Ttext 0x00000000 -o pwm.a head.o init.o serial.o pwm.o main.o -lgcc。
 
1  /  1  页   1 跳转

地址:广东省深圳市南山区南山大道3003号久商大厦C-1406;邮编:518052;电话:0755-86200561

粤ICP备09041549号, 版权所有 百问网   Sitemap

Powered by Discuz!NT 2.0.1214    Copyright © 2001-2010 Comsenz Inc.
Processed in 0.03125 second(s) , 3 queries.
返顶部