Chinaunix首页 | 论坛 | 博客
  • 博客访问: 192302
  • 博文数量: 34
  • 博客积分: 746
  • 博客等级: 军士长
  • 技术积分: 202
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-09 21:19
文章分类

全部博文(34)

文章存档

2011年(34)

分类: 嵌入式

2011-05-12 23:17:35

 灵活使用ARM汇编的WEAK关键字 收藏
//=====================================================================
//TITLE:
//    灵活使用ARM汇编的WEAK关键字
//AUTHOR:
//    norains
//DATE:
//    Tuesday  20-October-2010
//Environment:
//    KEIL MDK 4.0
//=====================================================================
     ARM汇编中的WEAK关键字是一个很有意思的功能,如果能够灵活使用,能减轻不少繁琐。一般来说,这个关键字使用在IMPORT和EXPORT这两个声明段。
     如果我们有一个名为ARM_Vectors的量表,向量表的第一个数值指向一个StackTop函数的地址。因为我们可能定义了该函数,也可能没有,为了代码的简便,我们可以使用WEAK关键字,如:
////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
IMPORT     StackTop [WEAK]
 AREA |.text|, CODE, READONLY
;Vector list
ARM_Vectors
   DCD     StackTop
    当我们定义了StackTop函数后,那么ARM_Vectors里第一个向量值就是StackTop函数的地址。如果没有定义StackTop,那么编译器不会报错,而这时候第一个向量值就直接赋予0。

     那么对于EXPORT,WEAK又有什么样的功能呢?如果你EXPORT的函数带有WEAK标志的话,并且别的源代码没有定义同名函数,那么连接时就是该函数;否则,就是另外的一个同名函数。这个机制,和类的继承有点相像,都是一个函数将另一个函数给掩盖了;所不同的是,WEAK里的这个掩盖,是彻彻底底让另外一个函数消失。
     可能这样说还是有点不太明白,我们以实例来说明:
////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
 IMPORT     StackTop
 AREA |.text|, CODE, READONLY
;Vector list
ARM_Vectors
   DCD     StackTop

////////////////////////////////////////////////////////////////////////////
//VectorsHandlers.s
////////////////////////////////////////////////////////////////////////////
EXPORT  StackTop               [WEAK]
 AREA    |i.DefaultHandler|, CODE, READONLY
StackTop     PROC               
                B       .
                ENDP
     虽然这时候StackTop在通过EXPORT导出时带有WEAK关键字,但因为整个源代码文件中只有这里有StackTop,所以VectorsTrampolines.s文件中连接的StackTop是VectorsHandlers.s定义的同名函数。
      如果另外的源代码也定义了同名的函数,如:

////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
 IMPORT     StackTop
 AREA |.text|, CODE, READONLY
;Vector list
ARM_Vectors
   DCD     StackTop

////////////////////////////////////////////////////////////////////////////
//VectorsHandlers.s
////////////////////////////////////////////////////////////////////////////
EXPORT  StackTop               [WEAK]
 AREA    |i.DefaultHandler|, CODE, READONLY
StackTop     PROC               
                B       .
                ENDP
////////////////////////////////////////////////////////////////////////////
//Func.c
////////////////////////////////////////////////////////////////////////////
Extern “C” StackTop()
{}
     因为VectorsHandlers.s的StackTop是用WEAK导出的,而Func.c又有同名的函数,那么这时候VectorsTrampolines.s里的StackTop是连接Func.c里定义的StackTop。
 
     这里有一个很有意思的问题,如果EXPORT和IMPORT都用WEAK声明,如:

////////////////////////////////////////////////////////////////////////////
//VectorsTrampolines.s
////////////////////////////////////////////////////////////////////////////
 IMPORT     StackTop  [WEAK]
 AREA |.text|, CODE, READONLY
;Vector list
ARM_Vectors
   DCD     StackTop

////////////////////////////////////////////////////////////////////////////
//VectorsHandlers.s
////////////////////////////////////////////////////////////////////////////
EXPORT  StackTop               [WEAK]
 AREA    |i.DefaultHandler|, CODE, READONLY
StackTop     PROC               
                B       .
                ENDP
     这时候VectorsTrampolines.s里的ARM_Vectors的第一个向量值是什么呢?还是VectorsHandlers.s里的StackTop函数地址么?很遗憾,不是,而直接是0!所以这点就注意了,最好不要对同名的函数在IMPORT和EXPORT时都使用WEAK,否则结果很可能让你抓狂!
     最后,以一个列表作为总结:
 

VectorsTrampolines.s

VectorsHandlers.s

Func.c

ARM_Vectors第一个向量值

IMPORT     StackTop  [WEAK]

0

IMPORT     StackTop  [WEAK]

EXPORT  StackTop

VectorsHandlers.sStackTop地址

IMPORT     StackTop

EXPORT  StackTop               [WEAK]

有同名的StackTop函数

Func.cStackTop地址

IMPORT     StackTop

EXPORT  StackTop              

有同名的StackTop函数

存在两个StackTop,编译出错

IMPORT     StackTop  [WEAK]

EXPORT  StackTop               [WEAK]

0

 
 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/norains/archive/2010/10/20/5954459.aspx
阅读(5663) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~