union节省内存

一、联合体的优点

由于联合体里的变量共同占有一个空间,可以利用联合体达到节省内存空间的目的。
需要注意:同时只有一个成员可以得到这块内存的使用权(对该内存的读写),各变量共用一个内存首地址。
结构体和联合体的区别参考博客: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_= 1
	fields_= [
	('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 

相关推荐

  1. union节省

    2024-04-24 07:00:04       11 阅读
  2. php 使用yield生成器节省

    2024-04-24 07:00:04       16 阅读
  3. C语言的联合体:一种节省的数据结构

    2024-04-24 07:00:04       25 阅读
  4. C++动态

    2024-04-24 07:00:04       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-24 07:00:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-24 07:00:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-24 07:00:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-24 07:00:04       18 阅读

热门阅读

  1. c# ?? 、?.、??=、?[]运算符的使用

    2024-04-24 07:00:04       15 阅读
  2. 【贪心算法】Leetcode 763. 划分字母区间【中等】

    2024-04-24 07:00:04       14 阅读
  3. stl_list

    stl_list

    2024-04-24 07:00:04      11 阅读
  4. uniapp同步开发h5+小程序双平台踩坑记录

    2024-04-24 07:00:04       10 阅读
  5. 景区ar导览实景导航小程序系统开发源码搭建

    2024-04-24 07:00:04       14 阅读
  6. 深入了解 npm

    2024-04-24 07:00:04       14 阅读
  7. windows驱动开发-I/O请求(三)

    2024-04-24 07:00:04       14 阅读
  8. 计算机网络 2.3数据交换技术

    2024-04-24 07:00:04       11 阅读
  9. SpringCloudAlibaba之Sentinel简单使用

    2024-04-24 07:00:04       11 阅读