Files
JBao_Temp_Humi_Fan_FW/apps/usr_app/app_defer.h
T
wuchuyuan e324ebd99b 精简 usr_app 架构:去掉关机/休眠死代码,按键复用 key.c 状态机,ISR 重活统一延后到任务上下文
Type-C 长供电、上电即工作、无软关机,删除 app_boot/app_power 及 DP0 开关相关逻辑,
去掉空占位 app_fan_run 和无效的 usr_timer_pick_mode/rearm(数码管 4ms 扫描已 priority=1,
系统本来就不会进低功耗)。按键 5s 配对 / 12s OTA 改走 key.c 长按分级,去掉自计时与 1~5s 死区。
新增 app_defer,NVM/配对/OTA 只在 ISR 置位、在 500ms 任务上下文落地,避免再在 usr_timer 里写 flash。
规格书与注释同步精简。
2026-08-31 17:57:52 +08:00

60 lines
2.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/******************************************************************************
* @file app_defer.h
* @brief ISR→任务上下文的延后执行标志位(统一收口 2026-08-31 复位事故教训)
* @author cyWu <1917507415@qq.com>
* @date 2026.08.31
* @version V1.0.0,首次发布
*
* @note ⚠ 硬约束:flash 擦写(syscfg_write)、BLE 广播切换、关机收口等"重活"
* 禁止在 usr_timer_add 的中断上下文回调(本产品 20ms usr_timer_tick /
* 按键长按回调)里直接执行,只能在 usr_timer_loopBLE 线程,任务
* 上下文,栈充足)里执行。之前每个模块各自发明一个 pending 标志
* off_pending/pair_pending/ota_pending/nvm 的 s_need_save),
* 容易被后来的功能遗漏这条红线——本模块把"打标志"这一步收成统一
* 接口:ISR 只准调 app_defer_request(),真正执行永远在
* app_function_loop() 里用 app_defer_take() 消费。
******************************************************************************/
#ifndef __APP_DEFER_H__
#define __APP_DEFER_H__
#include <stdint.h>
/** 延后动作位,新增一种"需要写flash/切广播/关机"的动作就加一项 */
typedef enum {
APP_DEFER_NVM_SAVE = 0, /**< VM 防抖到点,需要落盘 */
APP_DEFER_PAIR, /**< 长按 5s 松手,需要清绑定进配对 */
APP_DEFER_OTA, /**< 长按 12s 到点,需要进 OTA */
APP_DEFER_MAX
} AppDeferBit_t;
/**
* @brief 中断上下文调用:只置位,不做任何实际动作
* @param bit 要延后的动作
* @return 无
*/
void app_defer_request(AppDeferBit_t bit);
/**
* @brief 任务上下文调用:查询并清除标志(取出即消费,最多处理一次)
* @param bit 要消费的动作
* @return 1=之前挂起过(现在可以执行真正动作),0=没挂起
*/
uint8_t app_defer_take(AppDeferBit_t bit);
/**
* @brief 任务上下文调用:只查询是否挂起,不清除(多个动作互斥判断用)
* @param bit 要查询的动作
* @return 1=挂起中,0=未挂起
*/
uint8_t app_defer_is_pending(AppDeferBit_t bit);
/**
* @brief 任务上下文调用:撤销挂起(如 OTA 触发时要撤销配对)
* @param bit 要撤销的动作
* @return 无
*/
void app_defer_cancel(AppDeferBit_t bit);
#endif /* __APP_DEFER_H__ */