MSP430应用技巧2: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使用执行期间初始化模式。
下图显示了初始化数据表的格式。__TI_CINIT_Base是数据表的起始指针。__TI_CINIT_Limit是数据表的结束指针。这张表标明了载入地址和执行地址的相应关系。
例如以下图所看到的,全部的C++全局变量都有其构造器,它将在main函数之前被调用。
编译器通过构造全局构造地址表的方式用以在main函数之前调用。编译器合并每一个单一输入文件.init_array段中存储的地址表到一个.init_array段中。引导程序使用这个表去运行构造器。__TI_INITARRY_Base是数据表的起始指针,__TI_INITARRY_Limit是数据表的结束指针。
总结:本文主要介绍了EABI接口下的初始化过程。指出对于全局变量和静态变量在编译后并不直接包括在目标文件里,而是将其放在.cinit段中,并建立一个初始化数据表,此表标明了载入地址和执行地址的相应关系。在程序下载时,载入到单片机的ROM中,当程序启动时由引导程序将这些数据载入到RAM中。
原创性文章。转载请注明出处 http://user.qzone.qq.com/2756567163。