`
dato0123
  • 浏览: 914016 次
文章分类
社区版块
存档分类
最新评论

灵活使用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

分享到:
评论

相关推荐

    iOS weak 关键字漫谈1

    iOS weak 关键字漫谈1

    ARM 之十一__weak 代码 WEAK.7z

    博文 ARM 之十一__weak 和 __attribute__((weak)) 关键字的使用 的测试代码,备用!

    ARM汇编器所支持的伪指令

    这篇文档所讲的是ARM汇编器所支持的伪指令,了解和掌握这些伪指令对嵌入式开发有很好的帮助

    arm79汇编伪指令介绍

    使用 IMPORT 或 EXTERN 声明外部标号时,若连接器在连接处理时不能解释该符号,而伪指令中没有[WEAK]选项,则连接器会报告错误,若伪指令中有[WEAK]选项,则连接器不会报告错误,而是进行下面的操作: 1.如果该符号被 B ...

    MDK5 宏定义CC_ARM

    CMSIS目前支持三大主流的工具链,即ARM RealView (armcc), IAR EWARM (iccarm), and GNU Compiler Collection (gcc). 在core_cm3.h中有如下定义: /* define compiler specific symbols */ #if defined ( __CC_...

    iOS开发技巧之WeakSelf宏的进化详解

    我们都知道在防止如block的循环引用时,会使用__weak关键字做如下定义: __weak typeof(self) weakSelf = self; 后来,为了方便,不用每次都要写这样一句固定代码,我们定义了宏: #define WeakSelf __weak typeof...

    weak操作入门(数据挖掘)

    让你轻松掌握weka操作方法,以便进行数据挖掘,这是简单介绍怎么使用这个软件的一个文档

    iOS 中weak的实现代码示例

    只要学过 iOS 的人,都会对 strong、weak、copy等关键字应该都会很熟悉。weak 属性关键字就是弱引用,它不会增加引用计数但却能保证指针的安全访问,在对象释放后置为 nil,从而避免错误的内存访问。主要为了解决...

    weak应用程序,数据挖掘平台

    用户可以直接使用这个平台,给大家带来了方便.

    weak galerkin finite element meathods on polytopal

    weak galerkin finite element meathods on polytopal

    函数weak属性理解_弱声明实例

    学习理解函数加上weak后的变化

    The strength of weak learnability.pdf

    The strength of weak learnability.pdf

    Weak Convergence and Empirical Processes

    弱收敛余经验过程是概率统计专业博士生的必修课程,也是经典书籍。

    weak 决策树训练及测试应用步骤

    weak 对决策树算法的实际应用 有训练和测试两部分,如果你是数据挖掘的新手,那么这个文档会告诉你如何使用weka用于实际的算法进行挖掘,保证让你满意

    Weak Signal Digital GNSS Tracking Algorithms.pdf

    7、GPS接收机原理二GPS接收机的捕获灵敏度极限、 8、GPS接收机射频前端电路原理与设计 9、Weak Signal Digital GNSS Tracking Algorithms 10、Fundamentals of Global Positioning System Receivers II 11、...

    Weak-Password.zip

    压缩包包含了常见的弱口令用户名,弱口令密码。包含常见的服务ftp、telnet、mysql等。还有sql注入测试代码。

    Carrier loop architectures for tracking weak GPS signals.pdf

    Carrier loop architectures for tracking weak GPS signals.pdf, The performance of various carrier recovery loop architectures (phase lock loop (PLL), Doppler-aided PLL, frequency lock loop (FLL), and ...

    Practical Weak Supervision.pdf

    在这本书中,Wee Hyong Tok, Amit Bahree和Senja Filipi向您展示了如何使用弱监督学习模型创建产品。 您将学习如何使用来自Snorkel的弱标记数据集构建自然语言处理和计算机视觉项目,Snorkel是斯坦福人工智能实验室...

    ARM伪指令,包括嵌入式所有伪指令。

    ARM伪指令合集。很实用的,书上写的太少。

    weak,Strong指针小结

    ARC的判断准则: 只要没有强指针指向对象,就会释放对象,弱指针不会这样,及时有弱指针指向对象,对象没有强指针指向,也会自动释放掉。一般,无需显式声明为强指针,但是在封装里,定义方法的时候需要写明。...

Global site tag (gtag.js) - Google Analytics