从单片机基础到程序框架(全集 2019pdf版).pdf - 第305页

其它 部分的 代码 不要动 。编 译后 ,把程 序下 载进带 串口 的 51 学 习板, 通过 电脑 端的串 口助 手软件 就可 以观 察到不同的 变量数值,详 细方法请看第 十一节 内容。

100%1 / 836
void main() //主函数
{
GtMould.u8Data_A=1; //依靠成员的“名字”来“调用”
GtMould.u16Data_B=2; //依靠成员的“名字”来“调用”
GtMould.u32Data_C=3; //依靠成员的“名字”来“调用”
View(GtMould.u8Data_A); //把结构体成员 GtMould.u8Data_A 发送到电脑端观察
View(GtMould.u16Data_B); //把结构体成 GtMould.u16Data_B 发送到电脑端观察
View(GtMould.u32Data_C); //把结构体成 GtMould.u32Data_C 发送到电脑端观察
while(1)
{
}
}
/*---C 语言学习区域的结束。-----------------------------------------------*/
在电脑串口助手软件上观察到的程序执行现象如下:
开始...
1 个数
十进制:1
十六进制:1
二进制:1
2 个数
十进制:2
十六进制:2
二进制:10
3 个数
十进制:3
十六进制:3
二进制:11
分析:
GtMould.u8Data_A 1。
GtMould.u16Data_B 2。
GtMould.u32Data_C 3。
【70.4 如何在单片机上练习本章节 C 语言程序?】
直接复制前面章节中第十一节的模板程序,练习代码时只需要更改C 语言学习区域”代码就可以了,
其它部分的代码不要动。编译后,把程序下载进带串口 51 习板,通过电脑端的串口助手软件就可以观
察到不同的变量数值,详细方法请看第十一节内容。
第七十一节: 结构体的内存和赋值。
【71.1 结构体的内存生效。
上一节讲到结构体有三道标准工序“造模”和“生成”和“调用,那么,结构体在哪道工序的时候
会开始占用内存(或者说内存生效)?答案是在第二道工序“生成”或者说定义)的时候才产生内存开销
第一道工序仅“造模”不“生成”是不会产生内存的。什么意思呢?请看下面的例子。
第一种情况:仅“造模”不“生成”
struct StructMould //“造模
{
unsigned char u8Data_A;
unsigned char u8Data_B;
};
分析:这种情况是没有内存开销的,尽管你已经写下了数行代码,但是 C 编译器在翻译此代码的时候,
它会识别到你偷工减料仅仅“造模”而不“生成”新变量,此 C 编译器会把你这段代码忽略而过。
第二种情况:先“造模”再“生成”
struct StructMould //“造模
{
unsigned char u8Data_A;
unsigned char u8Data_B;
};
struct StructMould GtMould_1; //“生成”一个变 GtMould_1。占用 2 个字节内存
struct StructMould GtMould_2; //“生成”一个变 GtMould_2。占用 2 个字节内存
分析:这种情况才会占用内存。你“生成”变量越多,占用的内存就越大。像本例子,“生成”了两个
变量 GtMould_1 GtMould_2,一个变量占用 2 个字节,两个就一共占用 4 个字节。结论:内存的占用是
跟变量的“生成”有关。
【71.2 结构体的内存对齐。
什么是对齐?为了确保内存的地址能整除某个对齐倍数”(比如 4)如以 4 “对齐倍数”在地
0 存放一个变量 a,因为地址 0 能整“对齐倍数”4,所以符合地址对齐”接着往下再存放第二个变量 b,
紧接着的地 1 不能整除“对齐倍数”4,此时,为了内存对齐,本来打算把变量 b 放到地址 1 ,现在
要更改挪到地址 4 才符合“地址对齐”这就是内存对齐的含义。“对齐倍数”是什么?“对齐倍数”就是
片机的位数除以 8。比如 8 位单片机的“对齐倍数”是 1(8 除以 8),16 位单片机是 2(16 除以 8)32 位单
片机是 4(32 除以 8)本教程所用的单片机是 8 位的 51 内核单片机因此“对齐倍数” 1。1 是可以被
何整数整除的,因此,8 位单片机在结构体的使用上被内存对齐的“干扰”是最小的。