1. 指针在嵌入式C语言中的核心地位
指针是C语言的灵魂所在,在嵌入式开发中更是无处不在。我见过太多初学者因为对指针理解不透彻,导致代码出现各种难以排查的bug。特别是在资源受限的嵌入式环境中,指针使用不当轻则导致内存泄漏,重则引发系统崩溃。
在STM32等MCU开发中,指针直接操作硬件寄存器是常态。比如配置GPIO时,我们经常会看到这样的代码:
c复制#define GPIOA_ODR *(volatile uint32_t*)(0x40010800 + 0x0C)
这行代码本质上就是通过指针直接访问内存映射的寄存器地址。理解指针的底层机制,才能明白为什么这样写能控制硬件。
2. 函数指针的实战应用
2.1 回调函数的实现机制
在嵌入式系统中,函数指针最常见的应用就是实现回调机制。以按键检测为例,传统做法是在主循环中轮询检测,但这样会浪费CPU资源。更高效的做法是:
c复制typedef void (*ButtonCallback)(void);
void register_button_handler(ButtonCallback cb) {
// 注册中断回调
EXTI->IMR |= EXTI_IMR_MR0;
EXTI->FTSR |= EXTI_FTSR_TR0;
NVIC_EnableIRQ(EXTI0_IRQn);
current_callback = cb; // 保存回调函数指针
}
void EXTI0_IRQHandler(void) {
if (EXTI->PR & EXTI_PR_PR0) {
EXTI->PR = EXTI_PR_PR0; // 清除中断标志
if (current_callback) {
current_callback(); // 通过函数指针调用回调
}
}
}
这种设计模式在RTOS的任务创建、定时器回调等场景中广泛应用。函数指针在这里充当了"行为参数化"的角色,极大提高了代码的灵活性。
2.2 状态机实现中的函数指针表
在嵌入式系统中,状态机是非常常见的设计模式。使用函数指针数组可以优雅地实现状态转移:
code复制
