关键字 const 在嵌入式中的用法

const 表示变量的值不可被修改。这对防止意外写操作、明确意图和让编译器更好地优化有重要作用。在大多数嵌入式编译器(如 Keil、GCC)中,加了 const 的数据可以被放入只读区域(ROM/Flash),节省宝贵的 RAM。

const int a = 5;
a = 10; // ❌ 错误:尝试修改 const 值

嵌入式中使用 const 的典型场景

1. 定义只读配置参数

//系统主频、设备ID、初始化常量等的值固定、不应被改动。
const uint32_t system_clock = 16000000;

2. 修饰函数参数,避免误操作

修饰传入变量,防止修改
void print_config(const char* str) {
    printf("%s\n", str); //str 指向的内容不能被修改,防止误写。
}

void modify(char* str) { str[0] = 'x'; }    // 可以修改内容
void modify(const char* str) { str[0] = 'x'; }  // ❌ 编译错误

3. 修饰数组(查表)常量

查表法(LUT)是嵌入式中常用优化手段:

//放在 Flash 中,不占用 RAM,并避免被修改。
const uint8_t crc_table[256] = {
    0x00, 0x07, 0x0E, 0x09, // ...
};

4. 配合指针修饰,控制读写权限

理解下面 3 种指针写法在嵌入式中非常重要:

声明方式含义
const int* p指向的内容不可改 (*p = 5; 错误),但可以指向别的地址
int* const p指针本身不可改(p = other; 错误),但可以修改 *p
const int* const p指针和内容都不可改
const int val = 10;
const int* p = &val;  // OK
*p = 20;              // ❌ 不允许

结合 volatile 使用(高级用法)

在一些寄存器场景中,可以使用 const volatile

#define STATUS_REG (*(const volatile uint32_t*)0x40000010)
关键字意义
volatile每次都要从真实地址读取
const不能修改内容(比如只读状态寄存器)

✅ 六、错误理解 & 开发建议

❌ 常见误解:

  • 认为 const 是完全只读(指针情况更复杂)

  • 忽视 const 在 RAM/ROM 优化的作用

  • 不在查表和配置中使用 const

✅ 建议:

  • 配置表、LUT、静态参数都要加 const

  • 所有函数的输入参数,只要不需要写,就加 const

  • 学会写复杂指针修饰组合(比如 const uint8_t* const p

✅ 总结

使用位置意图
全局常量放入 Flash,节省 RAM
函数参数明确只读、防止误操作
查找表提升性能、代码安全
寄存器访问volatile 联合使用
指针修饰控制访问粒度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梅尔文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值