当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]ARM C编译器支持基本的数据类型:char、short、int、long long、float和double。表14.2说明了armcc对C语言所使用的数据类型的映射。

14.8变量类型

ARMC编译器支持基本的数据类型:char、short、int、longlong、float和double。表14.2说明了armcc对C语言所使用的数据类型的映射。

表14.2 C编译器数据类型映射

C数据类型

表示的意义

char

无符号8位字节数据

short

有符号16位半字数据

int

有符号32位字数据

long

有符号32位字数据

longlong

有符号64位双字数据

ARM指令集中,无论是数据处理指令还是数据加载/存储指令,处理的数据类型不同,指令的执行效率是不一样的。本章将详细讨论,如何在程序中为变量分配合理的数据类型,来提高代码的执行效率。

14.8.1局部变量

ARM属于RISC的体系结构,所有大多数的数据处理都是在32位的寄存器中进行的。基于这个原因,局部变量应尽可能使用32位数据类型int或long。

注意

一些情况下不得不使用char或short类型,例如要使用char或short类型的数据溢出指令时归零特性时,如模运算255+1=0,就要使用char类型。

为了说明局部变量类型的影响,先来看一个简单的例子。

charcharinc(chara)

{

returna+1;

}

编译出的结果如下。

charinc

ADDa1,a1,#1

ANDa1,a1,#&ff

MOVpc,lr

再把上面的程序段中变量a声明位int型,代码如下。

intwordinc(inta)

{

returna+1;

}

比较一下编译器输出结果。

wordinc

ADDa1,a1,#1

MOVpc,lr

分析上面的两段代码不难发现,当把变量声明为char型时,编译器增加了额外的ADD指令来保证其范围在0~255之间。

14.8.2有符号数和无符号数

上一节讨论了对于局部变量和函数参数,使用int型比使用char或short型要好。本节将对程序中的有符号整数(signedint)和无符号整数(unsignedint)的执行效率进行分析比较。

首先来看上一节的例子,如果将变量指定为有符号的半字类型(编译器默认short型为有符号类型),程序的源代码如下。

shortshortinc(shorta)

{

returna+1;

}

编译后的结果如下。

shortinc

ADDa1,a1,#1

MOVa1,a1,LSL#16

MOVa1,a1,ASR#16

MOVpc,lr

分析发现,该结果比使用int型的变量多增加了两条指令(LSL和ASR)。编译器先将变量左移16位,然后右移16位,以实现一个16位符号扩展。右移是符号位扩展移位,它复制了符号位来填充高16位。

通常情况下,如果程序中只有加法、减法和乘法,那么有符号和无符号数的执行效率相差不大。但是,如果有了除法,情况就不一样了。详细内容可参加除法运算优化一节。

14.8.3全局变量1.边界对齐

对于RISC体系结构的处理器来说,访问边界对齐的数据要比访问非对齐的数据更高效。表14.3显示了ARM结构下各数据类型所占的字节数。

表14.3 各数据类型所占字节数

C数据类型

所占字节数

char,singedchar,unsignedchar

1

short,unsignedshort

2

int,unsignedint,long,unsignedlong

4

float

4

double

4

longlong

4

变量定义虽然很简单,但是也有很多值得注意的地方。先看下面的例子。

定义1:

chara;

shortb;

charc;

intd;

定义2:

chara;

charc;

shortb;

intd;

这里定义的4个变量形式都一样,只是次序不同,却导致了在最终映像中不同的数据布局,如同14.1所示,其中pad为无意义的填充数据。

图14.1变量在数据区里的布局

从图中可以看出,第二种方式节约了更多的存储器空间。

由此可见,在变量声明的时候需要考虑怎样最佳的控制存储器布局。当然,编译器在一定程度上能够优化这类问题,但最好的方法还是在编译的时候把所有相同类型的变量放在一起定义。

2.访问外部变量

首先来看一个例子。下面的例子定义了一些全局变量,在main()中为这些变量赋值并将其打印输出。

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

*access.c*

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

#include<stdio.h>

chartx;

charrx;

charbyte;

charc;

unsignedstate;

unsignedflags;

intmain()

{tx=1;

rx=2;

byte=3;

c=4;

state=5;

flags=6;

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

return0;

}

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

C$$code132

C$$data12

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

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

C$$code168

C$$data12

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

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

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

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

*globals.h*

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

/*DECLARATIONSofglobals-includedinallsources*/

#ifdef__arm

structglobs

{chartx;

charrx;

图14.2对extern变量的访问

charbyte;

charc;

unsignedstate;

unsignedflags;

};

externstructglobsg;

#definetxg.tx

#definerxg.rx

#definebyteg.byte

#definecg.c

#definestateg.state

#defineflagsg.flags

#else

externchartx;

externcharrx;

externcharbyte;

externcharc;

externunsignedstate;

externunsignedflags;

#endif

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

*globals.c*

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

/*DEFINITIONSofglobals-singlesourcefile*/

#ifdef__arm

#include"globals.h"

structglobsg;

#else

chartx;

charrx;

charbyte;

charc;

unsignedstate;

unsignedflags;

#endif

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

*access.c*

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

#include<stdio.h>

#include"globals.h"

intmain()

{tx=1;

rx=2;

byte=3;

c=4;

state=5;

flags=6;

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

return0;

}

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

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

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