C语言中的位段操作—嵌入式学习(实习篇)
Posted 新时代城市农民工
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中的位段操作—嵌入式学习(实习篇)相关的知识,希望对你有一定的参考价值。
记录实习期间学到的新的知识。
malloc申请内存:当申请小内存的时,malloc使用sbrk分配内存;当申请大内存时,使用mmap函数申请内存;但是这只是分配了虚拟内存,还没有映射到物理内存,当访问申请的内存时,才会因为缺页异常,内核分配物理内存。
- 若分配内存小于 128k ,调用 sbrk() ,将堆顶指针向高地址移动,获得新的虚存空间。
- 若分配内存大于 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语言中的位段操作—嵌入式学习(实习篇)的主要内容,如果未能解决你的问题,请参考以下文章