位域操作
typedef struct
{
uint32_t one:1
uint32_t two:2
uint32_t eight:8
uint32_t :15
uint32_t twenty_five:10;
}myarea;
位域操作,字面上可以看出就是进行位操作,也就是对几个字节中的bit进行赋值,这个主要作用就是可以更好利用存储空间,方便位操作
有一点要注意就上面我们定义的是32位的,所以后面的最大位操作最大也不能超过32
下面就分析一下上面的例子
one占1个bit
two占紧跟后2个bit
eight占8个
接下来无位名,代表填充15个bit不使用
赋值操作,例如想操作第一个bit
就这么写 myarea.one=1/0
C语言共同体
typedef union
{
uint8_t: name;
uint16_t: age;
uint32_t:class;
}myunion;
共同体就是类型变量共用一段存储空间,空间大小以里面变量最大的存储空间为准
上面这个例子中就是class那个变量,所以该共同体占用的大小就为4个字节,特别需要注意就是共同体中变量同时只有一个可以有效。也就是你要操作,也只能一个变量的操作。
下面将共同体和上面的位域操作结合起来看一个例子
typedef struct
{
union PA
{
uint32_t:all;
struct all_b
{
uint32_t one:1
uint32_t two:2
uint32_t eight:8
uint32_t :15
uint32_t twenty_five:10;
};
}
union PB
{
uint32_t:all;
struct
{
uint32_t one:1
uint32_t two:2
uint32_t eight:8
uint32_t :15
uint32_t twenty_five:10;
};
}newarea;
这个例子讲之前先说下这个例子来由,我们知道单片机,比方说那32位单片机来说好了,它的寄存器大多是32位的,有时候我们需要配置相应的位进行操作(位域操作),有时候我们又为了方便干脆对整个寄存器赋值,为了这两个赋值区分开来,也就是不要同时赋值,又为了共享存储空间(union),这时我们就把union和位域操作结合在了一起。
下面落实到我们应用上来,比如我得给单片机那个one位赋值:
#define PA0_BaseAddr 0x40000000
#define GPIO(*newarea)PA0_BaseAddr
操作PA端口寄存器某一位
GPIO->PA.all_b->one=0/1
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· 从零开始开发一个 MCP Server!
· Ai满嘴顺口溜,想考研?浪费我几个小时
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密