首页 / knowledge/代码解析/midware/interface/drm
drm.h
源文件路径:
midware/interface/drm/drm.h所属模块:midware / interface / drm(DRM 需求响应接口) 代码行数:26
1. 文件职责
本文件是 DRM(Demand Response Mode)模块的对外声明头,只有三条函数原型,没有任何类型、宏或变量定义。它存在的意义是把 midware/interface/drm/drm.c 的三个入口暴露给调度层(midware/interface/interface.c),同时通过 #include "includes.h" 把工程公共类型(u8/u16/u32 等)带进来。头文件本身不含逻辑、不持有状态,也不做参数校验,属于典型的"薄声明层"。其对应的实现细节(DRM0 ADC 分档、DRM1~4 GPIO 打包、RRCR/EZA/§14a/WLV 映射)全部在 drm.c 中。
2. 关键数据结构与宏
| 名称 | 类型 | 说明 |
|---|---|---|
__DRM_H | 宏(drm.h:9) | 头文件防重复包含守卫,风格与工程其它模块一致(__XXX_H) |
| (无) | — | 本文件未定义任何结构体、枚举、联合体、位域或常量宏。DRM 相关的数据结构(u16_drm_state 等)与配置枚举(RRCR_EZA_STATUS_E)分别定义在 drm.c:21 与 logic/logic.h:114 |
includes.h | 被引入的头(drm.h:13) | 工程总包含头,提供 u8/u16/u32/s32/TRUE/FALSE/ENABLE 等基础定义 |
3. 函数清单
| 函数名 | 作用域 | 说明 |
|---|---|---|
drm_init | 全局(声明于 drm.h:21,实现于 drm.c:33) | 上电初始化,把 g_t_logic_info.u8_drm_mode 复位为 16(DRM 无效) |
drm_mode_judge | 全局(声明于 drm.h:22,实现于 drm.c:67) | DRM 主判定:1 s 节流采集 + 模式判定 + RRCR/EZA/§14a/WLV 限值计算 |
drm_get | 全局(声明于 drm.h:23,实现于 drm.c:44) | 读 DRM1~DRM4 GPIO 并打包成 u16_drm_state |
本文件共有 3 条函数原型,全部为全局作用域,无 static 声明、无函数指针 typedef、无 extern 变量声明。
4. 核心逻辑解析
本文件无任何可执行逻辑,不存在状态机、算法、通信帧格式或定时时序。以下只说明三条原型在使用侧的时序约定,供实现与调用对齐:
- 调用顺序:
drm_init()只在上电时调用一次(midware/interface/interface.c:215,位于task_interface_parse的for(;;)之前);drm_mode_judge()在for(;;)内每周期调用(interface.c:219),且必须排在drm_init()之后——否则u8_drm_mode会短暂停留在未初始化值。 - 内部节流:
drm_mode_judge()自带 1 s 节流(drm.c:77,基于OSTimeGet()与静态 tick),因此调用方可以放心以更快的周期(例如 500 ms)反复调用,不需要在头文件层面约定周期。 - 无返回值、无参数:三个函数都是
void f(void),所有输入来自硬件 GPIO/ADC 与全局配置结构,所有输出经g_t_logic_info传递。这种"全隐式 I/O"的设计意味着无法从原型看出副作用,调用者必须阅读drm.c才能知道一次调用会改写哪些字段(u8_drm_mode、u16_drm_state、u8_rrcr_feedin_percent、u8_eza_feedin_percent、u8_deu_feedin_enable、u8_14a_enwg_enable、u8_wlv_enable、u8_wlv_percent)。 drm_get()的可见性:它被声明为全局函数,但实现中只被同文件的drm_mode_judge()调用(drm.c:82),全工程无第二个调用点。放在头文件里属于过度暴露。
5. 对外接口
本文件导出
| 名称 | 类型 | 使用方 |
|---|---|---|
drm_init | 函数原型(drm.h:21) | midware/interface/interface.c:215(经 drm.h 包含) |
drm_mode_judge | 函数原型(drm.h:22) | midware/interface/interface.c:219 |
drm_get | 函数原型(drm.h:23) | 无外部调用者(仅 drm.c 内部) |
本文件不导出任何变量:u16_drm_state(drm.c:21)虽为全局符号,但未在此头文件中 extern 声明。
本文件调用的外部函数 / 变量
无。头文件只 #include "includes.h" 并声明三个原型,不引用任何外部符号。
6. 依赖关系
依赖
includes.h(drm.h:13)。这是唯一的 include,用于取得 u8/u16/u32 等基础类型别名。
被依赖
midware/interface/drm/drm.c:13:实现文件包含本头。midware/interface/interface.c:经本头声明调用drm_init()(215 行)与drm_mode_judge()(219 行)。- 无其它文件包含
drm.h(grep 全工程仅上述两处)。
7. 备注与风险点
- 头文件自包含性不足:
drm.h只 includeincludes.h,但三条原型的参数/返回都是void,所以不依赖其它类型;这一处没有问题。真正的风险在于实现文件drm.c额外依赖gpio.h、logic.h、inverter.h,而这些依赖没有体现在头文件里,其他模块若只想用drm_get()必须自行补齐 include。 - 缺少版本信息:文件头注释(
drm.h:1–8)的@version、@date、@brief三个字段全部留空,与同目录dry_node.h(有V1.0.0/2017/05/18)风格不一致。 drm_get()过度暴露(drm.h:23):实现中只服务于drm_mode_judge()内部的采集步骤,建议改为static并从头文件移除;若为调试/产测保留,应在注释中说明调用者。- 无版本/兼容性宏:不像部分厂商协议头文件会定义寄存器表版本,本头文件没有任何可配置项,所有阈值(800/3000、0.5568/0.4432)硬编码在
.c中,无法通过头文件覆盖。 - 函数命名未带模块前缀以外的语义:
drm_get()名字过于通用,容易被误认为"获取 DRM 状态并返回",实际它只写全局变量、无返回值。建议改名drm_signal_sample()或补注释。