CFLAGS = -w -g -Os -fpic -fasm -nostdinc -fno-builtin -mcpu=xscale -mthumb -mthumb-interwork
-mthumb参数是编译全编译成thumb指令集,-mthumb-interwork是指thumb的code用thumb指令集,其他的用arm指令集。因为第三方给的security lib貌似是用thumb编译的,我们的code要是不加-mthumb参数,虽然编译没有问题,但是link的时候会出现一个内部error, as flow:
arm-linux-ld: internal error /home2/yfw/toolchain/toolchain-2007-06-13/build/arm-iwmmxt-linux-gnueabi/gcc-4.1.1-glibc-2.5/binutils-2.16.92/ld/ldlang.c 4271
所以必须加上thumb指令集编译我们自己的code,Build原来的code会出现一些error
1
selected processor does not support `mcr p14,0,r11,c7,c0,0'
后来发现,thumb指令集不支持mcr和mrc助记符。
2
/tmp/cc274Oiz.s:1281: Error: selected processor does not support `umull r5,r6,r3,r0'
/tmp/cc274Oiz.s:1283: Error: instruction not supported in Thumb16 mode -- `adcs r6,r6,r4'
/tmp/cc274Oiz.s:1284: Error: unshifted register required -- `adc r5,r2,#0'
/tmp/cc274Oiz.s:1286: Error: selected processor does not support `umlal r6,r5,r4,r0'
/tmp/cc274Oiz.s:1287: Error: selected processor does not support `umlal r6,r2,r3,r1'
这个出错的code是在
remainder = do_div(value, 100000);
加thumb参数后,编译器就没法执行do_div的取余操作了。
这些错误都是C code调用汇编的时候出现的错误。但是要是把这些错误移到汇编文件里,用arm-linux-as进行编译就没有问题了。编译选项如下:
AFLAGS = -Wall -mcpu=xscale -mapcs-stack-check
解决方法就是把code里编译不过去的code,改成汇编,然后EXPORT出去再调用。
因为汇编不太熟,所以最简单方法就是写个简单的C code,然后编译成汇编,之后直接调用。至于do_div,我解决方法是做了一个表。
typedef struct
{
unsigned long long lclk;
unsigned int pixclk;
unsigned int lcdclk; 对应上面的value
unsigned long long remainder; 余数,对应上面的remainder
}clock_match_table;
阅读(9706) | 评论(1) | 转发(0) |