C语言中的位段操作—嵌入式学习(实习篇)

12 篇文章 10 订阅

记录实习期间学到的新的知识。

malloc申请内存:当申请小内存的时,malloc使用sbrk分配内存;当申请大内存时,使用mmap函数申请内存;但是这只是分配了虚拟内存,还没有映射到物理内存,当访问申请的内存时,才会因为缺页异常,内核分配物理内存

  1. 若分配内存小于 128k ,调用 sbrk() ,将堆顶指针向高地址移动,获得新的虚存空间。
  2. 若分配内存大于 128k ,调用 mmap() ,在文件映射区域中分配匿名虚存空间。

一、位段的用法

在嵌入式的学习中经常会遇到选择数据类型的苦恼,比如要节省内存、定义网络传输的数据帧格式。使用位段操作可以更加简洁方便的解决上面两个问题,这里记录一下我的学习笔记。

位段操作和字节对齐都可以节省内存,比如一个数据可以利用6位就满足了,但是现有的数据类型只有short数据类型,这样就会浪费掉两个位的存储。

定义三个判断类型的数据,一个可以表示大小在20以内数据和一个可以表示大小在400以内的数据。

三个判断数据:f1、f2、f3,利用一位就可以存储。

表示15以内的数:A1,利用四位就可以表示。

表示一个400以内的数:B1,需要9位可以表示。

利用结构体来表示位段操作具体操作如下:

struct packed_struct
{
    unsigned int f1 :1;
    unsigned int f2 :1;
    unsigned int f3 :1;
    unsigned int A1 :4;
    unsigned int B1 :9;
};

这样的话我们仅使用了两个字节大小就存储了上面五种数据。

使用时利用上述结构体创建一个数据:packed_struct  packed_data; 给成员赋值则直接packed_data.A1=7;即使赋值的大小超出范围,只会取到他的低四位。

二、特殊情况

struct bits
{
    unsigned int f1:1;
    int     word;
    unsigned int f2:1;
};

对应的图就是 :

可以看到和字节对齐的问题一样,结构体的成员顺序不同,占用的内存大小也不同,好的顺序也可以节省内存。 

当然也可以跳过几个位,使用无名位段直接跳过中间几位。

struct x
{
    unsigned int type :4;
    unsigned int :3;
    unsigned int count :9;
};

对应字节分布图: 

可以看到中间位段被忽略。 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西邮小菜机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值