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

Posted 新时代城市农民工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的位段操作—嵌入式学习(实习篇)相关的知识,希望对你有一定的参考价值。

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

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;
;

对应字节分布图: 

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

以上是关于C语言中的位段操作—嵌入式学习(实习篇)的主要内容,如果未能解决你的问题,请参考以下文章

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

[C/C++笔试面试题] 程序设计基础 - 位操作函数数组篇

[C语言学习]位段

C语言学习笔记精讲篇1 - 位操作符的基本概念

详解C语言中的位操作运算符可以怎么用?

梦开始的地方 —— C语言(枚举+位段+联合体)