微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 高效的C编程之: 变量类型

高效的C编程之: 变量类型

时间:08-30 来源:3721RD 点击:

r c;

unsigned state;

unsigned flags;

int main ()

{ tx = 1;

rx = 2;

byte = 3;

c = 4;

state = 5;

flags = 6;

printf("%u %u %u %u %u %u\n", tx, rx, byte, c, state, flags);

return 0;

}

使用armcc编译,生成的代码大小如下。

C$$code 132

C$$data 12

如果将全局变量声明为extern,变量的定义在其他文件中,那么生成的代码量将有所增加。

将全局变量声明为extern,生成的代码大小如下。

C$$code 168

C$$data 12

这是因为当将变量声明为extern后,每次访问变量编译器都将从内存重新加载,而不是使用内存偏移,直接访问。

下图显示编译器对声明为extern变量的访问。

解决的办法是将要从外部引用的extern变量定义在一个结构体中。在程序中通过结构体访问外部变量。具体用法如下例所示。

/*************

* globals.h *

*************/

/* DECLARATIONS of globals - included in all sources */

#ifdef __arm

struct globs

{ char tx;

char rx;

图14.2 对extern变量的访问

char byte;

char c;

unsigned state;

unsigned flags;

};

extern struct globs g;

#define tx g.tx

#define rx g.rx

#define byte g.byte

#define c g.c

#define state g.state

#define flags g.flags

#else

extern char tx;

extern char rx;

extern char byte;

extern char c;

extern unsigned state;

extern unsigned flags;

#endif

/*************

* globals.c *

*************/

/* DEFINITIONS of globals - single source file */

#ifdef __arm

# include "globals.h"

struct globs g;

#else

char tx;

char rx;

char byte;

char c;

unsigned state;

unsigned flags;

#endif

/************

* access.c *

************/

#include <stdio.h>

#include "globals.h"

int main ()

{tx = 1;

rx = 2;

byte = 3;

c = 4;

state = 5;

flags = 6;

printf("%u %u %u %u %u %u\n", tx, rx, byte, c, state, flags);

return 0;

}

将变量定义在结构体内有以下几点好处。

· 全局变量使用更小的内存空间。(没有使用结构体占有24字节,而使用结构体之后只占有12字节)

· 全局变量被放置在ZI段而不是RW段,这样就减少了ROM映像文件的大小。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top