结构体与共同体(联合体)的妙用

2023-05-16

结构体与共同体(联合体)的妙用

 

 

学习过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的赋值。

理解了这个方法后,再来看样例对寄存器的操作是不是就很轻松了?掌握这个方法以后,你也可以设计一个带全局或者位操作的结构体来完成自己的程序数据的应用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

结构体与共同体(联合体)的妙用 的相关文章

随机推荐

  • Linux下C语言来检测USB设备以及自动区分U盘和硬盘并自动挂载

    别的不说直接上代码 作用就是在linux系统上可以直接判断哪个是USB设备节点 xff0c 哪个是硬盘设备节点 xff0c 如果想挂载某一个节点 想屏蔽某一个USB孔的USB设备 xff0c 具体代码 xff0c 正在整理中 xff0c 下
  • glib 交叉编译步骤

    借鉴文章网址为 wiki beyondlogic org index php title 61 Cross Compiling BlueZ Bluetooth tools for ARM 编译glib需要zlib libffi两个库文件我使
  • STM32中SysTick、FCLK、SYSCLK、HCLK

    http rmingwang com the stm32 systick fclk sysclk hclk html 转载原文 在STM32中 xff0c 有五个时钟源 xff0c 为HSI HSE LSI LSE PLL HSI是高速内部
  • qglobal.h:45: error: C1083: 无法打开包括文件:

    看了很多人的错误调试记录就是不行 xff0c 后来在百度知道里面看到这个 xff0c 添加进入后就可以了 在系统环境变量path 添加下面内容即可 SystemRoot system32
  • 卡尔曼滤波器学习笔记(二)

    扩展卡尔曼滤波器的原理及应用 经典的卡尔曼滤波只适用于线性且满足高斯分布的系统 xff0c 但实际工程中并不是这么简单 xff0c 比如飞行器在水平运动时有可能伴随着自身的自旋 xff0c 此时的系统并不是线性的 xff0c 这时就需要应用
  • 串口回环测试

    串口lookback测试 基础知识 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff09 xff0c 通常称作UART UART 是一种通用的数据通信协议 xff
  • STM32学习--USART

    串口工作方式 1 查询 xff1a 串口程序不断循环查询 xff0c 看看有没有数据需要它发送 2 中断 xff1a 平时串口只要打开中断即可 如果有中断来即需要传输数据 xff0c 它就马上进行数据的传输 STM32编程 xff1a 1
  • Atitit HTTP 认证机制基本验证 (Basic Authentication) 和摘要验证 (Digest Authentication)attilax总结Atitit HT

    Atitit HTTP 认证机制 基本验证 Basic Authentication 和摘要验证 Digest Authentication attilax总结 1 1 最广泛使用的是基本验证 Basic Authentication 和摘
  • 实验二 读取和理解激光雷达数据

    1 体验内容 xff08 1 xff09 为rplidar添加USB权限 注 xff1a 实验室的rplidar A2买得比较早 xff0c 硬件版本可能与github程序不匹配 xff0c 出现运行错误 xff0c 解决方法为到 Wind
  • Linux下使用Netfilter框架编写内核模块(统计协议层ping特定地址丢包数)

    一 linux内核中neitfilter的处理过程 1 5个HOOK点的执行点说明 xff1a 数据包从进入系统 xff0c 进行IP校验以后 xff0c 首先经过第一个HOOK函数NF IP PRE ROUTING进行处理 xff1b 然
  • 基于TCP 实现客户端之间通信【1】

    前段时间学习了基于TCP协议下实现服务器与一个客户端的通信 xff0c 服务器与多个客户端之间的通信 xff0c 以及客户端之间的互相通信 下面就是我写的利用TCP和多线程技术实现客户端之间互相通信的代码 xff1a 服务器端 xff1a
  • 回环接口(loop-back/loopback)

    回环接口 xff08 loop back loopback xff09 Moakap 整理 Loopback 接口是一个虚拟网络接口 xff0c 在不同的领域 xff0c 其含义也大不一样 1 xff0e TCP IP 协议栈中的 loop
  • socket封装HTTP请求

    之前写过两个socket封装的HTTP GET请求 xff0c 可是知其然 xff0c 不知所以然 这次写POST请求就有点懵逼了 还是从大佬的文章出发 xff1a https blog csdn net a19881029 article
  • access中,如何删除不可见空格

    1 可以使用 Trim 函数 xff0c 删除字符串 首 尾 的正常空格 span class token keyword update span 表名 span class token keyword set span 字段 span c
  • Raspberry Pi树莓派分类和其相似产品介绍

    文章目录 前言一 1代树莓派二 2代树莓派三 3代树莓派四 4代树莓派五 树莓派Pico六 目前可替代板子介绍引用 前言 树莓派官网 作为小型计算机的代表 xff0c 树莓派可是作为开山鼻祖 xff0c 本文聊一下目前树莓派几代板子发展历程
  • ARM汇编指令ldr和MOV的区别

    1 八位图 数据 2 MOV指令 MOV指令可以把立即数或者寄存器内容 xff08 注意 xff1a 这里绝对不可以是内存 xff01 xff01 xff09 传递给一个寄存器 MOV对于立即数是有要求的 xff0c 就是上边的 8位图 数
  • GPS NEMA 0183协议

    一 NMEA0183标准语句 GPS常用语句 GPGGA 例 xff1a GPGGA 092204 999 4250 5589 S 14718 5084 E 1 04 24 4 19 7 M 0000 1F 字段0 xff1a GPGGA
  • 使用setvbuf更改printf的默认buffer 行为

    有3种buffer行为 xff0c 不缓冲 xff0c 基于块的缓冲 和 基于行的缓冲 stdout xff08 printf xff09 默认是基于行的缓冲 xff0c 即写到stdout的字符都会被缓冲起来直到一个换行符输出的时候 xf
  • linux 下 tcpdump详解 后篇(自己实现抓包过滤)

    一 概述 在了解了tcpdump的原理后 xff0c 你有没有想过自己去实现抓包过滤 xff1f 可能你脑子里有个大概的思路 xff0c 但是知道了理论知识 xff0c 其实并不能代表你完全的理解 只要运用后 xff0c 你才知道哪些点需要
  • 结构体与共同体(联合体)的妙用

    结构体与共同体 xff08 联合体 xff09 的妙用 学习过C语言后 xff0c 大家都了解了结构体与共同体 两者之间的区别是 xff1a 共同体 xff1a 使几个不同类型的变量共占一段内存 相互覆盖 所占内存长度是各最长的成员占的内存