没有合适的资源?快使用搜索试试~ 我知道了~
嵌入式 C-C++语言精华文章集锦
需积分: 0 31 下载量 41 浏览量
2008-12-22
09:24:15
上传
评论
收藏 1.67MB PDF 举报
温馨提示
试读
164页
总结了嵌入式开发所需要知道的知识,C/c++语言 以及嵌入式面试题,linux驱动
资源详情
资源评论
资源推荐
1
嵌入式 C/C++语言精华文章集锦
C/C+语言 struct 深层探索 ............................................................................2
C++中 extern "C"含义深层探索........................................................................7
C 语言高效编程的几招...............................................................................11
想成为嵌入式程序员应知道的 0x10 个基本问题 .........................................................15
C 语言嵌入式系统编程修炼...........................................................................22
C 语言嵌入式系统编程修炼之一:背景篇............................................................22
C 语言嵌入式系统编程修炼之二:软件架构篇........................................................24
C 语言嵌入式系统编程修炼之三:内存操作..........................................................30
C 语言嵌入式系统编程修炼之四:屏幕操作..........................................................36
C 语言嵌入式系统编程修炼之五:键盘操作..........................................................43
C 语言嵌入式系统编程修炼之六:性能优化..........................................................46
C/C++语言 void 及 void 指针深层探索 .................................................................50
C/C++语言可变参数表深层探索 .......................................................................54
C/C++数组名与指针区别深层探索 .....................................................................60
C/C++程序员应聘常见面试题深入剖析(1) ..............................................................62
C/C++程序员应聘常见面试题深入剖析(2) ..............................................................67
一道著名外企面试题的抽丝剥茧 ......................................................................74
C/C++结构体的一个高级特性――指定成员的位数 .......................................................78
C/C++中的近指令、远指针和巨指针 ...................................................................80
从两道经典试题谈 C/C++中联合体(union)的使用......................................................81
基于 ARM 的嵌入式 Linux 移植真实体验 ................................................................83
基于 ARM 的嵌入式 Linux 移植真实体验(1)――基本概念 ...........................................83
基于 ARM 的嵌入式 Linux 移植真实体验(2)――BootLoader .........................................96
基于 ARM 的嵌入式 Linux 移植真实体验(3)――操作系统 ..........................................111
基于 ARM 的嵌入式 Linux 移植真实体验(4)――设备驱动 ..........................................120
基于 ARM 的嵌入式 Linux 移植真实体验(5)――应用实例 ..........................................135
深入浅出 Linux 设备驱动编程 .......................................................................144
1.Linux 内核模块..............................................................................144
2.字符设备驱动程序 ...........................................................................146
3.设备驱动中的并发控制 .......................................................................151
4.设备的阻塞与非阻塞操作 .....................................................................157
2
C/C+语言 struct 深层探索
出处:PConline 作者:宋宝华
1. struct 的巨大作用
面对一个人的大型 C/C++程序时,只看其对 struct 的使用情况我们就可以对其编写者的编程经
验进行评估。因为一个大型的 C/C++程序,势必要涉及一些(甚至大量)进行数据组合的结构体,这些结
构体可以将原本意义属于一个整体的数据组合在一起。从某种程度上来说,会不会用 struct,怎样用
struct 是区别一个开发人员是否具备丰富开发经历的标志。
在网络协议、通信控制、嵌入式系统的 C/C++编程中,我们经常要传送的不是简单的字节流(char
型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。
经验不足的开发人员往往将所有需要传送的内容依顺序保存在 char 型数组中,通过指针偏移的
方法传送网络报文等信息。这样做编程复杂,易出错,而且一旦控制方式及通信协议有所变化,程序
就要进行非常细致的修改。
一个有经验的开发者则灵活运用结构体,举一个例子,假设网络或控制协议中需要传送三种报
文,其格式分别为 packetA、packetB、packetC:
struct structA
{
int a;
char b;
};
struct structB
{
char a;
short b;
};
struct structC
{
int a;
char b;
float c;
}
优秀的程序设计者这样设计传送的报文:
struct CommuPacket
{
3
int iPacketType; //报文类型标志
union //每次传送的是三种报文中的一种,使用 union
{
struct structA packetA; struct structB packetB;
struct structC packetC;
}
};
在进行报文传送时,直接传送 struct CommuPacket 一个整体。
假设发送函数的原形如下:
// pSendData:发送字节流的首地址,iLen:要发送的长度
Send(char * pSendData, unsigned int iLen);
发送方可以直接进行如下调用发送 struct CommuPacket 的一个实例 sendCommuPacket:
Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
假设接收函数的原形如下:
// pRecvData:发送字节流的首地址,iLen:要接收的长度
//返回值:实际接收到的字节数
unsigned int Recv(char * pRecvData, unsigned int iLen);
接收方可以直接进行如下调用将接收到的数据保存在 struct CommuPacket 的一个实例 recvCommuPacket 中:
Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );
接着判断报文类型进行相应处理:
switch(recvCommuPacket. iPacketType)
{
case PACKET_A:
… //A 类报文处理
break;
case PACKET_B:
… //B 类报文处理
break;
case PACKET_C:
… //C 类报文处理
break;
}
以上程序中最值得注意的是
Send( (char *)&sendCommuPacket , sizeof(CommuPacket) );
Recv( (char *)&recvCommuPacket , sizeof(CommuPacket) );
中的强制类型转换:(char *)&sendCommuPacket、(char *)&recvCommuPacket,先取地址,再转化为 char 型指针,
这样就可以直接利用处理字节流的函数。
利用这种强制类型转化,我们还可以方便程序的编写,例如要对 sendCommuPacket 所处内存初始化为 0,可以这
样调用标准库函数 memset():
memset((char *)&sendCommuPacket,0, sizeof(CommuPacket));
2. struct的成员对齐
Intel、微软等公司曾经出过一道类似的面试题:
#include <iostream.h>
4
#pragma pack(8)
struct example1
{
short a;
long b;
};
struct example2
{
char c;
example1 struct1;
short e;
};
#pragma pack()
int main(int argc, char* argv[])
{
example2 struct2;
cout << sizeof(example1) << endl;
cout << sizeof(example2) << endl;
cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2) << endl;
return 0;
}
问程序的输入结果是什么?
答案是:
8
16
4
不明白?还是不明白?下面一一道来:
2.1 自然对界
struct 是一种复合数据类型,其构成元素既可以是基本数据类型(如 int、long、float 等)的变量,也可以是
一些复合数据类型(如 array、struct、union 等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,
以提高运算效率。缺省情况下,编译器为结构体的每个成员按其自然对界(natural alignment)条件分配空间。各
个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
自然对界(natural alignment)即默认对齐方式,是指按结构体的成员中 size 最大的成员对齐。
例如:
struct naturalalign
{
char a;
short b;
char c;
};
在上述结构体中,size 最大的是 short,其长度为 2 字节,因而结构体中的 char 成员 a、c 都以 2 为单位对齐,
sizeof(naturalalign)的结果等于 6;
如果改为:
struct naturalalign
5
{
char a;
int b;
char c;
};
其结果显然为 12。
2.2 指定对界
一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),编译器将按照 n 个字节对齐;
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
注意:如果#pragma pack (n)中指定的 n 大于结构体中最大成员的 size,则其不起作用,结构体
仍然按照 size 最大的成员进行对界。
例如:
#pragma pack (n)
struct naturalalign
{
char a;
int b;
char c;
};
#pragma pack ()
当 n 为 4、8、16 时,其对齐方式均一样,sizeof(naturalalign)的结果都等于 12。而当n为2
时,其发挥了作用,使得 sizeof(naturalalign)的结果为 6。
在 VC++ 6.0 编译器中,我们可以指定其对界方式(见图 1),其操作方式为依次选择 projetct >
setting > C/C++菜单,在 struct member alignment 中指定你要的对界方式。
图 1 在 VC++ 6.0 中指定对界方式
剩余163页未读,继续阅读
elfstream
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0