Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15530778
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2008-01-22 11:52:20

做了2年多的嵌入式软件,今天才搞明白这问题,哎,失败~

//---------------------------------------
ads1.2下的一个260k的工程文件,
1)对lcd.c文件做了一些修改【添了2个函数,去了几个变量】
2)编译,链接
3)烧到arm板子上,异常,tnnd怎么就加个东西就异常了ni,抓狂!!!!
//---------------------------------------
原来问题tmd在这,无语了!!!!
将全部工程文件选中,对所有工程文件执行一次彻底编译,
呵呵呵呵呵呵,烧到arm上,ok,跑的那是呱呱的~~
//---------------------------------------
现象表述:
选中所有文件执行全部编译的时候,有2个警告提示:
warning:C2207W:inventing 'extern int gliethttp_ini();'
lcd_thread.c line 41

warning:C2207W:inventing 'extern int ucgui2_ReadFlash();'
lcd_thread.c line 45

问题分析:
通过上面的提示,你能看出来问题出在哪儿了吗?...
'extern int gliethttp_ini();'说明因为我自己没有告诉编译器该函数的具体位置,
所以如果不进行一次全面编译,那么该引用处对应的汇编跳转语句将不变,仍是下面的:
[0xeb00b969] bl gliethttp_ini
也就是说向链接后的.bin文件的当前位置向前或向后跳固定的长度不改变,因为没有全部编译,而恰恰向lcd.c添加的那些内容将gliethttp_ini函数的链接地址改变了,或者向后移或者向前移了gliethttp_ini函数编译位置,但是因为没有extern int gliethttp_ini();定义,所以lcd_thread.c函数无从知晓gliethttp_ini函数的链接地址的改变,那么很明显了,lcd_thread.c仍然继续执行下面的机器码
[0xeb00b969] bl gliethttp_ini
向后跳转之后去执行的地址已经不是gliethttp_ini的地址了,所以出现了这么bt的怪现象!

总结:看来要想仅仅修改一个函数,如:lcd.c之后不让程序进行全部编译,
      那么就需要告诉编译器,所有关联了的函数或者全局变量的具体位置【用extern来强制说明】
      也就是让你的编译器在执行全部编译时不要提示“inventing

阅读(3478) | 评论(2) | 转发(0) |
0

上一篇:生意就是这样做成的

下一篇:哲理

给主人留下些什么吧!~~

chinaunix网友2010-04-08 14:51:24

你好 牛…… 我也遇到这个问题了 哈哈 有这篇文章太爽了

chinaunix网友2008-03-24 10:36:35

好啊………………