当前位置: 首页 > article >正文

union的实际使用

记录一下,免得忘记:

1、定义一个共用体变量

这里定义一个64位变量 i2creg_rev,然后通过共用体定义两个位变量bits和bits_reverse,通过bit可以访问指定位的值大小,不需要自己再左移右移转换。

bits_reverse是bits的对端转换,是用来处理大小端定义位的,免得取位值时,取反顺序了

typedef union
{
	unsigned long long int i2creg_rev;             /**< the whole byte */
	struct
	{
		u64 sec : 6;			/**< binary sec :7bit */
		u64 min : 6;			/**< binary min */
		u64 hour : 5;			/**< binary hour */
		u64 tod_daysL : 9;      /**< binary day */
		u64 year : 7;
		u64 tod_secs : 17;		/**< binary day-secs */
        u64 rev  :14;
	} bits;
    struct
	{
		        u64 rev  :14;
        
		u64 tod_secs : 17;		/**< binary day-secs */
		u64 year : 7;
		u64 tod_daysL : 9;      /**< binary day */
		u64 hour : 5;			/**< binary hour */
		u64 min : 6;			/**< binary min */
        u64 sec : 6;			/**< binary sec :7bit */

	} bits_reverse;
} irigb_i2creg_rev;

2、使用

先定义一个union变量,然后用i2c去读的值,赋值给rev_time,之后利用union特性,直接可以提取时分秒,年月日了


void test_union(void)
{
    irigb_i2creg_rev rev_time;
    unsigned char tdata[20] = { 0 };
    interface_phasei2c_read_nbytes(0x90, 0xC8, tdata, 8);
    Str_Printf("r 0xC8=0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x,0x%02x \t",
        tdata[7],tdata[6],tdata[5],tdata[4],tdata[3],tdata[2],tdata[1],tdata[0]);
    
    rev_time.i2creg_rev = ((unsigned long long int)tdata[0]<<56 |  (unsigned long long int)tdata[1]<<48 | (unsigned long long int)tdata[2]<<40 |(unsigned long long int)tdata[3]<<32 |
                            (unsigned long long int)tdata[4]<<24 |(unsigned long long int)tdata[5]<<16 |(unsigned long long int)tdata[6]<<8 |(unsigned long long int)tdata[7] 
                            );

    Str_Printf("%d:%d:%d,%d,%d,@%d\r\n",rev_time.bits.hour, rev_time.bits.min, rev_time.bits.sec,
                rev_time.bits.tod_daysL, rev_time.bits.year+2000, rev_time.bits.tod_secs);
    
//        Str_Printf("%d:%d:%d,%d,%d,@%d\r\n",rev_time.bits_reverse.hour, rev_time.bits_reverse.min, rev_time.bits_reverse.sec,
//                rev_time.bits_reverse.tod_daysL, rev_time.bits_reverse.year+2000, rev_time.bits_reverse.tod_secs);
    
}


http://www.kler.cn/a/458942.html

相关文章:

  • Acwing 多重背包板子
  • 【prometheus】【blackbox_exporter】grafna导入blackbox_exporter看板配置
  • centos7 免安装mysql5.7及配置(支持多个mysql)
  • 使用pandas把数据库中的数据转成csv文件
  • excel操作
  • Django Settings 优化与常用配置指南
  • html+css网页设计 美食 美食4个页面
  • HTML——13.超链接
  • 纯血鸿蒙ArkUI选项卡布局详解
  • 【Spring Boot 实现 PDF 导出】
  • win10、win11-鼠标右键还原、暂停更新
  • Docker运行hello-world镜像失败或超时:Unable to find image ‘hello-world:latest‘ locally Trying to pull reposi
  • Hbase的特点、特性
  • 【Vue】深入理解v-model指令-父子组件数据绑定
  • AI生成视频字幕--VideoCaptioner/卡卡字幕助手
  • 【Java】深入了解 Java 中的 split() 方法
  • 什么是Spring Boot 应用开发?
  • VuePress搭建个人博客
  • 根据 business_group的值在 Django 管理员界面中显示不同字段
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之7 附件(文档)
  • 项目基本配置
  • Xshell日志录制
  • Java:190 基于SSM的药品管理系统
  • 计算机毕设-基于springboot的食品厂管理系统的设计与实现(附源码+lw+ppt+开题报告)
  • 计算机视觉目标检测-2
  • 有压缩格式的Bitmap(BMP)图像显示调色板数据和图像数据