Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2983832
  • 博文数量: 401
  • 博客积分: 12926
  • 博客等级: 上将
  • 技术积分: 4588
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-22 14:51
文章分类

全部博文(401)

文章存档

2015年(16)

2014年(4)

2013年(12)

2012年(82)

2011年(98)

2010年(112)

2009年(77)

分类:

2009-04-09 10:06:27

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;




阅读(9715) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~