MSP430应用技巧2:EABI接口的初始化


          对于 COFF ABI和EABI,我们应将注意力着眼于 EABI上。由于它是我们今后项目开发首选的接口方式。本文就将对EABI接口的初始化方式进行深入介绍。



    1、自己主动初始化
    我们首先介绍一下自己主动初始化的概念,其英文原文例如以下:

Any global variables declared as preinitialized must have initial values assigned to them before a C/C++ program starts running. The process of retrieving these variables' data and initializing the variables with the data is called autoinitialization. 在C/C++程序执行之前,不论什么被声明为预初始化的全局变量都必须赋予初值。取出这些变量的数据并将这些数据赋予变量的进程。我们称其为自己主动初始化。)  
    在ANSI C中,全局和静态变量假设没有明白赋予初值,则在程序执行之前都必须设置为0。C/C++的EABI编译器支持可以对这些未初始化的变量进行特定操作,我们可以通过
--zero_init=off链接选项予以实现。

这个特性是

COFF ABI所不支持的。



    2、EABI的直接初始化
    考虑以下的样例。我们来看一下EABI的直接初始化。
图片
    编译器编译后。将例如以下安排这些数据。


图片
    定义为静态或全局变量的每一个编译后的模块都将包括在.data段(section)中,链接器採用和其他初始化段一样的方法对

.data段进行处理并建立一个输出段(output section)。对于载入期间初始化模式(  load-time initialization model。就是我们通常所说的RAM执行模式),这些段将被直接载入到内存中,以备程序调用。对于执行期间初始化模式( run-time initialization model, 就是我们通常所说的ROM执行模式 )。链接器将把这些数据建立成一个初始化数据表。引导程序负责处理这些 初始化数据表,它将在启动时将这些 初始化数据表从载入地址复制到执行地址。



    3、EABI的执行期间初始化模式
    

载入期间初始化模式就是我们通常所说的 RAM执行模式,它把程序和数据直接载入到RAM中进行执行,断电后程序和数据都将消失,主要用于程序的调试。 执行期间初始化模式 就是我们通常所说的 ROM执行模式,这是真正的单片机脱机执行模式,我们如今在进行单片机项目开发时,都将採用这样的模式,以保证调试和脱机执行结果的一致性。所以,本文将具体探讨 执行期间初始化模式。
    例如以下图所看到的,使用
--rom_model选项能够确定当前的project使用 执行期间初始化模式。
图片 
     这样的模式在链接时,将建立一个 初始化数据表并将数据存储于.cinit段中。在程序下载时,载入到单片机的ROM中,当程序启动时由引导程序将这些数据载入到RAM中。其步骤例如以下图所看到的。

图片
    下图显示了 初始化数据表的格式。 __TI_CINIT_Base是数据表的起始指针。 __TI_CINIT_Limit是数据表的结束指针。这张表标明了载入地址和执行地址的相应关系。

图片 

    4、EABI的全局构造函数
    例如以下图所看到的,全部的C++全局变量都有其构造器,它将在main函数之前被调用。

编译器通过构造全局构造地址表的方式用以在main函数之前调用。编译器合并每一个单一输入文件.init_array段中存储的地址表到一个.init_array段中。引导程序使用这个表去运行构造器

__TI_INITARRY_Base是数据表的起始指针, __TI_INITARRY_Limit是数据表的结束指针。

图片 
 
    总结:本文主要介绍了EABI接口下的初始化过程。指出对于全局变量和静态变量在编译后并不直接包括在目标文件里,而是将其放在
.cinit段中,并建立一个 初始化数据表,此表 标明了载入地址和执行地址的相应关系。 在程序下载时,载入到单片机的ROM中,当程序启动时由引导程序将这些数据载入到RAM中。



原创性文章。转载请注明出处  http://user.qzone.qq.com/2756567163

   

转载于:https://www.cnblogs.com/ljbguanli/p/6913864.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值