对于
COFF ABI和EABI,我们应将注意力着眼于
EABI上。由于它是我们今后项目开发首选的接口方式。本文就将对EABI接口的初始化方式进行深入介绍。
在ANSI C中,全局和静态变量假设没有明白赋予初值,则在程序执行之前都必须设置为0。C/C++的EABI编译器支持可以对这些未初始化的变量进行特定操作,我们可以通过 --zero_init=off链接选项予以实现。
例如以下图所看到的,使用 --rom_model选项能够确定当前的project使用 执行期间初始化模式。
1、自己主动初始化
我们首先介绍一下自己主动初始化的概念,其英文原文例如以下:
在ANSI C中,全局和静态变量假设没有明白赋予初值,则在程序执行之前都必须设置为0。C/C++的EABI编译器支持可以对这些未初始化的变量进行特定操作,我们可以通过 --zero_init=off链接选项予以实现。
这个特性是
COFF ABI所不支持的。
2、EABI的直接初始化
考虑以下的样例。我们来看一下EABI的直接初始化。
编译器编译后。将例如以下安排这些数据。
定义为静态或全局变量的每一个编译后的模块都将包括在.data段(section)中,链接器採用和其他初始化段一样的方法对
3、EABI的执行期间初始化模式
例如以下图所看到的,使用 --rom_model选项能够确定当前的project使用 执行期间初始化模式。
这样的模式在链接时,将建立一个
初始化数据表并将数据存储于.cinit段中。在程序下载时,载入到单片机的ROM中,当程序启动时由引导程序将这些数据载入到RAM中。其步骤例如以下图所看到的。
下图显示了
初始化数据表的格式。
__TI_CINIT_Base是数据表的起始指针。
__TI_CINIT_Limit是数据表的结束指针。这张表标明了载入地址和执行地址的相应关系。
4、EABI的全局构造函数
例如以下图所看到的,全部的C++全局变量都有其构造器,它将在main函数之前被调用。
总结:本文主要介绍了EABI接口下的初始化过程。指出对于全局变量和静态变量在编译后并不直接包括在目标文件里,而是将其放在 .cinit段中,并建立一个 初始化数据表,此表 标明了载入地址和执行地址的相应关系。 在程序下载时,载入到单片机的ROM中,当程序启动时由引导程序将这些数据载入到RAM中。
例如以下图所看到的,全部的C++全局变量都有其构造器,它将在main函数之前被调用。
编译器通过构造全局构造地址表的方式用以在main函数之前调用。编译器合并每一个单一输入文件.init_array段中存储的地址表到一个.init_array段中。引导程序使用这个表去运行构造器
。 __TI_INITARRY_Base是数据表的起始指针, __TI_INITARRY_Limit是数据表的结束指针。总结:本文主要介绍了EABI接口下的初始化过程。指出对于全局变量和静态变量在编译后并不直接包括在目标文件里,而是将其放在 .cinit段中,并建立一个 初始化数据表,此表 标明了载入地址和执行地址的相应关系。 在程序下载时,载入到单片机的ROM中,当程序启动时由引导程序将这些数据载入到RAM中。