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

  

posted on 2017-05-27 17:35  ljbguanli  阅读(380)  评论(0编辑  收藏  举报