电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

嵌入式工作编译器细节剖析

2017-09-25 16:23分类:电子技术 阅读:

 

做嵌入式工作,编程也多和硬件打交道,许多人说编译器仅仅东西,首要的在于算法和思维。这话说的正本没错,但要有一个条件在先:那即是你真实把握了你所用的编译器。但就我来看,真实了解编译器的却并不多见。当你深化了解一个编译器后,你能像用汇编相同用C,能够像汇编那样为所欲为的操作MCU!

了解一个编译器,首要应当有汇编的根底,不央求能用汇编编写程序或做过项目,但起码看的懂!不了解汇编的嵌入式程序员是不合格的程序员!

了解一个编译器,最佳的办法是看它自带的帮忙文件,起码要看过Compiler User's Guide ,起码遇到疑问会想到到帮忙中查找办法,尽管帮忙大多是E文。

1. 在悉数的内部和外部标识符中,大写和小写字符纷歧样。

2. 默许状况下,char 类型的数据项是无符号的。它们能够显式地声明为signed char 或 unsigned char。

3.底子数据类型的巨细和对齐:

类型 位巨细 按字节天然对齐
char 8 1
short 16 2
int 32 4
long 32 4
long long 64 8
float 32 4
double 64 8
long double 64 8
悉数指针 32 4
bool (仅用于C++ ) 8 1
_Bool (仅用于C) 8 1
wchar_t (仅用于C++ ) 16 2

注:a. 一般有些变量保存在寄存器中,但当有些变量太多放到栈里的时分,它们老是字对齐的。例如有些char变量在栈里以4为鸿沟对齐;

b. 紧缩类型的天然对齐办法为1。运用要害字__packed来紧缩特定构造,将悉数有用类型的对齐鸿沟设置为1.

4. 整数以二进制补码办法标明;浮点量按IEEE格局存储。

5. 有符号量的右移是算术移位,即移位时要确保符号位不改动。

6. 关于int类的值:逾越31位的左移效果为零;无符号值或正的有符号值逾越31位的右移效果为零。负的有符号值移位效果为-1。

7. 整数除法的余数的符号于被除数相同,由ISO C90规范得出;

8. 假定整型值被堵截为短的有符号整型,则经过丢掉恰当数意图最高有用位来得到效果。假定初始数是太大的正或负数,关于新的类型 ,无法确保效果的符号将于初始数相同。所以强行类型转化的时分,对改换的效果必定要明晰。

9. 整型数超界不致使反常;像unsigned char test; test=1000;这类是不会报错的,赋值或核算时有必要留神。

10. 默许状况下,整型数除以零回来零。

11. 关于两个指向相同类型和对齐特征的指针相减,核算效果如下表达式所示:

((int)a ‑ (int)b) / (int)sizeof(指向数据的类型)
12. 在严峻C中,枚举值有必要被标明为整型,例如,有必要在‑2147483648 到+2147483647的计划内。但keil MDK主动运用政策包括enum计划的最小整型来完毕(比方char类型),除非运用编译器指令‑‑enum_is_int 来强即将enum的根底类型设为起码和整型相同宽。超出计划的枚举值默许仅发作正告:#66: enumeration value is out of "int" range

13. 构造体:struct{

char c;

short s;

intx;

} //这个构造体占8个字节

可是,构造体:

struct {

char c;

intx;

short s;

} //这个构造体占12个字节

这是为啥?

关于构造体填充,据界说构造的办法,keil MDK编译器用以下办法的一种来填充构造:

界说为static或许extern的构造用零填充;

栈或堆上的构造,例如,用 malloc() 或许 auto界说的构造,运用早年存储在那些存储器方位的任何内容进行填充。不能运用memcmp() 来比照以这种办法界说的填充构造!

14. 编译器不对声明为volatile 类型的数据进行优化。 我发现还有不少刚入门的嵌入式程序员从没见过这个要害字.

15. __nop():延时一个指令周期,编译器绝不会优化它。假定硬件支撑NOP指令,则该句被替换为NOP指令,假定硬件不支撑NOP指令,编译器将它替换为一个等效于NOP的指令,详细指令由编译器自个抉择。

上一篇:四线法测电阻原理图

下一篇:s9018三极管引脚图参数

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部