现在的位置: 首页 > 综合 > 正文

【嵌入式】ARM中的RO、RW和ZI DATA说明–in C++

2018年04月23日 ⁄ 综合 ⁄ 共 1370字 ⁄ 字号 评论关闭

一、说明

在内存很受限的嵌入式系统中作开发时,经常会出现内存超标了,在这种情况下,就需要对ARM中RO,RW和ZI区段分别存放什么数据有深入的理解。
一般来说一个ARM程序包含3部分:RO,RW和ZI区段。
RO是程序中的指令和常量,RW是程序中的已初始化变量,ZI是程序中的未初始化的变量。
由以上3点说明可以理解为:
RO就是readonly,RW就是read/write,ZI就是zero。

二、使用

1、RO Data

所有指令编译后的数据是属于RO Data区段的。

对于使用const定义的基本数据类型以及结构(这里并不包括class)都是属于RO Data区段,定义在一个class外或者定义在class内部都是如此。

如定义在class外: 

const int age= 6;

typedef struct

{

    char name[20];

    int age;

    int birth;

}struct_person;

const struct_person st_per[2] = {{"name1", age1, birth1}, {"name2", age2, birth2}};

如定义在class中:

class A

{

private:

const static struct_person st_per[2];

};

const struct_person A::st_per[2] = {"name1", age1, birth1}, {"name2", age2, birth2}};

在如上的代码中,age,st_per的数据都是存放在RO Data区段中的。如果其中的struct_person不定义为结构,而定义为类,那么情况又当如何呢?

2、RW Data

对于未使用const定义的变量而且初始化过的变量是属于RW Data区段的,定义在class外和class中都是如此。

如:

int age = 6;

struct_person st_per[2] = {{"name1", age1, birth1}, {"name2", age2, birth2}};

class A

{

private:

struct_person st_per[2];

};

3、ZI Data

对于未使用const定义的变量而且未初始化过的变量是属于RW Data区段的。

如:int age;

但有一点例外,在一个class中,定义一个const的类变量或者类的数组,如将上面提到的struct_person定义为class,则这个变量占用ZI Data区段。

如:

class class_person

{

public:

class_person(name, age, birth);

private:

    char name[20];

    int age;

    int birth;

};

class A

{

private:

const static class_person st_per[2];

};

const class_person A::st_per[2] = {class_person ("name1", age1, birth1), class_person "name2", age2, birth2)};

在这种情况下,st_per类数组的值在编译期无法确定下来,而只能在运行期通过类的构造函数确定,所以编译器会将其放入ZI Data区段。

三、总结

在资源受限的系统下做开发,需要并永远记住的第一条就是:节约资源。

抱歉!评论已关闭.