union节省内存

联合体

  • 一、联合体的优点
  • 二、联合体定义
  • 三、联合体的使用
  • 四、python 联合体的使用

一、联合体的优点

由于联合体里的变量共同占有一个空间,可以利用联合体达到节省内存空间的目的。
需要注意:同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。
结构体和联合体的区别参考博客:https://blog.csdn.net/sjtudou/article/details/81074916

二、联合体定义

比如当前有一个记录TMR历史事件信息的结构体 ,包括产生中断时的计数器的时刻tmrtime、计数器的值TMRCNT、 各个中断标志状况。

typedef struct {Time_TypeDef tmrtime;uintl6_t tmrcnt;uintl6_t tmrcap;uint8_t acif; uint8_t cmpif;uint8_t capif; uint8_t prdif;
}TMR_SINGLE_EVENT_T:

其中用于记录时间tmrtime的结构Time_TypeDef 有两种方式:
一种使用秒、毫秒、微秒的Sys_Time_Data_t 结构体形式,另一种直接使用 uint64_t 的大数统计tick值。
tick值具体含义为表示滴答定时器走的tick值的个数。
使用tick值是因为单片机开启了滴答定时器,使用滴答定时器记录时间,滴答定时器每走一次为1个tick,每个tick的时间取决于系统时钟的频率。
每次进入滴答定时器中断时间不能过小,不然频繁进入该中断函数,程序无法正常执行了。

typedef union{Sys_Time_Data_t  ustime;uint64_t ticktime;
}Time_TypeDef;typedef struct{uint16_t us;uint16_t ms;uint32_t s;
}Sys_Time_Data_t;

这两中结构都是时间的两种统计形式,并且同时只会使用一种时间的统计方式,不会相互干扰。可以写在联合体里。
如果时间这里不使用联合体,直接写两个时间结构体,会多占用uint64_t 8个字节空间。这还只是单个TMR历史事件结构体多的空间,如果历史事件结构体数组,会多占用8字节 * 数组长度空间!对于单片机而言占的就过大了。

三、联合体的使用

根据具体情况选择选择时间统计方式

TMR_SINGLE_EVENT_T event;
if(1){event.tmrtime.ustime = sys_time_data;   //sys_time_data 为随时间增加而增加的变量
}else{event.tmrtime.ticktime = TickVal* 0xFFFFFFFF + SysTick->Val // TickVal 为进入滴答定时器中断的次数,SysTick->Val 为滴答定时器该时刻的tick值
}

四、python 联合体的使用

python中使用需要包含ctypes库,联合体的定义和使用如下:

import ctypes
## 联合体定义
class Time_TypeDef(ctypes.Union):_fields_= [('ustine', SysTimeData),('ticktine', c_uint64),
]
class HT_TIMER_SINGLE EVENT_TypeDef(LittleEndianStructure):_раck_= 1fields_= [('tmrtime', Time_TypeDef),('tarcnt', c_uint16),('tnrcaр', c_uint16),('acif', c_uint8),('cmpif', c_uint8),('capif', c_uint8),('prdif', c_uint8)]
## 联合体使用
event =  HT_TIMER_SINGLE EVENT_TypeDef()
if True:event.tmrtime.ustime = sys_time_data
else:event.tmrtime.ticktime = TickVal* 0xFFFFFFFF + SysTick->Val 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/2473.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SVN小乌龟汉化问题

1.首先确认中文语言包和SVN版本需要一致(点击右键 选择最后一个选项即可查看) 官网链接 点击这个官网链接可以下载对应版本的中文包 2.下载好之后直接无脑下一步安装即可 3.如果还是没有中文,找到这个文件夹,把里面的内容全部删…

图解《图搜索算法》及代码实现

关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导; 有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自…

GPT与GAN结合生成图像——VQGAN原理解析

1、前言 这篇文章,我们讲VQ_GAN,这是一个将特征向量离散化的模型,其效果相当不错,搭配Transformer(GPT)或者CLIP使用,达到的效果在当时可谓是令人拍案叫绝! 原论文:Tam…

政安晨:【Keras机器学习示例演绎】(十二)—— 用利用 MIRNet 增强弱光图像效果

目录 简介 下载 LOL 数据集 创建 TensorFlow 数据集 MIRNet 模型 选择性核特征融合

【视频异常检测】Open-Vocabulary Video Anomaly Detection 论文阅读

Open-Vocabulary Video Anomaly Detection 论文阅读 AbstractMethod3.1. Overall Framework3.2. Temporal Adapter Module3.3. Semantic Knowledge Injection Module3.4. Novel Anomaly Synthesis Module3.5. Objective Functions3.5.1 Training stage without pseudo anomaly …

Eureka详解

Eureka详解 一、Eureka概述 1. 什么是Eureka Eureka 是 Netflix 开发的一款基于 REST 的服务注册与发现组件,广泛应用于基于 Spring Cloud 构建的微服务架构中。作为服务治理的核心组件之一,Eureka 负责维护服务注册表,使得各个分布式服务…

