Mbed平台线程Callback传参报错:无匹配重载函数求助
解决Mbed RTOS Callback传递多指针参数的错误
错误原因分析
- Callback参数匹配与线程重复启动冲突:你在
main的死循环里反复调用Thread.start(),线程对象只能启动一次,重复调用不仅会触发未定义行为,还会干扰编译时的回调参数匹配检查。 - 指针操作逻辑错误:在
BeginCarPark函数中,你直接对指针变量count、space_count进行加减赋值,这是修改指针地址而非指向的实际数值,完全偏离业务逻辑。 - 信号等待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
相关产品推荐
相关产品推荐

