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

Mbed平台线程Callback传参报错:无匹配重载函数求助

解决Mbed RTOS Callback传递多指针参数的错误

错误原因分析

  1. Callback参数匹配与线程重复启动冲突:你在main的死循环里反复调用Thread.start(),线程对象只能启动一次,重复调用不仅会触发未定义行为,还会干扰编译时的回调参数匹配检查。
  2. 指针操作逻辑错误:在BeginCarPark函数中,你直接对指针变量count、space_count进行加减赋值,这是修改指针地址而非指向的实际数值,完全偏离业务逻辑。
  3. 信号等待API误用:Thread::signal_wait是静态方法,在Mbed OS 5及以后版本,需用ThisThread::signal_wait来等待当前线程的信号。

修正后的代码

#include "mbed.h"
#include "rtos.h"

DigitalOut led(LED1);
DigitalIn switch1(PC_9); // 停车场启停开关
DigitalIn switch2(PC_8); // 车辆进入检测
DigitalIn switch3(PC_10); // 车辆离开检测

void BeginDisplay(int *count, int *space_count){
    ThisThread::signal_wait(0x2); // 等待当前线程的启动信号
    int avail = 0;
    while(true){
        if(*space_count <= 10){
            avail = *count - *space_count;
            printf("\nAvailable space: %d\n\r", avail);
        } else {
            printf("\nCar park full\n\r");
        }
        ThisThread::sleep_for(500ms); // 降低打印频率,减少CPU占用
    }
}

void BeginCarPark(int *count, int *space_count){
    ThisThread::signal_wait(0x1); // 等待当前线程的启动信号
    while(true){
        if(*count <= 0){ // 解引用指针,判断实际剩余车位
            printf("\nCar Park is full\n\r");
        } else {
            printf("\nCar Park is available\n\r");
        }
        
        if(switch2 == 1){ // 车辆进入(假设开关按下为高电平)
            if(*count > 0){
                *count -= 1;
                *space_count = 10 - *count; // 更新已占用车位数量
            }
        } else if(switch3 == 1){ // 车辆离开
            if(*count < 10){
                *count += 1;
                *space_count = 10 - *count;
            }
        }
        ThisThread::sleep_for(200ms); // 开关防抖,降低CPU占用
    }
}

int main(){
    Thread CarPark;
    Thread Display;
    int space_count = 0; // 已占用车位
    int space_capacity = 10; // 剩余车位初始值
    printf("\nCar Park is Closed\n\r");

    // 线程仅启动一次,移出死循环
    Display.start(callback(BeginDisplay, &space_capacity, &space_count));
    CarPark.start(callback(BeginCarPark, &space_capacity, &space_count));

    while(1){
        if(switch1 == 1){ // 开关按下,启动停车场
            CarPark.signal_set(0x1);
            Display.signal_set(0x2);
            printf("\nCar Park is Open\n\r");
        } else {
            // 关闭停车场时重置状态
            space_capacity = 10;
            space_count = 0;
            printf("\nCar Park is Closed\n\r");
        }
        ThisThread::sleep_for(300ms);
    }
}

关键修正点说明

  • 线程启动逻辑:将Thread.start()移到main的死循环外,确保每个线程仅初始化启动一次。
  • Callback使用:直接用callback(函数名, 参数1, 参数2)即可,修正后编译会正确匹配函数签名。
  • 指针操作:所有对count和space_count的操作添加解引用*,修改指针指向的实际数值而非指针地址。
  • 信号API更新:用ThisThread::signal_wait替代Thread::signal_wait,确保等待当前线程的信号。
  • 延时优化:在循环中添加ThisThread::sleep_for,避免CPU占用过高,同时实现开关防抖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:55:21