没有合适的资源?快使用搜索试试~ 我知道了~
首页C语言深层探索+ARM linux移植
C/C+语言struct深层探索 1 C++中extern "C"含义深层探索 7 C语言高效编程的几招 12 C语言嵌入式系统编程修炼 23 C语言嵌入式系统编程修炼之一:背景篇 23 C语言嵌入式系统编程修炼之二:软件架构篇 25 C语言嵌入式系统编程修炼之三:内存操作 31 C语言嵌入式系统编程修炼之四:屏幕操作 37 C语言嵌入式系统编程修炼之五:键盘操作 45 C语言嵌入式系统编程修炼之六:性能优化 49 C/C++语言void及void指针深层探索 52 C/C++语言可变参数表深层探索 56 C/C++程序员应聘常见面试题深入剖析(2) 70 基于ARM的嵌入式Linux移植真实体验 79 基于ARM的嵌入式Linux移植真实体验(1)――基本概念 79 基于ARM的嵌入式Linux移植真实体验(2)――BootLoader 91 一道著名外企面试题的抽丝剥茧 106 基于ARM的嵌入式Linux移植真实体验(3)――操作系统 110 基于ARM的嵌入式Linux移植真实体验(4)――设备驱动 119 基于ARM的嵌入式Linux移植真实体验(5)――应用实例 136 C/C++结构体的一个高级特性――指定成员的位数 145 C/C++中的近指令、远指针和巨指针 147 从两道经典试题谈C/C++中联合体(union)的使用 149 深入浅出Linux设备驱动编程 151 1.Linux内核模块 151 2.字符设备驱动程序 153 3.设备驱动中的并发控制 158 4.设备的阻塞与非阻塞操作 165
资源详情
资源评论
资源推荐

语言 深层探索
中 含义深层探索
语言高效编程的几招
语言嵌入式系统编程修炼
语言嵌入式系统编程修炼之一背景篇
语言嵌入式系统编程修炼之二软件架构篇
语言嵌入式系统编程修炼之三内存操作
语言嵌入式系统编程修炼之四屏幕操作
语言嵌入式系统编程修炼之五键盘操作
语言嵌入式系统编程修炼之六性能优化
语言 及 指针深层探索
语言可变参数表深层探索
数组名与指针区别深层探索
程序员应聘常见面试题深入剖析
程序员应聘常见面试题深入剖析
基于 ! 的嵌入式 " 移植真实体验
基于 ! 的嵌入式 " 移植真实体验()――基本概念
基于 ! 的嵌入式 " 移植真实体验()――#"$%
基于 ! 的嵌入式 " 移植真实体验()――操作系统
基于 ! 的嵌入式 " 移植真实体验()――设备驱动
基于 ! 的嵌入式 " 移植真实体验()――应用实例
结构体的一个高级特性――指定成员的位数
中的近指令、远指针和巨指针
从两道经典试题谈 中联合体()的使用
深入浅出 " 设备驱动编程
" 内核模块
字符设备驱动程序
设备驱动中的并发控制
设备的阻塞与非阻塞操作
C/C+语言 struct 深层探索
出处:&'(作者:宋宝华ˆˆ
1. struct 的巨大作用ˆ
面对一个人的大型 程序时,只看其对 的使用情况我们就
可以对其编写者的编程经验进行评估。因为一个大型的 程序,势必要涉

及一些甚至大量进行数据组合的结构体,这些结构体可以将原本意义属于一
个整体的数据组合在一起。从某种程度上来说,会不会用 ,怎样用
是区别一个开发人员是否具备丰富开发经历的标志。ˆ
在网络协议、通信控制、嵌入式系统的 编程中,我们经常要传送
的不是简单的字节流()$ 型数组),而是多种数据组合起来的一个整体,其
表现形式是一个结构体。ˆ
经验不足的开发人员往往将所有需要传送的内容依顺序保存在 )$ 型数
组中,通过指针偏移的方法传送网络报文等信息。这样做编程复杂,易出错,
而且一旦控制方式及通信协议有所变化,程序就要进行非常细致的修改。ˆ
一个有经验的开发者则灵活运用结构体,举一个例子,假设网络或控制协
议中需要传送三种报文,其格式分别为 *$+、*$+#、*$+:ˆ
,
$-
)$.-
/-
(
#
,
)$$-
).-
/-
(
,
$-
)$.-
0$-
/
优秀的程序设计者这样设计传送的报文:ˆ
11&$+
,
&$+23*- 报文类型标志ˆ
每次传送的是三种报文中的一种,使用
,
*$+-#*$+#-
*$+-
/
/-
在进行报文传送时,直接传送 11&$+ 一个整体。ˆ
假设发送函数的原形如下:ˆ
*45$$:发送字节流的首地址,":要发送的长度ˆ

