嵌入式杂谈——(问题解决三:嵌入式中的数据类型)

列举

1. 标准固定宽度整数类型

这些类型定义在 <stdint.h> 头文件中,用于明确指定数据的位数,适合嵌入式系统中需要精确控制数据大小的场景。

类型位数范围(有符号)范围(无符号)说明
int8_t8-128 到 127-8 位有符号整数
uint8_t8-0 到 2558 位无符号整数
int16_t16-32,768 到 32,767-16 位有符号整数
uint16_t16-0 到 65,53516 位无符号整数
int32_t32-2,147,483,648 到 2,147,483,647-32 位有符号整数
uint32_t32-0 到 4,294,967,29532 位无符号整数
int64_t64-2^63 到 2^63-1-64 位有符号整数
uint64_t64-0 到 2^64-164 位无符号整数

特点

  • 明确指定数据宽度,避免平台差异。

  • 适合与硬件寄存器、协议数据包等交互。

2. 通用整数类型

这些是 C 语言中的标准数据类型,但其大小可能因平台而异,因此在嵌入式系统中使用时需要谨慎。

类型典型位数范围(有符号)范围(无符号)说明
char8-128 到 1270 到 255字符类型,也可用于小整数
short16-32,768 到 32,7670 到 65,535短整数
int16/32依赖于平台依赖于平台整数类型
long32/64依赖于平台依赖于平台长整数
long long64-2^63 到 2^63-10 到 2^64-1超长整数

特点

  • 大小依赖于编译器和平台,可移植性较差。

  • 在嵌入式系统中,建议优先使用 <stdint.h> 中的固定宽度类型。

3. 浮点类型

嵌入式系统中浮点运算通常较慢,且某些低端微控制器可能不支持硬件浮点单元(FPU),因此浮点类型的使用需要谨慎。

类型位数范围说明
float32约 ±3.4e-38 到 ±3.4e38单精度浮点数
double64约 ±1.7e-308 到 ±1.7e308双精度浮点数

特点

  • 浮点运算可能占用较多资源。

  • 如果微控制器没有 FPU,浮点运算会通过软件模拟,效率较低。


4. 布尔类型

用于表示逻辑值(真或假)。

类型位数范围说明
bool8true/false布尔类型,定义在 <stdbool.h>

特点

  • 通常用 8 位存储,但实际只使用 1 位。

  • 在嵌入式系统中,可以用 uint8_t 或位域替代以节省空间。


5. 指针类型

指针用于直接访问内存地址,在嵌入式系统中常用于操作硬件寄存器或动态内存管理。

类型说明
void*通用指针类型
uint8_t*指向 8 位无符号整数的指针
uint32_t*指向 32 位无符号整数的指针

特点

  • 指针的大小依赖于架构(例如 8 位、16 位、32 位或 64 位微控制器)。


6. 位域(Bit-field)

用于节省内存,将多个布尔值或小范围整数打包到一个字节中。

c

复制

struct {
    uint8_t flag1 : 1;  // 1 位
    uint8_t flag2 : 1;  // 1 位
    uint8_t value : 6;  // 6 位
} status;

特点

  • 适合存储多个标志位或小范围整数。

  • 节省内存,但访问效率可能较低。


 7. 枚举类型

用于定义一组命名的常量值。

c

复制

typedef enum {
    STATE_IDLE,
    STATE_RUNNING,
    STATE_ERROR
} SystemState;

特点

  • 提高代码可读性。

  • 实际存储为整数类型(通常是 int)。

  •    8.特殊硬件相关类型

  • 嵌入式系统中,某些硬件寄存器可能需要特定的数据类型,例如:

  • volatile 类型:用于修饰可能被硬件改变的变量,防止编译器优化。

    volatile uint32_t* reg = (uint32_t*)0x40000000;
  • const 类型:用于修饰只读数据,通常存储在 Flash 中。

    const uint8_t table[] = {0x01, 0x02, 0x03};

如何使用

场景推荐数据类型原因
硬件寄存器操作uint8_tuint16_tuint32_t寄存器宽度固定,使用固定宽度类型确保数据匹配。volatile 防止编译器优化。
存储小范围整数或标志位uint8_tint8_t、位域(Bit-field)节省内存,适合小范围数据或多个布尔值打包。
计数器或循环变量uint8_tuint16_tuint32_t根据计数范围选择合适类型,避免溢出。
浮点运算float、定点数(Fixed-point)浮点运算较慢,定点数适合没有硬件浮点单元(FPU)的系统。
布尔值和标志位booluint8_t、位域(Bit-field)bool 可读性高,位域节省内存。
协议数据包或通信数据uint8_tuint16_tuint32_t协议字段通常有固定宽度,使用固定宽度类型确保数据对齐和解析正确。
时间和延时uint32_tuint16_t时间值通常较大,uint32_t 覆盖较大范围。
枚举类型enum提高代码可读性,实际存储为整数类型。
动态内存管理void*uint8_t*动态内存管理需要灵活处理不同类型的数据。
特殊硬件相关类型volatileconstvolatile 防止编译器优化,const 将数据存储在 Flash 中,节省 RAM。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值