diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 49d33b4..947c14f 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -34,6 +34,7 @@ // // #include "ins_task.h" // #include "bsp_log.h" #include "dev_cmd.h" +#include "daemon.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -145,7 +146,7 @@ const osThreadAttr_t daemon_attributes = { //@Todo:测试使用 osThreadId daemonHandle; -void DaemonTask(); +void StartDaemonTask(void *argument); // <--- 新的,带参数的标准 RTOS 线程声明 /* USER CODE END FunctionPrototypes */ @@ -264,9 +265,9 @@ void MX_FREERTOS_Init(void) // 创建线程 insTaskHandle = osThreadNew(StartINSTASK, NULL, &instask_attributes); - //@Todo:daemon是测试版本 - // 创建线程 - daemonHandle = osThreadNew(DaemonTask, NULL, &daemon_attributes); + //@Todo:daemon是测试版本 + // 创建线程 + daemonHandle = osThreadNew(StartDaemonTask, NULL, &daemon_attributes); // <--- 换成新的函数名 /* USER CODE END RTOS_THREADS */ /* USER CODE BEGIN RTOS_EVENTS */ @@ -447,19 +448,27 @@ __attribute__((noreturn)) void StartINSTASK(void *argument) * @brief Function implementing the reference thread. * @param argument: Not used * @retval None -* @Todo:Deamon task +* @Todo:Deamon task 后期加入cmd和def */ /* USER CODE END Header_RefereeTask */ -__weak void DaemonTask() +__attribute__((noreturn)) void StartDaemonTask(void *argument) { - /* USER CODE BEGIN DaemonTask */ + /* USER CODE BEGIN StartDaemonTask */ + // LOGINFO("[freeRTOS] Daemon Task Start"); + /* Infinite loop */ for (;;) { - osDelay(1); + // 1. 执行核心的数据刷新逻辑 + Daemon_Update(); + + // 2. 线程休眠 10ms (100Hz 运行频率) + osDelay(10); } - /* USER CODE END RefereeTask */ + /* USER CODE END StartDaemonTask */ } +// 注意:把你原来写在 freertos.c 里的那个 __weak void DaemonTask() 整个删掉,防止干扰! + /* USER CODE END Application */ diff --git a/User_Code/module/software/daemon/daemon.c b/User_Code/module/software/daemon/daemon.c index f5326cc..6300368 100644 --- a/User_Code/module/software/daemon/daemon.c +++ b/User_Code/module/software/daemon/daemon.c @@ -50,16 +50,20 @@ uint8_t DaemonIsOnline(Daemon_Instance *daemon) * 模块成功接受数据或成功操作则会重载temp_count的值为reload_count. * */ -void DaemonTask(void) +// === 在 daemon.c 中修改 === + +/** + * @brief 轮询刷新所有的守护进程实例 + */ +void Daemon_Update(void) // 名字改掉,不要叫 Task,避免和 RTOS 线程混淆 { Daemon_Instance *daemon; for (uint8_t i = 0; i < idx; i++) { daemon = daemon_instances[i]; - if (daemon->temp_count > 0) // 如果计数器还有值,说明上一次喂狗后还没有超时,则计数器减一 + if (daemon->temp_count > 0) daemon->temp_count--; - else if (daemon->callback != NULL) // 等于零说明超时了,调用回调函数(如果有的话) + else if (daemon->callback != NULL) daemon->callback(daemon->id); - // @todo 可以加入蜂鸣器或者led等提示 } } diff --git a/User_Code/module/software/daemon/daemon.h b/User_Code/module/software/daemon/daemon.h index 23b48a7..3de5ee8 100644 --- a/User_Code/module/software/daemon/daemon.h +++ b/User_Code/module/software/daemon/daemon.h @@ -67,6 +67,6 @@ uint8_t DaemonIsOnline(Daemon_Instance *daemon); * 模块成功接受数据或成功操作则会重载temp_count的值为reload_count. * */ -void DaemonTask(void); +void Daemon_Update(void); #endif // DAEMON_H