feat: 贵州协议接入 + PROGRAM_CODE 落库 + IAP 0x03 修复 + 通道/渲染/串口多路稳定性修复 - #3
Open
Vansama74 wants to merge 33 commits into
Open
feat: 贵州协议接入 + PROGRAM_CODE 落库 + IAP 0x03 修复 + 通道/渲染/串口多路稳定性修复#3Vansama74 wants to merge 33 commits into
Vansama74 wants to merge 33 commits into
Conversation
- 1-969/1-577 scan函数从硬编码6通道展开改为循环遍历total_channels, 使MODULE_ROWS/MODULE_COLS宏定义可自由配置而不越界 - HardFault调试变量(g_fault_stack/pc/cfsr/bfar/r0)加volatile防止编译器优化 - 删除CLAUDE.md
Add architecture optimization and protocol parser integration documentation for ChongQing (2nd gen) and QingHai highway fee display protocols.
Include the new QingHai protocol module, protocol parsing architecture updates, and documentation for multi-protocol chain parsing and shared buffer handling.
Refresh LDI and QingHai protocol alignment, add the companion test tool, and keep the project configuration in sync with the new workflow.
Include the remaining factory test cleanup so the pushed repository matches the local workspace state.
- dev_display: commit_frame加osKernelLock保护,消除与scan_task的帧竞争 - app_render: _measure_text_box支持word_wrap模拟,自适应字号选择更准确 - app_ldi_device/vms_ctrl: 行槽位固定16px高度,多行更新不再互相覆盖 - app_factory_test: 老化循环补commit_frame修复卡画面,动态读取module_code - app_test: 斜扫逻辑提取为可复用函数,加入出厂测试流程 - dev_eth: 默认IP改为192.168.1.100/24
- 添加一键烧录脚本 tool/flash_all.sh,支持 Bootloader/Recovery/Project-STD 三固件联合烧录 - 修复中断向量表偏移地址为 0x40000 以适配 bootloader 启动 - 更新 EIDE 工程配置,替换 ProtocolParser_QingHai 为 ldi 模块 - 上传器切换为 Custom 脚本模式 - 工作区添加 Bootloader/Recovery 关联项目
将 ucHeap 回退为 36KB@SRAM,收紧 RB/DMA 与协议 queue 深度,重构 1.577 驱动配置方式,并整理多协议与 LDI-IAP 解耦文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
- 新增 ProtocolParser_SiChuang_{ETC,MTC,Overload} 三模块(RS232+RS485
双通道绑定,链式 probe,静态队列),语义对齐裸机参考 9K1F212701:
ETC 0x0D 定界变长帧 + 心跳/灯控/亮度;MTC '{' 家族无 BCC 双长度 +
0A 46 查询 + 7B 40~45;治超 FF+len+BCC 变长数据 + 0x80 全屏/8 行 +
A0/B6/B9/B8 查询应答
- 新增 app_uart_baud + pl_uart_set_baud:DIP1 选择 9600/115200,
RS232/RS485 同步重配
- LDI/IAP 配置解耦(doc/07 方案 A 落地):抽出 app_board_net_cfg
板级配置模块(Sector1 布局唯一归属 + static_assert 锁定),
删除 app_iap_cfg.{c,h} 与死代码 Device/Inc/config_info.h
- tool/flash_all.sh 默认烧后擦除 Sector1(规避 Bootloader 条件 D
CRC 失配「永远进 Recovery」陷阱),新增 --keep-config
- 出厂检测 TEST 键修复:业务数据到达改为中止标志机制,不再销毁
monitor 任务
- 文档同步:doc/05 帧头表/兼容矩阵/queue 深度、doc/06-04 内存账、
doc/07 状态、doc/CLAUDE.md
构建:make -B -j8 通过,零新增告警,text 328280 / bss 126396,
SRAM ≈95.7% 未超上限。
- MTC '{' 帧族改 '}' 定界变长解析(修复 {3 1 1234 } 3 } 单行乱码:
旧定长 probe 跨帧拼凑 20B 认领含垃圾字节);字段偏移按变长重算
- MTC '{4}' 全屏改为整屏 word_wrap 渲染(原 16B/行切分单行超宽被裁)
- ETC 心跳功能停用(任务 #if 0 + 创建处注释;0A 50 解析保留;
黄闪 10s 自动关闭随心跳 tick 一并失效,须 0A 39 显式关)
- 代码注释净化:清除 14 个文件约 75 处对原参考工程的引用,
技术事实保留;移植对照说明仅保留于 doc/
- 新增 doc/08_协议模块接入规则:通用规则与模块骨架、串口接入、
UDP/TCP 接入、接入检查清单;更新 doc/CLAUDE.md 文档地图
- doc/05、doc/06-04 同步修订
- 附带:1-577 模组布局 3×3→1×1、EIDE uploader Custom→JLink
- ProtocolParser_ShanDong:'1'~'5','7','8' 七命令(全屏单色/版本/单行/全屏可编辑/清屏/亮度/外设),双通道绑定,与青海/MTC '{' 帧族互斥纪律
- app_default_display 注册制默认显示界面(山东上电画面「山东省 高速公路 欢迎您」)
- dev_display_fill 起点越界下溢修复(写穿 CCMRAM 致 HardFault)
- 文本常量改 UTF-8 字面量;青海语音补 UTF8ToGBK 转换
- tool/ 出厂测试工具迁出(保留 flash_all.sh)
- 文档同步:doc/05、doc/06-04、doc/08、doc/09、CLAUDE.md
- 新增 ProtocolParser_GuiZhou 8 文件(probe/parse/cmd/voice),13 条命令
按《贵州高速费显协议》实现,经 initcall 自注册进 dispatch,文档 doc/10
- Makefile/EIDE 工程新增贵州源集与头路径;Makefile 定义 STD_ALL_PROTO
允许全协议共存开发构建
- 青海/山东/四川MTC 同构 '{' 帧族(青海/山东/贵州/四川MTC)加链接期
互斥守卫 g_brace_proto_guard:非 STD_ALL_PROTO 构建编入多个 '{' 族协议
即 multiple definition 报错,防帧头冲突静默错配(doc/08 帧头冲突纪律)
- 0x03 上报固件状态:version 为 ASCII 字符串,上位机按 word 大端显示约定, memcpy 会导致每 4 字节一组反转乱码;改为逐 word 大端构造(与 0x01 IP 构造同构),与 Recovery 侧 cmd.c 0x03 修复保持一致 - 命令表查表越界:cmd 为 uint8_t 可达 255,新增 IAP_CMD_COUNT 宏 + static_assert 锁定表条目数,iap_handle_task 先校验再索引,越界帧静默丢弃 - 4B02 强制改 IP:移除 tcpip_callback 即时改 netif 路径,统一为「仅持久化 Sector1、重启生效」(与 LDI 0AH / Recovery IAP 一致),避免与 LwIP 线程 竞争 netif 状态
- 新增 app_board_net_cfg_fw_version_update():只改 app_info.version 并重算 config_crc,绝不触碰 size/crc32/net_cfg/update_sta(size/crc32 由 Recovery 升级流程写入,改动会触发 Bootloader 条件 D 判 App 损坏);空/损坏扇区完整 初始化自愈、升级中间态拒绝、同值跳过擦写(避免每次上电磨损 Sector1) - app_boot init_task 在 sw_board_init 之后调用落库(写前喂狗,16KB 扇区 擦除数百 ms),失败静默降级不阻断启动;PROGRAM_CODE 定义收拢于 app_boot.h - app_board_net_cfg_update 语义修订:升级中间态(update_sta != updated)由 「拒绝覆盖」改为「仅放行 net_cfg 字段更新、update_sta/app_info 原样保留」, 使 0AH/4B02 改 IP 在升级中间态同样生效,Bootloader 条件 D 判定不受影响 - RTT 诊断日志:版本落库各分支(拒绝/空扇区重建/同值跳过/擦写失败/成功) 打印 [fwver] 观察点,低开销仅异常与首写路径输出
- pl_uart:DMA circular 覆盖 2×block 缓冲,HT/TC 中断各冲刷半块、IDLE 冲刷 块内残余;recv_total/posted 累计计数保证增量不重不漏(队列满不推进 posted, 下次事件合并补发);ISR 经 rx_cb(data,len) 通知段起点与段长 - 新增 pl_uart_rx_msg_t(块号+块内偏移+长度),RS232/RS485 通道 ISR 回调 把段指针换算为消息经 rx_queue(深度 2)交给任务,任务按块号拷贝入 RB - dev_rs232/rs485 缓冲 640→2×640B(.bss 静态,SRAM 账同步 doc/06); 长帧不再受单块 640B 截断,短帧仍由 IDLE 低延迟出队
- TCP/UDP 连接通道实例由连接任务栈上分配改为文件级 static 单实例:连接 任务退出后旧通知不再悬垂(UAF 根治);TCP Server 由「每客户端一 conn 任务」改为串行单客户端服务循环 - channel_send 返回 int32_t 并增加通道回验(ch 必须仍注册在案且指针一致), 防御任务退出后栈实例悬垂的最后一环 - 帧分发:READY/SKIP 时 frame_len 超静态缓冲上限(1044B)判越界不消费, 防 rb_read 写穿;帧头匹配但数据未到齐改置 any_wait(旧逻辑空转活锁); any_wait 增加 500ms 时间预算,超时无新字节强制 skip 1 字节重同步防挂死 - UDP 发现口固定 10011(宏 LDI_DISCOVERY_PORT 收拢至 app_ldi.h),移除 app_udp_set_port 修改接口
- ldi_ctx_init 重写为方案 X(doc/07 §12)三分支:
① Sector1 有效且非升级中间态 → 网络字段以 Sector1.net_cfg 为准(修复
缺陷 B:device_port 不再被编译期默认覆盖),非网络字段沿用 W25,
比对不一致时刷新 W25 镜像自愈(缺陷 A/C)
② Sector1 空/损坏/中间态 + W25 有效 → 以 W25 为准并回写 Sector1
③ 双源皆无 → 编译期默认 + W25 落镜像
W25 侧新增 module_count 钳制,防 flash 记录越界读
- LDI 命令层新增 _ldi_data_len 帧长反推校验:0AH/1BH/21H 等命令在解析前
校验 DATA 域下限,不足回标准错误应答;C0H/E0H 服务端应答不足静默丢弃;
device_num 钳制 ≤ LDI_DEV_TYPE_COUNT 防 VLA 被恶意撑爆
- dev_eth 出厂默认 IP 改为 192.168.114.200/24(与 Bootloader/Recovery 出厂
默认统一)
- app_render:line_widths[32] 多处「先写后判」越界写防护(≥33 行文本截断 终止),行宽读取守卫 _line_width_get 钳制越界 line_idx - dev_display:fill/draw_bitmap 判界与索引中间值改 32 位运算,防 uint16 回绕绕过判界写穿 pixel_map(CCMRAM HardFault) - dev_w25qxx:新增 SPI 互斥锁(osMutex)串行化 read/write/erase,多协议 任务并发读字库不再交错 SPI 帧;错误路径统一 goto 出清 CS - text_cvt:GBK/UTF8/Unicode 转换族全面加输入/输出越界防护(高字节残留 截断、输出容量检查),修正乱码注释 - ah_mqtt:去掉 cmd_display 预转 GBK,避免 GBK 字节被 FONT_ENC_UTF8 路径 二次解析双重转换乱码 - 山东默认显示改三行居中;四川治超亮度 0 档钳制为 1(防 OE 恒高整屏全灭)
- doc/05 架构:帧分发 500ms 预算/any_overrun 语义、通道静态化回验
- doc/06 内存账:UART 乒乓双缓冲 640→2×640B SRAM 增量、W25 互斥锁
- doc/07 解耦方案:§12 方案 X(Sector1 真源 + W25 镜像)、§13
fw_version_update 落库、升级中间态仅放行 net_cfg 修订(2026-08-18)
- doc/08 接入规则:'{' 帧族互斥守卫与贵州协议帧头冲突纪律
- doc/09 山东:默认显示三行化与 0 档亮度钳制备注
- CLAUDE.md:烧录纪律、版本落库与 RTT 观察点、内存布局更新
Render 引擎字库组织段更新为新 API(_packed_glyph_bytes/_glyph_width_px/ _find_region/_flash_addr + 芯片配置表);协议模块接入规则补充 MSL 收录置末 约定(对齐 .eide 顺序)。
合并 phtty/yy 引入 dev_display_old_p20.c(旧硬件 2×2 驱动,与 dev_display_p20.c 同名符号 dev_display_p20_get/init)。该文件调用 pl_hub75_set_row——本地分支在 merge 前已将该 API 重命名为 pl_hub75_Decoder_set_row,且 Makefile 从不编译 p20 驱动,故 make 不受影响; EIDE 源列表却编译它,导致 implicit declaration 编译错误。 修复:.eide/eide.yml excludeList 增加 dev_display_old_p20.c(与既有 dev_display_p20.c 排除一致、与 Makefile 对齐),MSL 保持收录不排除。 文档:doc/CLAUDE.md 同步 p20/old_p20 选编口径。
phtty/yy 的测试用链接脚本把 FLASH 改到 0x08000000/1024K,与 main.c SCB->VTOR = FLASH_BASE | 0x40000 错位,导致烧录后向量表错位、中断全乱 (屏幕闪烁/网络失效/协议失效),且 hex 从 0x08000000 起写覆盖 Bootloader。 恢复 FLASH ORIGIN=0x08040000 LENGTH=768K。
回退 merge 引入的 send_light_adjust(每 1s 向 RS485 广播亮度等级): - 单卡场景无接收端,广播只与上位机 MTC 帧争抢半双工总线 → 帧碰撞 → 屏幕间歇刷新; - 多卡场景下 MSL_CMD_FILL 与 MSL_CMD_LIGHTLEVEL 命令码重号(0x03)导致误执行全屏填充。 保留 app_light_sensor_get 供 MSL 模块链接(app_msl_cmd.c 引用)。
- 移除 merge 引入的 MSL virtualFolder 条目与 Application/Inc/MSL include - 移除 dev_display_p20.c / dev_display_old_p20.c 与 ah_mqtt 排除项 - 保留用户偏好:Debug 优化 level-fast、uploader Custom
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
背景
本 PR 汇总 yy 分支相对 phtty/yy 的一批功能与稳定性改动,核心三件事:
'{'帧头冲突加链接期互斥守卫;app_info.version,与 Recovery 升级流程的 size/crc32 写入职责分离,供 IAP 0x03 上报;另含一批稳定性修复:TCP/UDP 通道实例静态化(UAF 根治)、帧分发活锁/越界修复、UART DMA 乒乓双缓冲、LDI 配置双源方案 X、渲染/显示/存储/编码转换越界防护。
逐条改动(8 个 commit)
758b41c贵州协议接入:新增 app_gz_proto 8 文件 + doc/10;Makefile/EIDE 编入贵州源集并定义 STD_ALL_PROTO;青海/山东/四川MTC 加g_brace_proto_guard链接期互斥守卫(非 STD_ALL_PROTO 构建编入多个'{'族协议即报 multiple definition)3b25b71IAP 修复:0x03 版本逐 word 大端构造;IAP_CMD_COUNT + static_assert 命令表越界防护;4B02 改 IP 由即时改 netif 统一为「持久化 Sector1、重启生效」41f6e84PROGRAM_CODE 落库:新增app_board_net_cfg_fw_version_update()(只动 version + 重算 CRC,绝不触碰 size/crc32/net_cfg/update_sta;空扇区自愈、升级中间态拒绝、同值跳过擦写);init_task 在 sw_board_init 后调用(写前喂狗);app_board_net_cfg_update 中间态语义由「拒绝覆盖」改为「仅放行 net_cfg 更新」;RTT[fwver]诊断日志e47e141UART 乒乓双缓冲:pl_uart 由 DMA 空闲中断改为 circular 2×block 乒乓(HT/TC/IDLE 分段通知,recv_total/posted 增量不重不漏);RS232/RS485 通道适配 rx_queue 消息;缓冲 640→2×640B7d596d4通道 UAF 根治 + 帧分发修复:TCP/UDP 连接通道实例文件级 static 单实例、TCP Server 串行单客户端循环;channel_send 返回 int32_t 并做通道回验;帧分发 frame_len 越界钳制 + any_wait 500ms 时间预算防活锁/挂死;UDP 发现口固定 10011(LDI_DISCOVERY_PORT)a117441LDI 配置双源方案 X:ldi_ctx_init 三分支(Sector1 真源优先 + W25 镜像自愈/回写);LDI 命令层 _ldi_data_len 帧长校验 + device_num 钳制 + 标准错误应答;dev_eth 出厂默认 IP 对齐 192.168.114.200a2b7f78渲染/显示/存储/编码修复:app_render line_widths[32] 越界防护;dev_display 32 位判界防 uint16 回绕;dev_w25qxx SPI 互斥锁串行化;text_cvt 转换族越界安全;ah_mqtt 双重转换乱码修复;山东默认显示三行;治超亮度 0 档钳制27c3715文档同步:doc/05/06/07/08/09 与 CLAUDE.md 对齐上述改动验证方式
make -j8(GCC Debug,全协议 STD_ALL_PROTO 构建)通过:text 253840 / data 1620 / bss 126408[fwver]日志点:版本首写/同值跳过/升级中间态拒绝各分支可观察烧录纪律提示
任何烧录器(J-Link/OpenOCD/EIDE)烧完主固件后必须擦除 Sector1(0x08004000~0x08007FFF)恢复出厂态:Sector1 非空且
app_info.size/crc32与实机固件不一致会触发 Bootloader 条件 D 判 App 损坏 → 设备永远进 Recovery。tool/flash_all.sh已默认执行该纪律。