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

来源:互联网 发布:手机淘宝能开店吗? 编辑:程序博客网 时间:2024/04/29 06:28

         对于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选项可以确定当前的工程使用运行期间初始化模式。
图片 
    这种模式在链接时,将建立一个初始化数据表并将数据存储于.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  
1 0