马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
开发高效的程序涉及很多方面,包括编程风格、算法实现、针对目标的特殊优化等。尤其是嵌入式高级语言的编程要结合具体的硬件开发环境、软件开发环境,并在一些高级引用中结合操作系统进行开发。 1.
变量定义 先看下面一个例子: char a; char a; short b; char c; char c; short b; int d; int d; 这里顶一顶4个变量形式都一样,只是次序不同,却导致了在最终映像中不同的数据布局,如图所示。显然,第2中方式约了更多的存储空间(pad为无意义的填充数据)。
由此可见,在变量声明时,最好把所有相同类型的变量放在一起定义,这样可以优化存储器布局。 对于局部变量类型的定义,一般情况下,人们总是设法使用short或char来定义变量,以节省存储空间;但是,当一个函数的局部变量数目有限时,其结果恰恰相反。因为编译器会把局部变量分配给内部存储器,每个变量占用一个寄存器,如图所示。假定a1是任何可能的寄存器存储函数的局部变量,同样完成加1的操作,32为的int型变量最快,只用1条加法指令。而8位和16位变量,完成加法操作之后,还需要在32位的寄存器中进行符号扩展,其中有符号的变量,要用逻辑左移和算术右移2条指令才能完成符合扩展;无符号的变量,要使用1条逻辑“与”指令对符号位进行清0.所以,使用32位int或unsigned int局部变量最有效率。 变量定义中,为了精简程序,程序员总是竭力避免使用冗余变量。通常情况下这是正确的,但也有例外。
示例 冗余变量的使用与否比较。 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被分配以寄存器,这样一来,整个函数就只需1次Load/Store访问全局变量存储器。减少存储器访问的次数对于系统性能的改善是非常有好处的。 凌阳教育,专注嵌入式人才培养多年,完善的培养方案,强大的师资,合理的课程安排,成功从小白蜕变为嵌入式工程师。想了解凌阳教育,或者获得更多嵌入式学习资料的免费下载,请点击www.sunplusedu.com访问凌阳教育官网 |