在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 1493|回复: 0

[资料] 嵌入式C语言程序设计技巧------变量定义

[复制链接]
发表于 2016-3-3 15:05:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

开发高效的程序涉及很多方面,包括编程风格、算法实现、针对目标的特殊优化等。尤其是嵌入式高级语言的编程要结合具体的硬件开发环境、软件开发环境,并在一些高级引用中结合操作系统进行开发。

1.
变量定义

先看下面一个例子:

char    a;   char   a;

short     b;    char   c;

char       c;   short  b;

int          d;  int    d;

这里顶一顶4个变量形式都一样,只是次序不同,却导致了在最终映像中不同的数据布局,如图所示。显然,第2中方式约了更多的存储空间(pad为无意义的填充数据)。

QQ截图20160303145301.png

由此可见,在变量声明时,最好把所有相同类型的变量放在一起定义,这样可以优化存储器布局。

对于局部变量类型的定义,一般情况下,人们总是设法使用shortchar来定义变量,以节省存储空间;但是,当一个函数的局部变量数目有限时,其结果恰恰相反。因为编译器会把局部变量分配给内部存储器,每个变量占用一个寄存器,如图所示。假定a1是任何可能的寄存器存储函数的局部变量,同样完成加1的操作,32为的int型变量最快,只用1条加法指令。而8位和16位变量,完成加法操作之后,还需要在32位的寄存器中进行符号扩展,其中有符号的变量,要用逻辑左移和算术右移2条指令才能完成符合扩展;无符号的变量,要使用1条逻辑“与”指令对符号位进行清0.所以,使用32intunsigned int局部变量最有效率。

变量定义中,为了精简程序,程序员总是竭力避免使用冗余变量。通常情况下这是正确的,但也有例外。

QQ截图20160303145239.png

示例 冗余变量的使用与否比较。

int f(void);     

int g(void);

int errs;

void test1(void)

{

errs+=f()

errs+=g()

}

void test2(void)

{

int localerrs=errs;

localerrs+=f();

localerrs+=g();

errs=localerrs;

}

在第一种情况test1()里,每次访问全局变量errs时,都要先从相应的存储器Load到寄存器里,经f()g()函数调用后再Store回原来的存储区里面。在这个例子里,一共要进行2次这样的Load/Store操作。而在第2种情况test2()里,局部变量localerrs被分配以寄存器,这样一来,整个函数就只需1Load/Store访问全局变量存储器。减少存储器访问的次数对于系统性能的改善是非常有好处的。

凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-10 16:17 , Processed in 0.014750 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表