网盘——查看文件

本文主要讲解文件操作过程中,查看文件如何实现,实现步骤如下: 1、实现步骤: A、首先客户端发送查看请求(包含目录信息) B、服务器将文件名字还有文件的类型发送给客户端(只发送文件的名字&am…

Apace配置+http重定向到https

一、配置APache 打开apache安装目录下的 ssl.conf 配置以下内容 <VirtualHost *:443># General setup for the virtual host, inherited from global configuration #DocumentRoot "/var/www/html" ServerName www.pwx.com # 古籍检索系统 &#xff0c;重定向…

Linux2.6内核进程调度队列

目录 运行队列runqueue 活跃队列&过期队列 queue[140]&优先级&队列数组下标 bitmap[5]&O(1)调度算法 nr_active active指针和expired指针 O(1)调度算法之调度过程 本篇是Linux进程概念篇的最后一篇&#xff0c;Linux2.6内核是一个具体的/可行的/实际的存…

前端技巧——webgl快速上手

WebGL(Web Graphics Library)是一种在不需要使用插件的情况下在网页浏览器中使用的3D图形API。它是一种低级的、基于OpenGL ES的API,可以直接在网页浏览器的JavaScript中使用,用于创建和操作复杂的3D图形。 一、WebGL 的关键特点 无需插件:WebGL 完全内置于现代浏览器中…

【Node.js】03 —— HTTP 模块探索

&#x1f31f;Node.js之HTTP模块探索✨ &#x1f31f;引言 在网络编程中&#xff0c;HTTP协议无处不在。在Node.js的世界里&#xff0c;我们可以通过内置的http模块来轻松创建HTTP服务器和客户端&#xff0c;实现数据的接收和发送。今天就让我们一起打开这扇门&#xff0c;探索…

CentOS 7 常用命令大全

1.基础知识 1.1Linux系统文件结构 /bin 二进制文件,系统常规命令 /boot 系统启动分区,系统启动时读取的文件 /dev 设备文件 /etc 大多数配置文件 /home 普通用户的家目录 /lib 32位函数库 /lib64 64位库 /media 手动临时挂…

Fisher判别示例:鸢尾花(iris)数据(R)

先读取iris数据&#xff0c;再用程序包MASS&#xff08;记得要在使用MASS前下载好该程序包&#xff09;中的线性函数lda()作判别分析&#xff1a; data(iris) #读入数据 iris #展示数据 attach(iris) #用变量名绑定对应数据 library(MASS) #加载MASS程序包 ldlda(Species~…

Python打怪升级(4)

在计算机领域常常有说"合法"和"非法"指的是:是否合理&#xff0c;是否有效&#xff0c;并不是指触犯了法律。 random.randint(begin,end) 详细讲解一下这个random是指模板&#xff0c;也就是别人写好的代码直接来用&#xff0c;在Python当中&#xff0c;…

C语言入门课程学习笔记1

C语言入门课程学习笔记1 第1课 - 概论第2课 -helloworld第3课 -数据输出第4课 -数据类型与变量第5课 - 深入数据类型与变量第6课 - 类型与变量编程练习第7课 - 程序中的数据输入 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;图片全部来源于课程PPT&#xff…

【贪心算法】Leetcode 763. 划分字母区间【中等】

划分字母区间 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列…

食用油5G智能工厂数字孪生可视化平台,推进食品制造业数字化转型

食用油5G智能工厂数字孪生可视化平台&#xff0c;推进食品制造业数字化转型。在食用油产业中&#xff0c;数字化转型已成为提升生产效率、优化供应链管理、确保产品质量和满足消费者需求的关键。食用油5G智能工厂数字孪生可视化平台作为这一转型的重要工具&#xff0c;正在推动…

《html自用使用指南》--基于w3School实践

1.基础标签 文本输入时&#xff0c;在编辑器中的换行&#xff0c;多个空格&#xff0c;都被编辑器看作一个空格 <p> 这个段落 在源代码 中 包含 许多行 但是 浏览器 忽略了 它们。 </p>结果&#xff1a;这个段落 在源代码 中 包含 许多行 但是 浏览器…

STM32H750时钟频率和功耗以及RTC功能测试

STM32H750时钟频率和功耗和RTC功能测试 &#x1f4cc;相关篇《STM32H750片外QSPI启动配置简要》 ✨在使用STM32CubeMX修改STM32H750时钟树参数时&#xff0c;如果使用软件自动求解&#xff0c;这是一个非常耗时的操作&#xff0c;有时候还不一定成功&#xff0c;还是推荐使用手…

《ElementPlus 与 ElementUI 差异集合》el-select 差异点,如:高、宽、body插入等

宽度 Element UI 父元素不限制宽度时&#xff0c;默认有个宽度 207px&#xff1b; 父元素有固定宽度时&#xff0c;以父元素宽度为准&#xff1b; Element Plus 父元素不限制宽度时&#xff0c;默认100%&#xff1b; 父元素有固定宽度时&#xff0c;以父元素宽度为准&#x…