幸运时时彩平台

关于结构体/联合体 字节对齐及位域操作出现的问题

2020-03-23来源: eefocus关键字:结构体  联合体  字节对齐  位域操作

使用的开发环境为MAPLAB X IDE  1字节对齐的实现如下


#pragma pack(1)

 

幸运时时彩平台typedef union

 

{

 

      uint8_t buf[21];

 

      struct  Message

 

      {

 

           uint8_t  repeat : 2;

 

           uint8_t  msgid : 6;

 

           ...... 

 

      }

 

}

#pragma pack()


上面的操作为对联合体的1字节对齐,解决了结构体的对齐是根据数据类型最大的变量对齐的情况节省了空间的分配,这里也做了位域的操作将8位拆分为2个变量其中一个占8位里的2bit另外一个占6bit。


位域操作的目的是为了更合理的管理变量分配的内存情况,但是使用位域时有以下几个注意点:


1.一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:


struct bs

{

    unsigned a:4

    unsigned :0

    unsigned b:4

    unsigned c:4

}


在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。


2.由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。


3.位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:


struct k

{

幸运时时彩平台    int a:1

    int :2

    int b:3

    int c:2

};


从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。

关键字:结构体  联合体  字节对齐  位域操作 编辑:什么鱼 引用地址:http://news.sonata9.com/mcu/ic492394.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:幸运时时彩平台PIC单片机学习遇到的一些问题
下一篇:【PIC32MZ】Timer定时器

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430之共用体中结构体字节对齐问题
先上代码:我所用的平台的字节对齐默认是2字节,下面////////之间的变量定义为7个字节,为了保证2字节对齐,Power变量就会自动扩展一个字节,但是变量类型又是一个字节,所以发生了字节偏移的情况。typedef union _PARARW{ struct{ UINT8 Name[24]; /////////////////////////////// UINT8 Read; UINT8 Start; UINT8 Stop; UINT8 Alarm;        UINT8 Unit;       // UINT8 Nothing
发表于 2020-03-11
MSP430之共用体中结构体字节对齐问题
ds1302驱动程序+lcd12864串行显示,使用结构体写,可读性更强
ds1302.c#include "ds1302.h"// 定义RTC初始化结构体,决定了初始化时间RTC_TIME rtc_time = {    25,     // 秒    35,     // 分    02,     // 时    25,     // 日    4,      // 月    4,   
发表于 2020-01-23
教你如何使用stm32发送一帧数据(结构体中的数据)
在这篇文章中我介绍一下如何通过串口发送一帧存在结构体中的数据。通过串口接受一帧数据请参考的我博客中的文章——教你如何使用stm32接收一帧数据!一:在.h首先定义一个结构体。typedef struct{    uint8_t H1;             uint8_t F1;               uint8_t A[7];           uint8_t AN;   
发表于 2019-10-24
单片机C语言 串口传输 结构体
串口传输 结构体  就是 把结构体 转换为 数组 ,然后传输 数组中的 char。即 struct  - - - - - - ->> char [ ] ;然后 char[ ] - - - -- - - - -->> struct .给出一下简单实例代码 :#include<stdio.h>#include<stdlib.h> /*--------------------------start file---------------------------------*/typedef struct{ int id; char name[10]; int
发表于 2019-10-16
STM32 (5) 自己写库 构建库函数雏形1 寄存器结构体定义
; 这个指针,那么他访问的就是CRL这个寄存器,而且我们可以看到这些寄存器都是有规律的分布的,地址都是以4个字节递增,这个就跟C语言当中的结构体是类似的,因此我们在  定义一个结构体,这个结构体也有7个成员,类型叫做 GPIO_Type,我们刚刚说了GPIOB_BASE  是一个32位的通过我们这个指针他只能访问4个字节的内存,那么如果说我们想基于这个地址来访问GPIO的所有寄存器的话,该怎么办呢?如果GPIOB_BASE 这个指针是下图中的GPIO_Type的结构体类型的话,它就可以访问GPIO的所有寄存器的话了,所以说如果我这个指针和外设的基地址是一样的话那我们就可以通过一个结构体的方式访问这个寄存器
发表于 2019-09-24
STM32 (5) 自己写库 构建库函数雏形1 寄存器结构体定义
LCD驱动-JZ2440
怎样写LCD驱动程序1、分配一个fb_info结构体,使用framebuffer_alloc()函数2、设置fb_info中的参数,1)固定参数(fix)2)可变参数(var)3)设置操作函数 fbops4)其他设置 如调色板pseudo_palette和屏幕尺寸screen_size5)分配显存 dma_alloc_writecombine(),返回的是虚拟地址3、注册fb_info 使用register_framebuffer4、硬件相关操作,LCD寄存器等测试方法:虚拟机:1、make menuconfig去掉原来的驱动程序->Device Drivers->Graphics support<M>
发表于 2019-09-16
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 幸运时时彩平台京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 sonata9.com, Inc. All rights reserved
500万彩票 亿信彩票娱乐 大资本网址 幸运时时彩官网 幸运时时彩 亿信彩票网站 五分时时彩 幸运时时彩官网 幸运时时彩 亿信彩票注册