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

列举

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

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

类型 位数 范围(有符号) 范围(无符号) 说明
int8_t 8 -128 到 127 - 8 位有符号整数
uint8_t 8 - 0 到 255 8 位无符号整数
int16_t 16 -32,768 到 32,767 - 16 位有符号整数
uint16_t 16 - 0 到 65,535 16 位无符号整数
int32_t 32 -2,147,483,648 到 2,147,483,647 - 32 位有符号整数
uint32_t 32 - 0 到 4,294,967,295 32 位无符号整数
int64_t 64 -2^63 到 2^63-1 - 64 位有符号整数
uint64_t 64 - 0 到 2^64-1 64 位无符号整数

特点

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

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

2. 通用整数类型

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

类型 典型位数 范围(有符号) 范围(无符号) 说明
char 8 -128 到 127 0 到 255 字符类型,也可用于小整数
short 16 -32,768 到 32,767 0 到 65,535 短整数
int 16/32 依赖于平台 依赖于平台 整数类型
long 32/64 依赖于平台 依赖于平台 长整数
long long 64 -2^63 到 2^63-1 0 到 2^64-1 超长整数

特点

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

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

3. 浮点类型

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

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

特点

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

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


4. 布尔类型

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

类型 位数 范围 说明
bool 8 true/false 布尔类型,定义在 

特点

  • 通常用 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* 动态内存管理需要灵活处理不同类型的数据。
特殊硬件相关类型 volatileconst volatile 防止编译器优化,const 将数据存储在 Flash 中,节省 RAM。

你可能感兴趣的:(嵌入式杂谈,蓝桥杯,嵌入式硬件,stm32,c语言,keil)