本帖最后由 DKENNY 于 2025-6-29 11:48 编辑
#申请原创# #技术资源# @21小跑堂
前言
在嵌入式开发中,特别是在翻芯片 SDK 的时候,经常会遇到 `union` 关键字嵌在结构体里,配合位域(bit-field)使用,SDK的库函数中基本上全是这玩意儿,新手可能会比较头疼。比如下面这段代码,是我从apm32f407xx.h中copy过来的,其中定义了一个 CRC 模块的寄存器映射:
- typedef struct {
- /** [url=home.php?mod=space&uid=247401]@brief[/url] DATA register */
- union {
- __IOM uint32_t DATA;
- struct {
- __IOM uint32_t DATA : 32;
- } DATA_B;
- };
- /** [url=home.php?mod=space&uid=247401]@brief[/url] independent DATA register */
- union {
- __IOM uint32_t INDATA;
- struct {
- __IOM uint32_t INDATA : 8;
- __IM uint32_t RESERVED : 24;
- } INDATA_B;
- };
- /** @brief Control register */
- union {
- __OM uint32_t CTRL;
- struct {
- __OM uint32_t RST : 1;
- __IM uint32_t RESERVED : 31;
- } CTRL_B;
- };
- } CRC_T;
代码里,`union` 和位域可能会让人出现几个疑问:`union` 到底是啥?为啥 SDK 这么设计?本文会从基础讲起,层层深入,解答这些疑问,确保搞懂 `union` 的用法和底层逻辑。
一、`union` 是什么?跟 `struct` 有什么区别?
1. `union` 的定义
`union`(联合体)是 C 语言的一种数据结构,允许在同一块内存存储不同类型的变量。注意,是同一块内存!这跟 `struct`(结构体)完全不同。
- 结构体(`struct`):每个成员有自己的内存空间,内存依次排列。比如:
|