结构体与共同体(联合体)的妙用
结构体与共同体(联合体)的妙用
学习过C语言后,大家都了解了结构体与共同体。两者之间的区别是:
共同体:使几个不同类型的变量共占一段内存(相互覆盖)。所占内存长度是各最长的成员占的内存长度。
结构体:把不同类型的数据组合成一个整体。所占内存长度是各成员占的内存长度的总和。
在C2000官方样例中,对寄存器的定义就大量使用了这两种数据结构来完成对寄存器总体或者对寄存器每一位的操作。下面,我们通过EPWM寄存器结构体设计的例子来看一下它们的使用方法。
首先,我们声明一个结构体:
TBCTL_BITS的结构体声明了TBCTL里的每一个位的分配情况。对应一下技术参考手册对TBCTL的描述:
可以看到结构体是按低位开始向高位排列,而后面跟的数字就是每一个寄存器域占的位长,例如第一个CTRMODE对应了TBCTL Register的最低两位。
然后再声明一个共同体:
里面有两个参数,一个是all,一个是上面声明的结构体。根据union共同体的说明,我们就知道整型变量all和结构体bit占用了同一个数据空间,对all的操作会影响bit,同样对bit的操作会影响all。这也意味着,all这个16位整型变量的每一位,就对应了bit这个结构体的相应的一个成员变量。例如,对all的最低两位的操作,就对应了bit中的CTRMODE这个位长为2的成员变量。
然后我们知道,TBCTL_REG是属于EPWM寄存器,正如技术参考手册上的描述:
所以我们又可以声明一个EPWM寄存器的结构体:
这样,再将EPWM_REGS 声明的寄存器例如Epwm1Regs分配到EPWM1寄存器的地址,就完成了一个名为Epwm1Regs寄存器的声明。如何来操作呢?
例如,我想把计数模式改成1,就有两种方法来实现:
首先
整体赋值:Epwm1Regs.TBCTL.all |= 0x01;位赋值:Epwm1Regs.TBCTL.bit.CTRMODE = 0x01;
第一个是全局赋值,因此要和all不赋值的位进行或0,赋值位进行或1,即改变了all的最低两位为1,而第二个是位赋值,即直接对计数模式位进行1的赋值。
理解了这个方法后,再来看样例对寄存器的操作是不是就很轻松了?掌握这个方法以后,你也可以设计一个带全局或者位操作的结构体来完成自己的程序数据的应用了。
结构体与共同体(联合体)的妙用相关推荐
- c语言 结构体 ppt,第8章C语言的结构体和共同体.ppt
<第8章C语言的结构体和共同体.ppt>由会员分享,可在线阅读,更多相关<第8章C语言的结构体和共同体.ppt(41页珍藏版)>请在皮匠网上搜索. 1.1第八章结构体.共用体和 ...
- c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt
<<结构体与共同体>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<结构体与共同体>PPT课件.ppt(44页珍藏版)>请在装配图网上搜索. 1 ...
- 结构体位域及联合体解析
由于叙述不及代码演示,直接上代码:后面叙述下优缺点: //结构体位域及联合体解析 //sizeof(s1)等于3.因为一个位域字段必须存储在其位域类型的一个单元所占空间中,不能横跨两个该位域类型的单元 ...
- C语言结构体和共同体
文章目录 结构体 用typedef说明一个新类型 结构体类型数据的定义和成员的引用 概述 结构体的定义和使用 结构体数组 结构体排序 结构体赋值 结构体嵌套结构体 共用体(联合体) 结构体 用type ...
- 结构体类型、联合体类型
结构体和联合体 一.结构体类型 1. 结构体类型的设计和初始化 2. 结构体大小的计算 3. 结构体成员的访问和赋值 4. 结构体类型和指针 (1)变量名为指针时: (2)结构体赋值时容易出现的问题: ...
- 结构体 位段 枚举 联合体
结构体对齐规则: 1.第一个成员在结构体变量偏移量为0的地址处 2.其他成员变量要对齐到对齐数的整数倍的地址处 对齐数=编译器默认对起数 和 成员字节大小中的较小值 3.结构体总大小为最大对齐数的整数 ...
- 呵呵哒!手把手教你C语言结构体与共同体
1.声明一个结构体类型的一般形式为:struct 结构体名{成员表列}; (1)在声明类型的同时定义变量 struct student{int num;char name[20];char sex;i ...
- 【C语言进阶】结构体 位段 枚举 联合体详解
目录 1.结构体 1.1结构体的基础类型 1.2结构的声明 1.3特殊的声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐(计算结构体的大小) 1.6.1 结构体对齐规则 ...
- 10_结构体与共同体
10.1 用typedef 说明一个新类型 typedef为C语言的关键字,作用是为一种数据类型(基本类型或自定义数据类型)定义一个新名字,不能创建新类型. 与#define不同,typedef仅限于 ...
最新文章
- Rushcrm:企业部署CRM系统做什么
- 北风设计模式课程---单一职责原则
- appium的demo编程
- 同等学力计算机综合难吗,报考2018年同等学力申硕计算机在职研究生毕业很困难吗...
- PVM的安装和编译PVM程序
- cmake使用示例与整理总结
- java joda_java-Jodatime的开始时间和结束时间
- 网页中设定表格边框的厚度的属性_请写出在网页中设定表格边框的厚度的属性_______;设定表格单元格之间宽度属性...
- python etree pandas_python爬虫Xpath,pandas示例
- oracle双重for循环sql,Oracle 11g中for循环中的PL / SQL限制
- NetscalerSSL证书的导入和link
- MongoDB学习笔记—Linux下搭建MongoDB环境
- linux的使用 --- 安装git
- 相机打开显示服务器错误,Win10相机打不开报错“0xa00f4244”怎么解决?
- 通过终端安装dmg或者pkg文件
- 用编程知识提高工作效率
- 分析:G20相争 IMF得利
- 继承父类求解矩形,圆形的面积和周长
- Mac下安装vim的插件YouCompleteMe及注意事项
- 秒懂mysql中的group by用法
热门文章
- 程显峰:应届毕业生简历的常见问题
- P1359 租用游艇 和 P2910 [USACO08OPEN]Clear And Present Danger S
- 关于Angular2.0 in-memory-web-api的GET http://localhost:3000/traceur 404 (Not Found)等错误的解决方法之一
- xxx.jar‘. Received status code 401 from server: Unauthorized
- 取余运算(mod,快速幂)
- 一老一小,家庭智能化两大方向
- 如何保持旺盛的精力 张锡纯的“元气诠” 关于静坐 修行的方法
- MTU MSS 详解
- 【bzoj1003】[ZJOI2006]物流运输 最短路+dp
- 教你把网页甚至网站制作成chm,pdf,epud