4)$6*45$$78"-
发送方可以直接进行如下调用发送 11&$+ 的一个实例
11&$+:ˆ
4)$6911&$+7:;11&$+-
假设接收函数的原形如下:ˆ
* 5$$:发送字节流的首地址,":要接收的长度ˆ
返回值:实际接收到的字节数ˆ
8 )$6* 5$$78";ˆ
接收方可以直接进行如下调用将接收到的数据保存在 11&$+ 的一个实
例 11&$+ 中:ˆ
)$6911&$+7:;11&$+-
接着判断报文类型进行相应处理:ˆ
<)11&$+&$+23*
,
$&=>2?
@ 类报文处理ˆ
.$+-
$&=>2?#
@ ˆˆ# 类报文处理ˆ
.$+-
$&=>2?
@ 类报文处理ˆ
.$+-
/
以上程序中最值得注意的是ˆ
4)$6911&$+7:;11&$+-
)$6911&$+7:;11&$+-
中的强制类型转换:)$6911&$+、)$
6911&$+,先取地址,再转化为 )$ 型指针,这样就可以直接利用处理
字节流的函数。ˆ
利用这种强制类型转化,我们还可以方便程序的编写,例如要对 11&$+
所处内存初始化为 ,可以这样调用标准库函数 11:ˆ
11)$6911&$+77:;11&$+-
(((( 的成员对齐ˆ
A'、微软等公司曾经出过一道类似的面试题:ˆ
B'C$1)D
B*$81$*$+
$1*'
,
)$-
'8.-
/-
$1*'
,

)$-
$1*'-
)-
/-
B*$81$*$+
1$$87)$6$8EF
,
$1*'-
CC:;$1*'CC'-
CC:;$1*'CC'-
CC89G89CC
'-
-
/
问程序的输入结果是什么?ˆ
答案是:ˆ
不明白?还是不明白?下面一一道来:ˆ
自然对界ˆ
是一种复合数据类型,其构成元素既可以是基本数据类型(如
、'8、0$ 等)的变量,也可以是一些复合数据类型(如 $$3、、
等)的数据单元。对于结构体,编译器会自动进行成员变量的对齐,以提高运算效率。缺
省情况下,编译器为结构体的每个成员按其自然对界($$'$'81)条件分配空
间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的
地址相同。ˆ
自然对界$$'$'81即默认对齐方式,是指按结构体的成员中 : 最大的
成员对齐。ˆ
例如:ˆ
$$'$'8
,
)$$-
).-
)$-
/-
在上述结构体中,: 最大的是 ),其长度为 字节,因而结构体中的 )$ 成
员 $、 都以 为单位对齐,:;$$'$'8的结果等于 ;ˆ
如果改为:ˆ
$$'$'8
,
)$$-
.-
)$-

/-
其结果显然为 。ˆ
2.2 指定对界ˆ
一般地,可以通过下面的方法来改变缺省的对界条件:ˆ
H使用伪指令B*$81$*$+,编译器将按照 个字节对齐;ˆ
H使用伪指令B*$81$*$+,取消自定义字节对齐方式。ˆ
注意:如果#pragma pack (n)中指定的 n 大于结构体中最大成员的
size,则其不起作用,结构体仍然按照 size 最大的成员进行对界。ˆ
例如:ˆ
B*$81$*$+
$$'$'8
,
)$$-
.-
)$-
/-
B*$81$*$+
当 为 、、 时,其对齐方式均一样,:;$$'$'8的结果
都等于 。而当 为 时,其发挥了作用,使得 :;$$'$'8的结果
为 。ˆ
在 I 编译器中,我们可以指定其对界方式(见图 ),其操作方
式为依次选择 *JD8D菜单,在 11.
$'81 中指定你要的对界方式。ˆ
(
图 1 在 VC++ 6.0 中指定对界方式ˆ
另外,通过??$.$'8也可以让所作用的结构体成员对齐
在 字节边界上,但是它较少被使用,因而不作详细讲解。ˆ
剩余63页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论3