You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派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;
}

验证步骤

  1. 保持原C++版本的CMakeLists.txt不变(仅源文件后缀为.cpp)
  2. 重新执行编译流程:
    mkdir build && cd build
    cmake ..
    make
    

编译将正常完成,烧录到Pico后可正常触发GPIO中断并输出信息。

内容的提问来源于stack exchange,提问作者Taylor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:05:28