当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]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映像文件的大小。

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

在下述的内容中,小编将基于用FIFO实现超声测厚系统A/D与ARM接口设计。如果这是您想要了解的内容之一,不妨和小编共同阅读这篇文章哦。

关键字: FIFO 超声测厚系统 ARM

从ChatGPT到AI手机、AI PC,AI正在各种不同型态的设备上落地。而作为几百亿台移动设备和嵌入式设备的计算核心的供应商,Arm也敏锐捕捉到了这一新的重大机遇,持续在全线的新产品中增加AI的功能和特性,助力实现设备...

关键字: ARM Cortex-X925 Immortalis G925 终端计算子系统 CSS for Client

业内消息,近日Arm公司官宣推出全新的基于Arm v9架构的CPU、GPU IP,以及设计软件工具,以帮助智能手机更好地处理人工智能(AI)任务,并加速AI应用。

关键字: ARM 芯片IP 黑鹰 超大核 Cortex-A725

最新消息,昨天北京开源芯片研究院官宣 ,2024 年 5 月 21 日开芯院通过线上会议的方式,向会员单位正式发布了全球首个开源大规模片上互联网络(Network on Chip,NoC)IP—— 研发代号“温榆河”。这...

关键字: ARM 垄断 开源 片上互联网络 温榆河

据《日经新闻》报道,软银旗下英国芯片制造商Arm计划到2025年销售AI芯片。该公司专门成立一个AI芯片部门,并将在2025年春季之前制造出原型产品,并于秋季开始大规模生产。

关键字: 软银 AGI ARM AI芯片

业内消息,近日日本软件银行集团(SoftBank Group)旗下安谋国际科技公司(Arm)计划研发人工智能(AI)芯片,先成立一个AI芯片部门,目标是明年春季建立AI芯片原型产品,然后将量产工作交由代工厂制造,预估20...

关键字: ARM AI芯片

【2024年5月8日,德国慕尼黑讯】Rust编程语言凭借其独特的内存安全特性,已经成为汽车软件开发中C/C++的有效补充和潜在替代品。全球功率系统和物联网领域的半导体领导者英飞凌科技股份公司(FSE代码:IFX / OT...

关键字: 编译器 微控制器

Arm CPU正在从根本上推动AI变革,并造福地球。Arm架构是未来AI计算的基石。​

关键字: ARM AI

近日,Arm推出了Arm® Ethos™-U85神经网络处理器(NPU)和Arm Corstone™-320物联网参考设计平台,旨在满足海量的数据处理和大规模计算,加速推进边缘AI的发展进程。

关键字: ARM

为了赶超云计算市场上的竞争对手,谷歌正试图通过定制的Arm服务器芯片降低云计算服务成本。

关键字: 谷歌 ARM 定制芯片
关闭
关闭