【类 型】:fix

【原  因】:task1核心 运行卡顿 delay太多
【过  程】:mqtt的回调中delay 全部改为异步执行
【影  响】:

# 类型 包含:
# feat:新功能(feature)
# fix:修补bug
# docs:文档(documentation)
# style: 格式(不影响代码运行的变动)
# refactor:重构(即不是新增功能,也不是修改bug的代码变动)
# test:增加测试
# chore:构建过程或辅助工具的变动
This commit is contained in:
air 2025-05-22 20:18:52 +08:00
parent 562beb6ce9
commit 65623b01bc
2 changed files with 90 additions and 85 deletions

View File

@ -63,6 +63,7 @@ String topicHandle[] = {"crosFrequency"};
/*异步线程对象*/ /*异步线程对象*/
Ticker pubTicker; // 定时发布主题 线程 Ticker pubTicker; // 定时发布主题 线程
Ticker mavTicker; // 定时 指定飞控mavlink 串口返回的数据类别 防止飞控启动滞后 Ticker mavTicker; // 定时 指定飞控mavlink 串口返回的数据类别 防止飞控启动滞后
Ticker funTicker; // 延迟执行
// Ticker chanTicker; //定时向飞控 发送油门指定 // Ticker chanTicker; //定时向飞控 发送油门指定
portMUX_TYPE espMutex = portMUX_INITIALIZER_UNLOCKED; portMUX_TYPE espMutex = portMUX_INITIALIZER_UNLOCKED;
/** /**
@ -128,13 +129,16 @@ void mqtt_receiveCallback(char *topic, byte *payload, unsigned int length)
topicPubMsg[10] = fc.setNBit(topicPubMsg[10], n, state); topicPubMsg[10] = fc.setNBit(topicPubMsg[10], n, state);
if (n = 5 && state == 1) // 执行任务 ps:切自动 if (n = 5 && state == 1) // 执行任务 ps:切自动
{ {
delay(3000); funTicker.once(3, []()
// 切模式 {
// 切模式
set_mode(AUTO); // 设置飞控为自动模式 set_mode(AUTO); // 设置飞控为自动模式
// 油门 funTicker.once(3, []()
delay(3000); {
uint16_t chan[] = {1500, 1500, 1500, 1500}; // 油门
fc.mav_channels_override(chan); // 控制油门 uint16_t chan[] = {1500, 1500, 1500, 1500};
fc.mav_channels_override(chan); // 控制油门
}); });
} }
} }
else if (key == "unlock") // 解锁 else if (key == "unlock") // 解锁
@ -143,9 +147,11 @@ void mqtt_receiveCallback(char *topic, byte *payload, unsigned int length)
uint16_t chan[] = {1500, 1500, 1100, 1500}; // 加解锁 油门到底 uint16_t chan[] = {1500, 1500, 1100, 1500}; // 加解锁 油门到底
fc.mav_channels_override(chan); // 控制油门 fc.mav_channels_override(chan); // 控制油门
set_mode(LOITER); // 设置飞控为定点模式 set_mode(LOITER); // 设置飞控为定点模式
delay(2000); // 可以根据需要调整延迟时间,确保模式切换生效 // 可以根据需要调整延迟时间,确保模式切换生效
lock_or_unlock(false); // 解锁 funTicker.once(2, []()
// 功能待修改 判断有没有在地面上 然后切定点 确认切定点油门设1100 {
lock_or_unlock(false); // 解锁
});
} }
else if (key == "lock") // 加锁 else if (key == "lock") // 加锁
{ {
@ -154,15 +160,16 @@ void mqtt_receiveCallback(char *topic, byte *payload, unsigned int length)
fc.mav_channels_override(chan); // 控制油门 fc.mav_channels_override(chan); // 控制油门
// 加锁 // 加锁
lock_or_unlock(true); lock_or_unlock(true);
delay(2000); // 可以根据需要调整延迟时间,确保模式切换生效 // 延迟切模式
set_mode(LOITER); // 设置飞控为定点模式 funTicker.once(2, []()
{
set_mode(LOITER); // 设置飞控为定点模式
});
} }
else if (key == "guidedMode") // 指点 else if (key == "guidedMode") // 指点
{ {
// 设置飞控为 Guided 模式 // 设置飞控为 Guided 模式
set_mode(GUIDED); set_mode(GUIDED);
// 确保模式切换生效
delay(2000);
// JSON 反序列化 取经纬高 // JSON 反序列化 取经纬高
String todoJson = value; String todoJson = value;
@ -180,8 +187,6 @@ void mqtt_receiveCallback(char *topic, byte *payload, unsigned int length)
lon = obj["lon"].as<double>(); lon = obj["lon"].as<double>();
} }
addLogMessage("lat:" + String(lat, 8) + " lon:" + String(lon, 8) + " alt:" + String(alt, 8));
// 根据经纬度是否为0选择起飞或导航 // 根据经纬度是否为0选择起飞或导航
if (lat == 0.0 && lon == 0.0) if (lat == 0.0 && lon == 0.0)
{ {
@ -194,37 +199,50 @@ void mqtt_receiveCallback(char *topic, byte *payload, unsigned int length)
} }
else if (key == "autoMode") // 自动auto模式 else if (key == "autoMode") // 自动auto模式
{ {
delay(3000);
// 切模式 funTicker.once(3, []()
set_mode(AUTO); // 设置飞控为自动模式 {
// 油门 // 切模式
delay(3000); set_mode(AUTO); // 设置飞控为自动模式
uint16_t chan[] = {1500, 1500, 1500, 1500}; funTicker.once(3,[]()
fc.mav_channels_override(chan); // 控制油门 {
// 油门
uint16_t chan[] = {1500, 1500, 1500, 1500};
fc.mav_channels_override(chan); // 控制油门
}); });
} }
else if (key == "loiterMode") // 悬停定点loiter模式 else if (key == "loiterMode") // 悬停定点loiter模式
{ {
// 油门 // 油门
uint16_t chan[] = {1500, 1500, 1500, 1500}; uint16_t chan[] = {1500, 1500, 1500, 1500};
fc.mav_channels_override(chan); // 控制油门 fc.mav_channels_override(chan); // 控制油门
delay(500); funTicker.once(0.5, []()
// 切模式 {
set_mode(LOITER); // 设置飞控为定点模式 // 切模式
// 油门 set_mode(LOITER); // 设置飞控为定点模式
delay(500); funTicker.once(0.5, []()
fc.mav_channels_override(chan); // 控制油门 {
// 油门
uint16_t chan[] = {1500, 1500, 1500, 1500};
fc.mav_channels_override(chan); // 控制油门
}); });
} }
else if (key == "holdAltMode") // 定高 else if (key == "holdAltMode") // 定高
{ {
// 油门 // 油门
uint16_t chan[] = {1500, 1500, 1500, 1500}; uint16_t chan[] = {1500, 1500, 1500, 1500};
fc.mav_channels_override(chan); // 控制油门 fc.mav_channels_override(chan); // 控制油门
delay(500); funTicker.once(0.5, []()
// 切模式 {
set_mode(ALT_HOLD); // 切模式
// 油门 set_mode(ALT_HOLD); // 设置飞控为定高模式
delay(500); funTicker.once(0.5, []()
fc.mav_channels_override(chan); // 控制油门 {
// 油门
uint16_t chan[] = {1500, 1500, 1500, 1500};
fc.mav_channels_override(chan); // 控制油门
}); });
} }
else if (key == "landMode") // 降落 else if (key == "landMode") // 降落
{ {
@ -371,7 +389,7 @@ void writeRoute(String todoJson)
{ {
if (fc.writeState) // 如果正在写入状态 跳出 if (fc.writeState) // 如果正在写入状态 跳出
{ {
fc.logln("正在写航点"); // 提示正在写入中 addLogMessage("misson_writing"); // 提示正在写入中
return; return;
} }
@ -393,7 +411,7 @@ void writeRoute(String todoJson)
if (fc.missionArkType == 0) if (fc.missionArkType == 0)
{ // 写入成功 { // 写入成功
fc.missionArkType = -1; // “航点写入是否成功” 改成-1默认状态 fc.missionArkType = -1; // “航点写入是否成功” 改成-1默认状态
fc.logln("misson_bingo..."); addLogMessage("misson_bingo...");
// 改变飞机状态 // 改变飞机状态
topicPubMsg[10] = fc.setNBit(topicPubMsg[10], 0, 0); // 结束初始状态 topicPubMsg[10] = fc.setNBit(topicPubMsg[10], 0, 0); // 结束初始状态
topicPubMsg[10] = fc.setNBit(topicPubMsg[10], 1, 0); // 结束写入状态 topicPubMsg[10] = fc.setNBit(topicPubMsg[10], 1, 0); // 结束写入状态
@ -403,7 +421,7 @@ void writeRoute(String todoJson)
else if (fc.missionArkType > 0) else if (fc.missionArkType > 0)
{ // 写入失败 { // 写入失败
fc.missionArkType = -1; // “航点写入是否成功” 改成-1默认状态 fc.missionArkType = -1; // “航点写入是否成功” 改成-1默认状态
fc.logln("misson_error..."); addLogMessage("misson_error...");
// 改变飞机状态 // 改变飞机状态
topicPubMsg[10] = fc.setNBit(topicPubMsg[10], 2, 0); // 航点写入失败状态 topicPubMsg[10] = fc.setNBit(topicPubMsg[10], 2, 0); // 航点写入失败状态
topicPubMsg[10] = fc.setNBit(topicPubMsg[10], 1, 0); // 结束写入状态 topicPubMsg[10] = fc.setNBit(topicPubMsg[10], 1, 0); // 结束写入状态
@ -431,13 +449,11 @@ void writeRoute(String todoJson)
{ {
fc.questVoiceStr = str; fc.questVoiceStr = str;
} }
fc.logln("frame--"); addLogMessage("misson_frame--" + String(fc.futureSeq));
fc.logln(frame);
// 写入航点 // 写入航点
fc.mav_mission_item(fc.writeSeq, frame, command, current, autocontinue, param1, param2, param3, param4, x, y, z); fc.mav_mission_item(fc.writeSeq, frame, command, current, autocontinue, param1, param2, param3, param4, x, y, z);
fc.futureSeq++; // 下一个航点序号 fc.futureSeq++; // 下一个航点序号
} }
delay(20);
} }
} }
@ -696,7 +712,7 @@ void mavlink_receiveCallback(uint8_t c)
break; break;
} }
fc.playText(topicPubMsg[12]); fc.playText(topicPubMsg[12]);
addLogMessage("飞控模式已切换为" + topicPubMsg[12]); // 终端 打印日志 addLogMessage("Mode--" + topicPubMsg[12]); // 终端 打印日志
} }
} }
break; break;
@ -1022,13 +1038,9 @@ void addLogMessage(const String &msg)
void refreshRequest() void refreshRequest()
{ {
fc.mav_request_home_position(); fc.mav_request_home_position();
delay(50); fc.mav_request_data(); // 请求 设定飞控输出数据流内容
fc.mav_request_data(); // 请求 设定飞控输出数据流内容
delay(50);
fc.mav_parameter_data("BATT_CAPACITY"); // 请求飞控 返回参数 电池容量 值 fc.mav_parameter_data("BATT_CAPACITY"); // 请求飞控 返回参数 电池容量 值
delay(50); fc.mav_parameter_data("WPNAV_SPEED"); // 请求飞控 返回参数 返航速度
fc.mav_parameter_data("WPNAV_SPEED"); // 请求飞控 返回参数 返航速度
delay(50);
} }
/** /**

View File

@ -1,5 +1,5 @@
///主程序,硬件及线程控制 /// 主程序,硬件及线程控制
/// @file main.cpp /// @file main.cpp
#include <Arduino.h> #include <Arduino.h>
#include "HX711.h" #include "HX711.h"
#include "OneButton.h" #include "OneButton.h"
@ -76,12 +76,10 @@ bool _checkweightcal = false; // 检测是否要检测称重传感器是否需
uint8_t _checkweighttimes = 0; // uint8_t _checkweighttimes = 0; //
unsigned long _tm_checkweigh; unsigned long _tm_checkweigh;
static const char *MOUDLENAME = "MAIN"; static const char *MOUDLENAME = "MAIN";
unsigned long _tm_core1 ; //主核心1 循环开始时间 unsigned long _tm_core1; // 主核心1 循环开始时间
unsigned long _tm_core0 ; //核心0 循环开始时间 unsigned long _tm_core0; // 核心0 循环开始时间
unsigned long _looptm_core1=0 ; //主核心1单次循环时间--评估是否超时卡顿 unsigned long _looptm_core1 = 0; // 主核心1单次循环时间--评估是否超时卡顿
unsigned long _looptm_core0=0 ; //核心0单次循环时间--评估是否超时卡顿 unsigned long _looptm_core0 = 0; // 核心0单次循环时间--评估是否超时卡顿
// 称重校准状态 // 称重校准状态
enum Weightalign_status enum Weightalign_status
@ -105,7 +103,7 @@ void setup()
// 调试串口 // 调试串口
Serial.begin(57600); Serial.begin(57600);
ESP_LOGI(MOUDLENAME, "Starting PullupDevice... Ver:%s", VERSION); // ESP_LOGI(MOUDLENAME, "Starting PullupDevice... Ver:%s", VERSION);
preferences.begin("PullupDev", false); preferences.begin("PullupDev", false);
wei_offset = preferences.getLong("wei_offset", 0); wei_offset = preferences.getLong("wei_offset", 0);
// ESP_LOGD(MOUDLENAME, "wei_offset:%d", wei_offset); // ESP_LOGD(MOUDLENAME, "wei_offset:%d", wei_offset);
@ -138,9 +136,9 @@ void setup()
// 初始化RGB LED 显示黄色灯表示需要注意 LED // 初始化RGB LED 显示黄色灯表示需要注意 LED
FastLED.addLeds<WS2812, LED_DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical FastLED.addLeds<WS2812, LED_DATA_PIN, RGB>(leds, NUM_LEDS); // GRB ordering is typical
if (!motocontrol.init(&myservo)) // 初始化电机控制 if (!motocontrol.init(&myservo)) // 初始化电机控制
ESP_LOGE(MOUDLENAME, "motocontrol init fault"); // ESP_LOGE(MOUDLENAME, "motocontrol init fault");
initstatus = IS_WaitStart; initstatus = IS_WaitStart;
_tm_waitinit = millis(); _tm_waitinit = millis();
_needweightalign = (wei_offset == 0); _needweightalign = (wei_offset == 0);
@ -289,10 +287,10 @@ bool check_tare()
// //
void checkinited() void checkinited()
{ {
//根据初始化状态initstatus操作 // 根据初始化状态initstatus操作
switch (initstatus) switch (initstatus)
{ {
//刚开机等待500ms // 刚开机等待500ms
case Initstatus::IS_WaitStart: case Initstatus::IS_WaitStart:
{ {
if ((millis() - _tm_waitinit) > 500) if ((millis() - _tm_waitinit) > 500)
@ -418,7 +416,7 @@ void set_locked(bool locked)
// 在核心1上执行重要的延迟低的 // 在核心1上执行重要的延迟低的
void loop() void loop()
{ {
_tm_core1= millis(); _tm_core1 = millis();
// sercomm.getcommand(); // 得到控制命令 // sercomm.getcommand(); // 得到控制命令
button_checktop.tick(); // 按钮 button_checktop.tick(); // 按钮
button_down.tick(); // 按钮 button_down.tick(); // 按钮
@ -453,15 +451,14 @@ void loop()
check_tare(); // 检查看是否需要校准称重 check_tare(); // 检查看是否需要校准称重
checkinited(); // 检测执行初始化工作 checkinited(); // 检测执行初始化工作
delay(1); delay(1);
_looptm_core1= millis()-_tm_core1; _looptm_core1 = millis() - _tm_core1;
//如果循环时间超过1000ms,则打印错误日志 // 如果循环时间超过1000ms,则打印错误日志
if (_looptm_core1>10)
{
// ESP_LOGE(MOUDLENAME, "main loop time out %d ms", _looptm_core1);
addLogMessage("core1 timeout: " + String(_looptm_core1));
}
if (_looptm_core1 > 10)
{
// ESP_LOGE(MOUDLENAME, "main loop time out %d ms", _looptm_core1);
addLogMessage("core1 timeout: " + String(_looptm_core1));
}
} }
// 在核心0上执行耗时长的低优先级的 // 在核心0上执行耗时长的低优先级的
void Task1(void *pvParameters) void Task1(void *pvParameters)
@ -474,34 +471,29 @@ void Task1(void *pvParameters)
// 在这里可以添加一些代码这样的话这个任务执行时会先执行一次这里的内容当然后面进入while循环之后不会再执行这部分了 // 在这里可以添加一些代码这样的话这个任务执行时会先执行一次这里的内容当然后面进入while循环之后不会再执行这部分了
while (1) while (1)
{ {
_tm_core0= millis(); _tm_core0 = millis();
/*重量*/
if (_needweightalign) if (_needweightalign)
{ {
_needweightalign = false; _needweightalign = false;
scale.tare(); scale.tare();
} }
pullweight = get_pullweight();
// 显示重量
// printf("pullweight: %d \n", pullweight);
/////////////////////////////////MQTT_语音_MAVLINK 部分 pullweight = get_pullweight();
/*从飞控拿数据*/ /*从飞控拿数据*/
fc.comm_receive(mavlink_receiveCallback); fc.comm_receive(mavlink_receiveCallback);
vTaskDelay(1); // vTaskDelay(1);
/////////////////////////////////MQTT_语音_MAVLINK 部分结束
if (fc.checkWiFiStatus()) if (fc.checkWiFiStatus())
/*保持mqtt心跳,如果Mqtt没有连接会自动连接*/ fc.mqttLoop("cmd"); // 保持mqtt心跳,如果Mqtt没有连接会自动连接
fc.mqttLoop("cmd");
vTaskDelay(10); vTaskDelay(10);
_looptm_core0= millis()-_tm_core0;
_looptm_core0 = millis() - _tm_core0;
//如果循环时间超过100ms,则打印错误日志 /*如果循环时间超过100ms,则打印错误日志*/
if (_looptm_core0>200) if (_looptm_core0 > 50)
{ {
// ESP_LOGE(MOUDLENAME, "main loop time out %d ms", _looptm_core1);
addLogMessage("core0 timeout: " + String(_looptm_core0)); addLogMessage("core0 timeout: " + String(_looptm_core0));
} }
} }
} }
void sendinfo() // 每500ms发送状态信息 void sendinfo() // 每500ms发送状态信息
@ -791,7 +783,8 @@ void Hook_autodown(float length_cm)
motocontrol.moto_goodsdown(length_cm); // 二楼340 //桌子40 motocontrol.moto_goodsdown(length_cm); // 二楼340 //桌子40
} }
else else
ESP_LOGE(MOUDLENAME, "autodown fault, not HS_Locked "); addLogMessage("autodown fault, not HS_Locked");
// ESP_LOGE(MOUDLENAME, "autodown fault, not HS_Locked ");
} }
void Hook_stop() void Hook_stop()
{ {