爱悠闲 > 相关文章 >

理解C语言位域

编译器是怎么被编译出来的?
编译已有的这个C编译器的源代码,就可以得到能在Y系统上运行的C语言编译器了。(交叉编译器:在X系统上运行的编译器,但编译出来的目标代码在Y系统上运行。嵌入式平台上的程序基本都是交叉编译得到的,因为嵌入式平台上很少会有自己的编译器) Case 2: X,Y上都没有C语言编译器,但有另一种语言编译器。     a.我们可以先划出C语言的一个子集,这个子集必须满足两个条件:首先,必须足够简单,简单到可以用另一种语言来编写接受这个子集的编译器;其次,必须足够强大,强大到用这个语言子集就可以编写出接受C
(bit fields)简介
的整数倍;   3) 如果相邻的字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位字段存放在不同的类型字节中),Dev-C++和GCC都采取压缩方式;   系统会先为结构体成员按照对齐方式分配空间和填塞(padding),然后对变量进行操作。  struct mybitfields {     unsigned short a : 4;     unsigned short b : 5;     unsigned short c : 7; } test
C语言中(bit struct)和#pragma pack(n)指令对其影响。
;         int b:2;         int c:6; } ;  变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者 直接说明这三种方式。例如: struct  bs ... {         int a:8;         int b:2;         int c:6; } data; 说明data为bs变量,共占两个字节。其中a占8位,b占2位,c占6位。 (上面的说法好像不太对,我们假设sizeof(int) == 4,那么
C语言中(bit struct)和#pragma pack(n)指令对其影响。
;          int  b: 2 ;          int  c: 6 ; } ;  变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者 直接说明这三种方式。例如: struct  bs {          int  a: 8 ;          int  b: 2 ;          int  c: 6 ; } data; 说明data为bs变量,共占两个字节。其中a占8位,b占2位,c占6位。 (上面的说法好像不太对,我们假设sizeof
C结合对齐(pragma)的例子及解释
的具体实现有差异,VC6采取不压缩方式(不同位字段存放在不同的类型字节中),Dev-C++和GCC都采取压缩方式; 系统会先为结构体成员按照对齐方式分配空间和填塞(padding),然后对变量进行操作。 理解了吗?试着做下面几个例子(VS 2003)。 #pragma pack(1)  struct s4{  char a:4;  short b:4;  short c:4;  long d; }; 输出S4 sizeof:7 #pragma pack(1)  struct s4
走进结构体存储--
1、简介        在嵌入式编程中,经常会遇到下面的结构: struct _data { char a:6; char b:2; char c:7; }data;       在存储信息的时候,我们可能并不需要占用一个完整的字节,而只需占一个或几个二进制位,如要存储一个八进制数据,只需要3 个二进制位就够了。为了节省存储空间,C 语言提供了这种数据结构。所谓,就是把存储空间中的二进制位划分为几个不同的区域,并说明每个区域的位数,每个有一个域名,允许
关于c语言的一些你不知道的东西 (,static,struct)加速。
嵌入式系统总是要用户对变量或寄存器进行操作。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。在以上两个操作中,要保持其它不变。 对这个问题有三种基本的反应 1)不知道如何下手。该被面者从没做过任何嵌入式系统的工作。 2) 用bit fields。Bit fields是被扔到C语言死角的东西,它保证你的代码在不同编译器之间是不可移植的,同时也保证了的你的代码是不可重用的。我最近不幸看到 Infineon为其较复杂的通信芯片写的驱动程序,它用到了bit
,pragma pack(n)相关
/**//*从下一单元开始存放*/ unsigned c:4 } 在这个位定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。 2. 由于不允许跨两个字节,因此的长度不能大于一个字节的长度,也就是说不能超过8位二进位。(按照以上的理解,就说明的长度不能够超过所定义类型的长度,例如 定义: int a:36就是不允许的) 3. 可以无域名,这时它只用来作填充或调整位置。无名的是不能使 用的。例如: struct k{ int a:1
失落的C语言结构体封装艺术
*/ }; 因为s只需对齐到2字节, 跨步地址就只有c后面的一个字节,struct foo4作为一个整体,只需要一个字节的尾随填充。它会像这样分布 1 2 3 4 5 struct foo4 {      short s;     /* 2 bytes */      char c;      /* 1 byte */      char pad[ 1 ]; }; 并且sizeof(struct foo4)会返回4。 现在让我们考虑(bitfield)。它们是你能够声明比字符宽度还小的结构体,小到1位
结构体封装(C语言
你做嵌入式系统,你也许会在跌倒在这些丛林陷阱中。注意,这是有可能的。 有时你可以通过编译指示,强制让你的编译器不使用处理器正常的对齐规则,通常是#pragma pack。不要随意使用,因为它会导致产生开销更大、更慢的代码。使用我在这里描述的技术,通常你可以节省同样或者几乎同样多的内存。 #pragma pack的唯一好处是,如果你不得不将你的C语言数据分布精确匹配到某些级别的硬件或协议的需求,比如一个内存映射的硬件端口,要求违反正常的对齐才能奏效。如果你遇到那种情况,并且你还未理解我在这里写
C语言中的结构(struct
,以字节为基本单位的存储模式会浪费大量内存空间。有些设备提供的存储空间有限,例如嵌入式系统,因此必须对存储开销“精打细算”。可使用运算来解决。 1、的声明 以单个的(bit)为单位来设计一个结构所需要的存储空间。的声明是在结构的成员名后面加一个冒号和一个整数,这个整数指定该位所占用的的数目。声明时注意: (1)C语言成员必须声明为int、signed int或unsigned int类型,C++还允许使用char、long等类型。 (2)signed int类型
C语言嵌入式系统编程修炼之道
2.函数指针... 13 3.数组vs.动态申请... 14 4.关键字const 15 5.关键字volatile. 16 6.CPU字长与存储器宽不一致处理... 17 总结... 18 C语言嵌入式系统编程修炼之道——屏幕操作篇... 19 1.汉字处理... 19 2.系统时间显示... 20 3.动画显示... 21 4.菜单操作... 22 5.模拟MessageBox函数... 24 总结... 26 C语言嵌入式系统编程修炼之道——键盘操作篇... 27 1.处理功能键
C语言嵌入式系统编程修炼之道
函数指针... 13 3.数组vs.动态申请... 14 4.关键字const 15 5.关键字volatile. 16 6.CPU字长与存储器宽不一致处理... 17 总结... 18 C语言嵌入式系统编程修炼之道——屏幕操作篇... 19 1.汉字处理... 19 2.系统时间显示... 20 3.动画显示... 21 4.菜单操作... 22 5.模拟MessageBox函数... 24 总结... 26 C语言嵌入式系统编程修炼之道——键盘操作篇... 27 1.处理功能键... 27
C语言嵌入式系统编程修炼之道
函数指针... 13 3.数组vs.动态申请... 14 4.关键字const 15 5.关键字volatile. 16 6.CPU字长与存储器宽不一致处理... 17 总结... 18 C语言嵌入式系统编程修炼之道——屏幕操作篇... 19 1.汉字处理... 19 2.系统时间显示... 20 3.动画显示... 21 4.菜单操作... 22 5.模拟MessageBox函数... 24 总结... 26 C语言嵌入式系统编程修炼之道——键盘操作篇... 27 1.处理功能键... 27
C语言嵌入式系统编程修炼之道
volatile. 16 6.CPU字长与存储器宽不一致处理... 17 总结... 18 C语言嵌入式系统编程修炼之道——屏幕操作篇... 19 1.汉字处理... 19 2.系统时间显示... 20 3.动画显示... 21 4.菜单操作... 22 5.模拟MessageBox函数... 24 总结... 26 C语言嵌入式系统编程修炼之道——键盘操作篇... 27 1.处理功能键... 27 2.处理数字键... 28 3.整理用户输入... 29 总结... 30 C语言嵌入式系统编程修炼之道
C/C++ struct结构(
占用的总空间为6 bit < 8 bit(1 byte),这时编译器会将这三个成员'捆绑'在一起做对齐,并且以最小空间作代价,这就是为什么我们得到sizeof(struct foo2) = 1这样的结果的原因了。再看看foo3这个结构体,同foo2一样,三个成员类型也都是char型,但是三个成员所占空间之和为9 bit > 8 bit(1 byte),这里是不能跨越两个成员基本类型空间的,这时编译器将a和b两个成员'捆绑'按照char做对齐,而c单独拿出来以char类型做对齐, 这样实际上
C/C++ struct结构(
byte),这时编译器会将这三个成员'捆绑'在一起做对齐,并且以最小空间作代价,这就是为什么我们得到sizeof(struct foo2) = 1这样的结果的原因了。再看看foo3这个结构体,同foo2一样,三个成员类型也都是char型,但是三个成员所占空间之和为9 bit > 8 bit(1 byte),这里是不能跨越两个成员基本类型空间的,这时编译器将a和b两个成员'捆绑'按照char做对齐,而c单独拿出来以char类型做对齐, 这样实际上在b和c之间出现了空隙,但这也是最节省空间的方法
C语言嵌入式系统编程修炼之道
C语言嵌入式系统编程修炼之道   转自:嵌入式C语言面试题 C语言嵌入式系统编程修炼之道——背景篇 C语言嵌入式系统编程修炼之道——软件架构篇 1.模块划分 2.多任务还是单任务 3.单任务程序典型架构 4.中断服务程序 5.硬件驱动模块 6.C的面向对象化 总结 C语言嵌入式系统编程修炼之道——内存操作篇 1.数据指针 2.函数指针 3.数组vs.动态申请 4.关键字const 5.关键字volatile 6.CPU字长与存储器宽不一致处理 总结 C语言嵌入式系统编程修炼之道——屏幕操作篇
是先有语言还是先有编译器
我公司的汇编语言是用C语言编译器,追根溯源,那最初的语言是用什么语言写的编译器
C语言嵌入式系统编程
到的内存空间为1MB,只有实地址模式。C语言编译生成的指针为32位(双字),高16位为段地址,低16位为段内编译,一段最多64KB。 图1系统硬件架构   协议处理模块中的FLASH和RAM几乎是每个嵌入式系统的必备设备,前者用于存储程序,后者则是程序运行时指令及数据的存放位置。系统所选择的FLASH和RAM的宽都为16位,与CPU一致。   实时钟芯片可以为系统定时,给出当前的年、月、日及具体时间(小时、分、秒及毫秒),可以设定其经过一段时间即向CPU提出中断或设定报警时间到来时向CPU提出