union节省内存

news/2025/1/16 1:13:46/

联合体

  • 一、联合体的优点
  • 二、联合体定义
  • 三、联合体的使用
  • 四、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.ppmy.cn/news/1439752.html

相关文章

设计模式- 组合模式(Composite)结构|原理|优缺点|场景|示例

设计模式(分类) 设计模式(六大原则) 创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型(7种) 适配器…

BIM为电力、供水和道路工程无缝集成,助力智慧城市计划

在道路和公用事业工程中利用 Bentley Open 系列应用程序,项目进度加快 10%,节省成本 1,000 万印度卢比 推动基础设施现代化,实现智慧城市愿景 Dholera特别投资区位于印度艾哈迈达巴德西南 100 公里处,毗邻古吉拉特邦的贸易中心&a…

微信小程序:9.小程序配置

全局配置文件 小程序根目录下的app.json文件是小程序的全局配置文件。 常用的配置文件如下: pages 记录当前小程序所有的页面存放路径信息 window 全局设置小程序窗口外观 tabBar 设置小程序底部的tabBar效果 style 是否启用新版style 小程序窗口的组成部分 了解windo节点常…

线性代数基础3 行列式

行列式 行列式其实在机器学习中用的并不多,一个矩阵必须是方阵,才能计算它的行列式 行列式是把矩阵变成一个标量 import numpy as np A np.array([[1,3],[2,5]]) display(A) print(矩阵A的行列式是:\n,np.linalg.det(A))array([[1, 3],[2, …

Kafka 生产者应用解析

目录 1、生产者消息发送流程 1.1、发送原理 2、异步发送 API 2.1、普通异步发送 2.2、带回调函数的异步发送 3、同步发送 API 4、生产者分区 4.1、分区的优势 4.2、生产者发送消息的分区策略 示例1:将数据发往指定 partition 示例2:有 key 的…

uniapp视频播放器(h5+app)

关于uniapp视频播放器遇到的一些问题,mark下。 中途遇到了很多问题,如果有相同的伙伴遇到了类似的,欢迎交流 官方的video播放器在app上不友好,有以下功能不支持。 loadedmetadata、controlstoggle不支持 不支持外挂字幕&#xf…

python之excel加工处理小案例一则

一、工具用途 工作中,需要对各类excel进行加工处理,当表和字段比较多时,关联条件又有多个,每次通过execl的vlookup之类的关联公式手工可以解决工作需求,但一般耗时较长,且人工统计匹配也存在出错的情况。 …

vue elementui select 修改弹框多选框回显成功,但却无法选中问题

原因 下拉框数据是循环别的接口得来的&#xff0c;因为数据层次太多&#xff0c;render函数没有自动更新&#xff0c;需手动强制刷 出现问题的原因&#xff1a; 下拉框数据是通过别的接口得来的&#xff0c;render函数没有检测到&#xff0c;所以需要手动强制刷新 <el-sele…