关于单片机的无符号整型uint32_x
//32、16、8 位无符号整形
typedef uint32_t u32; //1 字节(Byte)= 8 位(bit),因此 32 位换算为字节是:32 ÷ 8 = 4 字节typedef uint16_t u16;
//1 字节(Byte)= 8 位(bit),因此 16 位换算为字节是:16 ÷ 8 = 2 字节typedef uint8_t u8;
//由于 1 字节(Byte)= 8 位(bit),因此 8 位换算为字节是:8 ÷ 8 = 1 字节
关于OTA变量申明:
typedef struct{u32 OTA_flag; //标志位u32 FirmwareLen[11]; //固件的长度u8 OTA_Version[32]; //版本号
}OTA_InfoCB;
1. OTA_flag
用 u32
(32 位)的原因
OTA_flag
是 “标志位变量”,通常用于存储多个状态标记(通过位运算实现)。
例如:
- 第 0 位:标记 “是否正在升级”(0 = 否,1 = 是)
- 第 1 位:标记 “升级是否成功”(0 = 失败,1 = 成功)
- 第 2 位:标记 “是否需要重启”(0 = 不需要,1 = 需要)
32 位的 u32
可以提供32 个独立的标志位,足以容纳 OTA 过程中所有可能的状态(如升级阶段、错误类型、校验结果等)。如果用 8 位的 u8
,最多只能表示 8 个状态,可能不够用。
2. FirmwareLen[11]
用 u32
(32 位)的原因
FirmwareLen
用于存储固件的长度(字节数)。
嵌入式设备的固件大小通常较大(例如:几 KB 到几 MB 甚至更大):
- 8 位的
u8
最大只能表示 255 字节(显然不够,连小固件都存不下); - 16 位的
u16
最大只能表示 65535 字节(约 64KB),对于稍大的固件(如 100KB 以上)也不够; - 32 位的
u32
最大可表示 4294967295 字节(约 4GB),足以覆盖绝大多数嵌入式设备的固件大小需求。
因此用 u32
是为了满足固件长度的数值范围。
3. OTA_Version[32]
用 u8
(8 位)的原因
OTA_Version
用于存储版本号字符串(如 "V1.2.3_build2023"
),而字符串在计算机中本质是字节序列:
- 每个字符(字母、数字、符号)的 ASCII 码范围是 0-255,刚好可以用 1 个 8 位的
u8
存储; - 32 个
u8
组成的数组,最多可存储 31 个字符(加 1 个字符串结束符\0
),足以容纳常见的版本号格式。
如果用 u32
存储字符串,会导致4 倍的内存浪费(1 个字符用 4 字节存储),完全没有必要。