diff --git a/Docs/30_architecture/main.md b/Docs/30_architecture/main.md index 5ee7b15..36f4c0c 100644 --- a/Docs/30_architecture/main.md +++ b/Docs/30_architecture/main.md @@ -114,34 +114,85 @@ typedef struct { ## 4. 软件层级架构与核心代码框架 -软件系统采用 **非阻塞** 的三层级模块化架构设计: +软件系统采用 **分层依赖、事件驱动、非阻塞** 的模块化架构设计。其层级结构与核心依赖关系如下: + +### 4.1 系统层级依赖与调用图 ```mermaid graph TD - subgraph Layer3 ["应用层 (APP)"] - MainScheduler[主循环轮询 & 喂狗] - SysStateMachine[SystemState 业务状态机] - SoftRTC[软件 RTC 计时器] + %% 定义层级背景色与分组 + subgraph LayerAPP ["应用逻辑层 (APP Layer)"] + MainScheduler["主循环调度器 (main.c)"] + SysStateMachine["SysState 业务状态机"] + SoftRTC["软件 RTC 计时器"] end - subgraph Layer2 ["外设驱动层 (DRV)"] - AMOLED[RM69310 AMOLED 屏幕绘制] - RF[LR690L 编解码 & 过滤 0x08 SOS 信号] - KEY[按键消抖 & 长按长计时] - PM[低功耗休眠与唤醒] - LED[WS2812B 级联双彩灯时序] - MOTOR[振动马达脉冲时序] + + subgraph LayerDRV ["外设驱动层 (DRV Layer)"] + AMOLED["Truly RM69310 屏幕绘制"] + RF["LR690L RF 编解码及发射"] + KEY["按键检测与队列缓冲"] + PM["极低功耗电源管理"] + LED["WS2812B 双彩灯控制"] + MOTOR["振动马达异步时序"] end - subgraph Layer1 ["硬件抽象与时基层 (HW)"] - Timer1["Timer 1 中断 (1ms 滴答)"] - ADC[12位电压采集] - Flash[IAP 读写] - GPIO[数字 I/O 与电平中断] + + subgraph LayerHW ["硬件抽象与时基层 (HW Layer)"] + Timer1["Timer 1 (1ms 中断时基)"] + ADC["ADC (12位电量采集)"] + Flash["IAP (内嵌 Flash 读写)"] + GPIO["GPIO (端口控制/中断唤醒)"] end - Layer1 --> Layer2 - Layer2 --> Layer3 + + %% --- 依赖与调用连线 --- + + %% 硬件时基驱动外设异步处理 (由 ISR 驱动,非阻塞) + Timer1 -->|1ms 中断调度| KEY + Timer1 -->|分频 10ms 驱动| MOTOR + Timer1 -->|中断分频闪烁| LED + Timer1 -->|秒级分频累加| SoftRTC + + %% 外设层对硬件抽象层的调用 + AMOLED -->|SPI 端口操作| GPIO + RF -->|INT2 沿中断捕获| GPIO + KEY -->|引脚高阻上拉输入| GPIO + PM -->|SHUT 引脚控制 SGM3833| GPIO + LED -->|P2.6 SPI_MOSI 时序| GPIO + MOTOR -->|P2.4 PWM 电平输出| GPIO + + %% 应用层与外设层、硬件层的交互 (事件驱动 & 主循环轮询) + MainScheduler -->|1. 轮询读入按键事件| KEY + MainScheduler -->|2. 轮询捕获 RF 数据包| RF + MainScheduler -->|3. 喂看门狗| GPIO + + MainScheduler -->|分发事件与控制跳转| SysStateMachine + + SysStateMachine -->|重绘标志 Redraw=1 触发| AMOLED + SysStateMachine -->|读取/保存配对配置| Flash + SysStateMachine -->|启动特定防区闪烁/爆闪| LED + SysStateMachine -->|启动特定防区马达震动| MOTOR + SysStateMachine -->|休眠判定与硬件断电睡眠| PM + SysStateMachine -->|主动发射对码/SOS载波| RF + SysStateMachine -->|读取电量及充电状态| ADC + SysStateMachine -->|获取/更新待机时间| SoftRTC ``` -### 4.1 核心主程序调度框架 (main.c) +### 4.2 架构设计与依赖原则说明 + +1. **单向依赖原则**: + * **APP 层**仅依赖于 **DRV 层**提供的高级抽象接口(例如 `LED_Set_Color`、`Motor_Start_Pattern`)和 **HW 层**的数据库读写。**严禁**在 APP 层直接写入具体 IO 寄存器。 + * **DRV 层**调用 **HW 层**提供的基础时基与 GPIO 端口函数,不保存任何系统级别的状态变量(`current_state` 等)。 + * **HW 层**为最底层,除触发中断服务子程序 (ISR) 外,不依赖任何上层逻辑。 + +2. **事件驱动与非阻塞机制**: + * **按键事件缓冲机制**:`KEY` 驱动在 Timer1 中断中进行每 10ms 的定时扫描消抖。识别到有效按键动作后,将其转换为 `KeyEvent` 并压入内部的 **环形事件队列**。主循环通过轮询读出该事件,避免了在按键按下时产生任何 `while` 等待导致系统挂起。 + * **马达与彩灯的异步时序设计**:`MOTOR` 与 `LED` 的报警波形(如:长震、间歇闪烁)均采用在 1ms 中断中自动扣减计数器的方式实现。APP 层发出启动指令后立即返回,由硬件中断负责底层的波形电平跳转,保证了射频解码及按键响应不会因为声光报警动作而产生卡顿。 + +3. **电源控制与低功耗恢复链条**: + * 休眠决策完全由主循环内的 `inactivity_timer` 进行倒计时判定。 + * 进入休眠前,由 `PM` 驱动断开 `SGM3833` 电源以彻底消除 AMOLED 的暗漏电流。 + * 唤醒时,由 GPIO 的电平沿变化触发中断,唤醒 CPU 后由 `PM` 优先执行 **“上电 -> 强延时 50ms 避开浪涌 -> 屏幕控制器重初始化”** 的安全恢复时序,防止未稳定电网下的写屏导致屏幕损坏或花屏。 + +### 4.3 核心主程序调度框架 (main.c) 主程序采用完全解耦的时间片轮询加事件触发的非阻塞循环结构: