ESP32-S3 吊坠设备固件,集成火山引擎 RTC 语音助手、蓝牙配网、 VEML7700 环境光传感器驱动及石头同频匹配交友功能。 VEML7700 驱动: - 基于 ESP-IDF i2c_master API 实现,复用项目 I2cDevice 基类 - 支持 ALS + White 双通道、自动量程、Vishay 非线性校正 - 3 次采样取中位数过滤偶发异常 石头同频匹配算法(双维度): - 维度1:光谱比值 ALS/White(石头固有光学特征,不随光照强度变化) - 维度2:亮度等级(5级对数划分,排除极端环境差异) - 比值阈值 15%,实测同石头姿势变化波动 1.6%~9.6%,安全余量充足 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
66 lines
2.0 KiB
C++
66 lines
2.0 KiB
C++
#include "background_task.h"
|
|
|
|
#include <esp_log.h>
|
|
#include <esp_task_wdt.h>
|
|
|
|
#define TAG "BackgroundTask"
|
|
|
|
BackgroundTask::BackgroundTask(uint32_t stack_size) {
|
|
xTaskCreate([](void* arg) {
|
|
BackgroundTask* task = (BackgroundTask*)arg;
|
|
task->BackgroundTaskLoop();
|
|
}, "background_task", stack_size, this, 2, &background_task_handle_);
|
|
}
|
|
|
|
BackgroundTask::~BackgroundTask() {
|
|
if (background_task_handle_ != nullptr) {
|
|
vTaskDelete(background_task_handle_);
|
|
}
|
|
}
|
|
|
|
void BackgroundTask::Schedule(std::function<void()> callback) {
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
if (active_tasks_ >= 30) {
|
|
int free_sram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL);
|
|
// 注释说明:为避免非关键日志刷屏,内存阈值告警降级为 DEBUG 并默认关闭
|
|
// if (free_sram < 10000) {
|
|
// ESP_LOGD(TAG, "active_tasks_ == %u, free_sram == %u", active_tasks_.load(), free_sram);
|
|
// }
|
|
}
|
|
// 记录活跃任务计数,作为队列饱和与完成条件的依据
|
|
active_tasks_++;
|
|
main_tasks_.emplace_back([this, cb = std::move(callback)]() {
|
|
cb();
|
|
{
|
|
std::lock_guard<std::mutex> lock(mutex_);
|
|
active_tasks_--;
|
|
if (main_tasks_.empty() && active_tasks_ == 0) {
|
|
condition_variable_.notify_all();
|
|
}
|
|
}
|
|
});
|
|
condition_variable_.notify_all();
|
|
}
|
|
|
|
void BackgroundTask::WaitForCompletion() {
|
|
std::unique_lock<std::mutex> lock(mutex_);
|
|
condition_variable_.wait(lock, [this]() {
|
|
return main_tasks_.empty() && active_tasks_ == 0;
|
|
});
|
|
}
|
|
|
|
void BackgroundTask::BackgroundTaskLoop() {
|
|
ESP_LOGI(TAG, "background_task started");
|
|
while (true) {
|
|
std::unique_lock<std::mutex> lock(mutex_);
|
|
condition_variable_.wait(lock, [this]() { return !main_tasks_.empty(); });
|
|
|
|
std::list<std::function<void()>> tasks = std::move(main_tasks_);
|
|
lock.unlock();
|
|
|
|
for (auto& task : tasks) {
|
|
task();
|
|
}
|
|
}
|
|
}
|