树莓派Pico的IRQ在C中正常运行,C++编译报错?
树莓派Pico GPIO中断C++编译错误修复
问题概述
树莓派Pico的GPIO中断代码用C编译运行正常,但切换为C++编译时出现类型转换错误,回调函数指针无法匹配API要求的类型。
关键错误信息
编译时核心报错:
error: invalid conversion from 'void (*)()' to 'gpio_irq_callback_t' {aka 'void (*)(unsigned int, long unsigned int)'} [-fpermissive]
原因是gpio_set_irq_enabled_with_callback要求的回调函数签名为void (*)(unsigned int, uint32_t),原代码中的无参数回调函数在C语言中可隐式转换,但C++对函数指针类型检查更严格,不允许这种不匹配的转换。
修复方案
修改回调函数,使其严格匹配gpio_irq_callback_t的签名,即使不需要使用传入的参数,也要保留参数声明:
#include <stdio.h> #include "pico/stdlib.h" #include "hardware/gpio.h" // 修正后的回调函数,符合API要求的签名 void gpio_callback(uint gpio, uint32_t events) { printf("GPIO RISE\n"); // 可选:利用gpio和events参数扩展逻辑,比如判断触发中断的引脚或事件类型 // if (gpio == 2 && (events & GPIO_IRQ_EDGE_RISE)) { ... } } int main() { stdio_init_all(); printf("Hello GPIO IRQ\n"); gpio_set_irq_enabled_with_callback(2, GPIO_IRQ_EDGE_RISE, true, &gpio_callback); while (1); return 0; }
验证步骤
- 保持原C++版本的CMakeLists.txt不变(仅源文件后缀为.cpp)
- 重新执行编译流程:
mkdir build && cd build cmake .. make
编译将正常完成,烧录到Pico后可正常触发GPIO中断并输出信息。
内容的提问来源于stack exchange,提问作者Taylor
相关产品推荐
相关产品推荐

