基于炬芯ATS308X的离线日志存储导出功能实现

没有u盘就检测cdc 串口导出,有U盘就U盘方式导出

ATS3089P 离线日志存储与 Windows USB 导出

设备默认开启日志采集,不需要连接电脑。运行中的串口文本先进入 RAM,再由后台线程写入 NAND,日志区满后循环覆盖最旧记录。插 USB 后可使用随附 Windows 工具一键导出 TXT,反馈给研发。

本版固件为 `outdir/ats3089p_dev_watch/_firmware/ats3089p_dev_watch_261014_offline_log_v3.fw`,调试包文件名后缀为 `_offline_log_v3_debug.fw`。烧录后用普通 UART 输入 `app log status`,应看到 `version=261014-v3 ready=1 enabled=1 usb_auto=1 auto_boot=1`,各字段之间还会打印容量等信息。首次升级默认开启自动 USB 检测,插线后提供 CDC 模拟串口,电脑直接请求最新日志。

1. Python / PowerShell 命令导出

  1. 将新固件烧入开发板,正常使用设备,复现问题。

  2. 设备开机后,用 USB **数据线**连接 Windows。

  3. 打开 PowerShell,进入 SDK 根目录 ``,运行下面一条命令。

  4. 成功后命令会显示电脑保存路径,把该 TXT 文件发给研发。

```powershell

powershell -NoProfile -ExecutionPolicy Bypass -File .\application\bt_watch\tools\offline_log\export_logs.ps1 -OutputDir D:\logs

```

脚本优先调用已打包的 `OfflineLogCLI.exe`,这种方式无需安装 Python;找不到 EXE 时调用 Python 源码。不传 `-OutputDir` 时保存到当前工作目录的 `logs` 子目录。文件名包含导出时间,不覆盖已有文件,无需接普通 UART 串口板。

默认 `auto` 模式先扫描已经枚举且包含有效 `OFFLOG.TXT/OFFLOG.CRC` 的 U 盘;这样不需要 CDC,也不需要先发送 `app udisk on`。只有找不到有效 U 盘时,才等待 CDC 并请求本次实时导出。v3 固件还支持无盘时自动发送 `app log usb <编号>`,设备生成带编号快照并切换为 U 盘。旧版固件使用新工具时,仍需先用普通 UART 执行旧的 USB 控制命令。

也可以直接使用 Python,推荐显式指定电脑保存目录:

```powershell

python .\application\bt_watch\tools\offline_log\offline_log_cli.py --mode auto --output-dir D:\logs

```

Python 方式要求 Python 3.8 或以上。USB 盘导出只需标准库;使用 USB CDC 时先安装串口依赖:`python -m pip install pyserial`。`python` 命令不可用时可尝试 Windows 已安装的 `py -3`,或者使用上面的独立 EXE / PowerShell 方式。

手动指定盘符或者 COM 口的完整例子:

```powershell

powershell -NoProfile -ExecutionPolicy Bypass -File .\application\bt_watch\tools\offline_log\export_logs.ps1 -Mode usb -Drive E:\ -OutputDir D:\logs

powershell -NoProfile -ExecutionPolicy Bypass -File .\application\bt_watch\tools\offline_log\export_logs.ps1 -Mode cdc -Port COM8 -OutputDir D:\logs

python .\application\bt_watch\tools\offline_log\offline_log_cli.py --mode usb --drive E:\ --output-dir D:\logs

python .\application\bt_watch\tools\offline_log\offline_log_cli.py --mode cdc --port COM8 --output-dir D:\logs

```

路径带空格或中文时,用双引号包住参数,例如 `-OutputDir "D:\客户反馈\设备 A"` 或 `--output-dir "D:\客户反馈\设备 A"`。退出码 0 表示成功;失败返回非 0。执行中按 `Ctrl+C` 取消,临时文件不会作为成功日志保存。

CDC 和 USB 盘两条路径均验证长度与 CRC32,通过后才发布正式 TXT。校验失败、取消、USB 断开时不会把半截内容显示为导出成功。导出结果为快照生成时已采集到的日志;传输过程中继续产生的日志留待下次导出。

`usb` 模式是保留的 U 盘快照读取方式,需要设备已处于 U 盘模式。设备进入 U 盘模式前自动生成根目录 `OFFLOG.TXT` 和 `OFFLOG.CRC`,也可以手动复制这两个文件一起反馈。

快照只反映**进入此次 U 盘模式时**的日志。设备保持 U 盘连接期间,后台日志仍可保存在独立日志分区;需要更新快照时退出并重新进入 U 盘模式。不要在 PC 已接管 U 盘时从板端写快照。

如果 USB 盘被 Windows 识别为固定磁盘,用 `-Mode usb -Drive E:\` / `--mode usb --drive E:\` 指定目标盘根目录。默认自动模式仅请求当前 CDC 日志;找不到 CDC 时会报错,不会把磁盘旧快照当成最新日志。明确指定 `Drive` 表示读取该盘快照,明确指定 `Port` 表示连接该 COM;不要同时指定两个目标。多块开发板同时连接时,请指定 `-Port COM8`。

已附带的 `outdir/offline_log_tool/dist/OfflineLogExport.exe` 窗口为可选入口,使用命令行即可完成本版导出。

2. 普通 UART 控制命令

沿用现有普通串口参数,在看到 `uart:~$` 的串口助手中发送命令,末尾加回车。`app log` 与录音、查找等原指令共存。

| 命令 | 作用 |

| --- | --- |

| `app log status` | 显示固件版本、保存开关、已保存容量、队列和错误计数 |

| `app log on` | 开启采集并保存开关,断电后仍保持 |

| `app log off` | 提交已有队列后关闭普通采集,历史日志保留 |

| `app log flush` | 立即提交当前 RAM 队列,正常最长等待 3 秒 |

| `app log save` | 在板端持有 FAT 时生成 `OFFLOG.TXT` / `OFFLOG.CRC` |

| `app log usb 编号` | 无盘时生成带请求编号的 U 盘快照,然后自动切换 MSC,供 PC 读取 `OFFLOG.TXT/OFFLOG.CRC` |

| `app log export 编号` | 将稳定快照经已开启的 USB CDC 发到 PC |

| `app log cancel 编号` | 取消当前 CDC 导出;指定编号时只取消匹配的请求 |

| `app log clear` | 删除本功能的持久日志和命令前已排队内容;不删除录音文件 |

| `app usbserial auto on` | 开启自动 USB 检测,并保存设置供下次开机使用 |

| `app usbserial auto off` | 关闭自动检测;当前自动 CDC 会话一并停止,保存设置 |

| `app usbserial status` | 查看实际 CDC 枚举状态、自动监听和开机设置 |

`clear` 用于研发主动清理,会丢失旧问题记录,客户反馈前请勿执行。它不删除此前导出到电脑或 U 盘的 TXT 快照;后续进入 U 盘会生成新快照。关闭普通采集后,独立异常尾部仍会尽力保留,便于故障诊断。

状态例子中的字段含义:

```text

offline-log: version=261014-v3 ret=0 ready=1 enabled=1 bytes=... pages=...

queued=... dropped=... errors=... last_error=0 next_seq=... boot_id=...

offset=0x4d80000 export=0 id=... export_error=0 usb_auto=1 auto_boot=1

```

  • `ready=1`:启动扫描完成。刚开机短时间 `ready=0` 可以稍后重试。

  • `bytes/pages`:已验证有效的日志文本字节数 / 记录数,记录最多 256 个。

  • `queued`:尚在 RAM 中等待提交的字节数。

  • `dropped`:本次启动因队列满丢弃的新日志字节数;不是旧记录正常循环覆盖次数。

  • `errors/last_error`:本次启动存储或配置错误次数 / 最近错误码。成功提交后 `last_error` 恢复 0。

  • `boot_id`:从历史日志恢复后递增的启动标识,不是日期。

  • `export/id/export_error`:CDC 导出状态、请求编号和最后结果,0 表示成功。

  • `usb_auto=1`:后台自动检测已开启,不代表此时已连接电脑;`auto_boot=1` 表示下次开机仍自动检测。

导出文本末尾还包含 `offline-log snapshot` 元信息,记录导出时启动编号、运行毫秒数、丢日志及存储错误计数,便于研发判断完整性。

3. USB CDC 直接导出

3.1 自动连接及 USB 模式切换

v2 默认后台检测插线;即使本板外置充电电路导致 `PMU_DC5V=0`,也通过 USB DP/DM 检测主机。未连接电脑时不建立 CDC,会约每秒进行一次短探测;插线并发现主机后启动 CDC。Windows 工具等待 COM 出现,再发送导出命令。物理拔线后自动关闭本次会话,并继续等待下次插线。电脑休眠造成的 USB SUSPEND 保留会话,不当作物理拔线。

一个物理 USB 控制器同时只能使用一种设备类别。用户显式开启 U 盘或 USB 声卡时,原有模式选择优先;自动检测不会抢占它们。需要从这些模式返回自动日志导出时,在普通 UART 执行:

```text

app udisk off

app usbaudio off

app usbserial auto on

```

只需关闭实际正在使用的模式。拔插 USB 后重新运行 PC 导出命令即可。设备关机、仅充电线、串口被其他程序占用,或仍处于 U 盘/声卡模式时,电脑不能通过不存在的 CDC 通道发命令;工具会给出对应提示。

3.2 手动控制兼容

已有 CDC 录音导出的手动方式继续适用。普通 UART 可执行:

```text

app usbserial on

app usbserial status

```

`app usbserial on/off` 用于手动启停当前 CDC;显式手动启停会撤销当前自动等待。自动开机偏好独立保存在 NVRAM 的 `USB_SERIAL_AUTO` 项,旧 `app usbserial boot on/off` 控制原 `USB_SERIAL_BOOT` 项。自动偏好开启时优先启动后台监听;关闭自动偏好后按旧开机设置处理。需要恢复原来的无 CDC 开机行为时,执行 `app usbserial auto off` 和 `app usbserial boot off`,再重启。

在 Windows 执行 `--mode cdc --port COM8` 的上述 Python 命令,或 `-Mode cdc -Port COM8` 的 PowerShell 命令。不指定 COM 时会自动发现 VID `10D6` / PID `B00A` 的设备;多块板同时连接时指定目标 COM。先关闭占用该 COM 的串口助手。工具自动发送带请求编号的命令、校验并保存文本。

研发可运行独立命令行程序:

```text

OfflineLogCLI.exe --mode auto --output-dir D:\logs

OfflineLogCLI.exe --mode usb --drive E:\ --output-dir D:\logs

OfflineLogCLI.exe --mode cdc --port COM8 --output-dir D:\logs

```

这两种导出均使用开发板 USB 接口。普通 UART 只用于方便研发控制,CDC 导出正文不会从普通 UART 传输。

3.3 自动检测与待机功耗

目前板级深睡入口没有可用的 USB 或普通定时器唤醒源,且外置充电电路的 DC5V 状态不能可靠表示插线。为保证客户设备插 USB 后可被发现,自动监听持有 `PARTIAL_WAKE_LOCK`,允许显示休眠,但会阻止进入最深睡眠。监听开启期间存在待机功耗代价,需要实板测量;本版没有修改显示或 NTC 的休眠策略。

不需要随时插 USB 导出时,可执行 `app usbserial auto off` 关闭监听并释放其锁;若当前是手动 CDC 会话,再执行 `app usbserial off`。正常日志循环保存继续工作。以后执行 `app usbserial auto on` 恢复自动导出。手动 `app usbserial on` 沿用原 FULL 锁行为,不作为低功耗自动监听方式。

4. 存储原理和异常恢复

原 NAND 分区表已有 1 MB `runtimelog`,本次将该分区内部划分为两个互不重叠区域,**不调整分区表或录音 FAT 容量**:

| 区域 | 地址 | 大小 | 用途 |

| --- | --- | --- | --- |

| SDK ACTLOG | `0x4D00000` | 512 KB | 保留原压缩运行日志机制 |

| 离线文本日志 | `0x4D80000` | 512 KB | 新增文本循环存储 |

| 录音 U 盘 | `0x4E00000` 起 | 原配置 | 录音文件及导出快照 |

离线区有 256 个 2048 字节记录,每条有 32 字节头和最多 2016 字节正文,因此纯日志最大约 **504 KB**;导出还追加少量状态信息,总长度不超过 512 KB。能保留多久取决于日志输出量,不按固定天数保存。

流程如下:

```text

printk / printf / 控制台输出

↓ 短临界区复制,不等待存储

16KB RAM 队列

↓ 后台线程:满记录或等待约5秒

2048B记录 → NAND写入 → flush → 读回校验

↓ 成功后才移除队列原文

512KB循环日志区

↓ 请求导出:刷盘并复制有序稳定快照

PSRAM 快照

├─ USB CDC:长度正文 + CRC32结束帧 → PC

└─ 进入MSC前:OFFLOG.TXT + OFFLOG.CRC → PC

```

日志页头包含格式版本、序号、启动编号、运行时间、长度和 CRC32。重启扫描只接收完整有效记录,跳过损坏页,不因单页错误清空全部历史。记录序号支持 32 位回绕。写入失败保留队列原文并限速重试,状态可查询;队列满时丢弃新增日志并计数。

日志采集覆盖原 DMA `printk` 输出,以及切到 CPU 输出后的 `printk` 路径;经这些路径输出的系统、应用和 Shell 文本均能收集。没有实际输出到这些路径的内部事件不会自动补日志,ROM 深睡输出也不在采集范围内。文本保留原始字节,可能包含 ANSI 颜色控制符。启动分隔行记录固件版本和 `BOOT` 标识;文件名时间来自 PC,设备没有据此获得实时时钟。

异常回调只切换到独立 **4KB 内部 SRAM** 尾部缓冲,不在故障现场等待 NAND 或文件锁,原 ACTLOG / coredump / ramdump 流程继续执行。再次启动时,若 SRAM 数据仍保留且元信息有效,会分块恢复到日志队列;确认刷盘成功后才清除异常 bank,失败保留重试。恢复中再次复位时,可能重复已经保存的前缀,优先保留异常内容。

正常关机 / 重启在撤销供电保持前,限时等待最多 2 秒提交已有队列。**突然断电仍可能丢失尚未提交的 RAM 日志**;异常 SRAM 尾部也不保证跨彻底断电或清 RAM 的启动过程保存。本功能提供运行文本和尽力恢复的异常尾部,导出 TXT 不包含完整二进制内存转储。

5. 开发入口和扩展方法

重要新增或修改位置按约定添加 `//zk+` / `//zk+-` 和中文注解;Python、CMake、配置使用 `#zk+` / `#zk+-`。

| 位置 | 作用 |

| --- | --- |

| `src/main/offline_log.c/.h` | 队列、分区扫描、循环记录、开关、刷盘、清理、快照 |

| `src/main/offline_log_panic.c/.h` | 异常 SRAM bank、打印分流、复位恢复 |

| `src/main/offline_log_export.c/.h` | CDC 后台导出、取消、U 盘快照与状态尾部 |

| `src/main/system_app_shell.c` | `app log` 注册和参数检查 |

| `src/main/system_app_main.c` | 正常开机启动自动 CDC 监听,尊重明确选择的 U 盘启动模式 |

| `src/main/usb_serial_runtime.c` | USB 类别所有权、自动探测、插拔处理、可靠流传输和唤醒锁 |

| `../../framework/system/hotplug/hotplug_usb.c` | 自动探测结束的 PHY 清理,成功后才释放热插拔保留 |

| `src/card_reader/card_reader_main.c` | FAT 交给 MSC 前自动生成快照 |

| `../../zephyr/subsys/trace/printk_dma.c`、`../../zephyr/lib/os/printk.c` | 打印采集入口 |

| `../../framework/system/act_log/act_log_flash_buffer.c` | 限制 SDK ACTLOG 只写前半区 |

| `../../framework/system/sys_power_off.c` | 正常关机和重启的有界同步 |

| `tools/offline_log/` | 中文 GUI、CLI、协议、EXE 构建和测试 |

`CONFIG_APP_OFFLINE_LOG=y` 默认随本板开启。调整 RAM 容量、提交周期见 `offline_log.h`;调整 Flash 区域时必须同步原 ACTLOG 的边界,并确认 NAND 分区和记录对齐。添加诊断日志仍按现有 `printk` / 系统日志方法输出,采集层不要打印自己的日志或在中断中执行 Flash/USB 操作。

5.1 上位机代码文件及职责

上位机源码统一位于 **`application/bt_watch/tools/offline_log/`**。下面链接相对于本说明文件;EXE 在 `outdir/offline_log_tool/dist/`,它们由 Python 源码打包生成。

| 文件 | 代码职责及修改入口 |

| --- | --- |

| offline_log_protocol.py(tools/offline_log/offline_log_protocol.py) | 公共导出实现,CLI 和 GUI 都调用它。包括 USB 设备发现、CDC 枚举等待、目标选择、命令发送、帧解析、长度/CRC32 校验、取消和最终文件发布 |

| offline_log_cli.py(tools/offline_log/offline_log_cli.py) | 命令行 `main()`:解析 `--mode/--drive/--port/--output-dir`,调用公共导出函数,中文打印过程及结果,返回退出码 |

| export_logs.ps1(tools/offline_log/export_logs.ps1) | PowerShell 入口:将 `-Mode/-Drive/-Port/-OutputDir` 转换成 CLI 参数,优先运行 EXE,找不到 EXE 时运行 Python,保留退出码和含空格路径 |

| offline_log_gui.py(tools/offline_log/offline_log_gui.py) | 可选 Tkinter 窗口。`ExportWindow` 管理设备选择、输出目录、后台线程、进度和取消;`AdaptiveMessage` 负责提示自动换行、增高和超长内容滚动 |

| 启动日志导出.bat(tools/offline_log/启动日志导出.bat) | 双击入口,启动 GUI EXE;开发环境可使用源码入口 |

| build_windows.ps1(tools/offline_log/build_windows.ps1) | 在独立 venv 中运行 PyInstaller,生成 `OfflineLogCLI.exe` 和 `OfflineLogExport.exe`,并复制中文使用说明、PowerShell 和 BAT |

| requirements-build.txt(tools/offline_log/requirements-build.txt) | EXE 构建依赖:pyserial、PyInstaller。只运行 Python CDC 导出时安装 pyserial 即可 |

| test_offline_log_protocol.py(tools/offline_log/test_offline_log_protocol.py) | 协议与导出单元测试:真实导出代码搭配模拟串口/磁盘、拆包、错误 CRC、断流、超时、取消、旧快照和多设备目标选择 |

| test_offline_log_gui.py(tools/offline_log/test_offline_log_gui.py) | 窗口提示布局测试:长中文错误完整可读、窗口缩放、滚动及手选目标保留 |

| test_windows_package.py(tools/offline_log/test_windows_package.py) | 实际 EXE / PowerShell 包验证:帮助、中文及带空格目录、成功导出、坏 CRC 拒绝、Python 回退及可选 GUI 启动 |

| README.md(tools/offline_log/README.md) | 可随上位机工具发给客户的中文使用说明,打包时复制为 `使用说明.md` |

5.2 公共协议模块的主要函数

维护通信和文件保存时,重点阅读 `offline_log_protocol.py`:

| 函数 / 类 | 处理内容 |

| --- | --- |

| `export_auto(...)` | 两个界面的统一入口。默认等待 CDC;显式 USB 模式/盘目录读取快照。拒绝冲突目标,不在实时失败后回退旧快照 |

| `cdc_ports()` / `all_serial_ports()` | 通过 pyserial 枚举端口;自动发现匹配本板 VID `10D6` / PID `B00A`,手选 COM 可使用完整串口列表 |

| `wait_cdc_port(...)` | 最长 10 秒等待指定目标出现,支持取消;多块板拒绝猜测,不改变明确选定的 COM |

| `export_cdc(...)` | 创建非零 32 位随机请求编号,发送 `app log export`,接收本次快照;失败/取消时尽力发送对应 `app log cancel` |

| `CDCReader.begin/copy_payload/end` | 跳过普通控制台输出,匹配请求编号;按声明长度读取原始正文;验证结束帧编号、长度及 CRC32 |

| `removable_directories()` | 通过 Windows API 获取可移动卷;固定磁盘形式的设备由用户显式指定目录 |

| `inspect_snapshot()` / `newest_snapshot()` | 读取 `OFFLOG.CRC`,验证 `OFFLOG.TXT` 的长度和 CRC;仅供明确的磁盘快照导出 |

| `export_msc(...)` | 将指定快照复制到电脑,复制前后检查快照一致性,并再次验证实际复制内容 |

| `_target()` / `_finish()` / `publish_complete()` | 生成带 PC 时间的文件名;写同目录 `.part`,刷盘后发布正式 TXT,拒绝覆盖已有文件,失败清理临时文件 |

| `Snapshot` / `ExportResult` | 保存快照信息,以及成功结果的电脑路径、字节数、CRC 和传输方式 |

GUI 的后台线程使用取消事件,界面通过事件队列更新,避免文件传输阻塞窗口。CLI 的 `Ctrl+C` 返回 130;普通导出失败返回 1,成功返回 0。PowerShell 返回下层工具的实际退出码,方便工厂脚本和客服批处理判断结果。

5.3 从 PC 指令到板端日志的完整流程

```text

export_logs.ps1 / OfflineLogCLI.exe / GUI 点击导出

→ offline_log_cli.main / ExportWindow 后台线程

→ offline_log_protocol.export_auto

→ 等待 CDC COM,打开目标串口

→ export_cdc:发送 app log export <请求编号>

→ 板端 system_app_shell.c:校验参数并提交导出任务

→ offline_log_export.c:刷盘,生成本次 PSRAM 稳定快照

→ usb_serial_runtime.c:独占可靠流,经 CDC 发送帧和正文

→ CDCReader:校验编号、正文长度、CRC32

→ .part 刷盘并发布电脑 TXT,显示保存路径

```

CDC 串口在 PC 端按 `115200` 打开,这是虚拟串口的配置参数,正文经 USB 传输,不经板上普通 UART。设备帧格式如下,正文不做文本解码或换行转换:

```text

PC 请求:app log export 123\r\n

设备头:LOG,BEGIN,123,offline_log.txt,<字节数>\r\n

设备正文:精确 <字节数> 个原始字节

设备尾:\r\nLOG,END,123,<字节数>,<8位大写十六进制CRC32>\r\n

开始前失败:LOG,ERROR,123,<负错误码>\r\n

PC 取消:app log cancel 123\r\n

```

`123` 是示例请求编号;实际每次导出生成新编号,范围 1~4294967295。CRC32 使用标准 IEEE 算法,与 Python `zlib.crc32` 一致。按长度读取可以允许正文出现 `LOG,END` 字样,不会误判为结束。板端快照复制完成后从 PSRAM 发送,等待 USB 时继续保存新日志。

U 盘的清单格式为 `OFFLOG,1,<字节数>,<8位大写CRC32>\r\n`。修改帧或清单格式时,需同时修改板端 `offline_log_export.c`、PC 正则/解析函数及两侧测试。调整 VID/PID 时同步 `USB_VID/USB_PID`;调整最大快照容量时同步 PC 的 `MAX_LOG_BYTES` 和板端容量,并检查实际存储布局。

5.4 源码运行、重新打包和测试

以下命令从 SDK 根目录 `` 运行:

```powershell

仅运行 Python 上位机

python -m pip install pyserial

python .\application\bt_watch\tools\offline_log\offline_log_cli.py --output-dir D:\logs

运行可选窗口源码

python .\application\bt_watch\tools\offline_log\offline_log_gui.py

修改源码后重建两个 Windows EXE

powershell -NoProfile -ExecutionPolicy Bypass -File .\application\bt_watch\tools\offline_log\build_windows.ps1

协议和窗口源码测试

python -m unittest discover -s application/bt_watch/tools/offline_log -v

验证实际打包文件;--gui 同时检查窗口 EXE 启动

python application/bt_watch/tools/offline_log/test_windows_package.py --gui

```

源码修改不会自动改变已有 EXE,需重新运行打包脚本。构建环境在 `outdir/offline_log_tool/build_env`,成品在 `outdir/offline_log_tool/dist`。客户可以拿整个 `dist` 目录,使用其中 PowerShell、CLI EXE 或窗口;无需 SDK 和 Python。修改 PowerShell 参数或中文说明后也应同步发新的脚本及 `使用说明.md`。

只调整 PC 窗口、输出目录或提示文本可修改相应上位机文件;新增板端指令需修改 `system_app_shell.c`,并通过公共协议模块调用。自动进入 CDC 的逻辑在固件 `usb_serial_runtime.c` 和开机入口,电脑工具负责等待接口及发送请求,两侧缺一不可。

6. 验证和板端复测

从 SDK 根目录 `` 可运行日志核心、异常和导出软件测试以及 PC 协议测试:

```text

python application/bt_watch/tests/offline_log/run_tests.py

python application/bt_watch/tests/offline_log/run_panic_tests.py

python application/bt_watch/tests/offline_log/run_export_tests.py

python application/bt_watch/tests/usb_serial/run_auto_tests.py

python application/bt_watch/tests/usb_serial/run_core_tests.py

python application/bt_watch/tests/usb_serial/run_factory_tests.py

python -m unittest discover -s application/bt_watch/tools/offline_log -v

```

软件测试使用真实 C 模块或协议代码,模拟存储失败、断流、复位、错误校验和取消;无法代替实板 NAND 掉电测试、USB 枚举和实际使用功耗测试。

本版已完成生产编译及普通 / 调试固件打包。日志核心 930 项 ARM 断言、异常模块 4741 项 ARM 断言、导出模块 337 项 ARM 断言、自动 CDC 模块 192 项 ARM 断言及上位机 53 项协议/窗口测试通过;独立 CLI、GUI 和 PowerShell 入口已验证中文及带空格路径导出、校验失败拒绝、窗口启动和 Python 回退。生产 ELF 的原 CDC/PCM、USB Chapter 9 配置及工厂命令回归通过;第一版日志集成时的双 MIC、蓝牙通话、MP3、Find My 回归也已通过。板端真实 USB、掉电、功耗和客户使用场景仍需烧录复测。

建议烧录后依次检查:

  1. `app log status` 显示 `261014-v3`,采集、自动监听及自动开机设置开启。

  2. 不发模式切换指令,直接插 USB 数据线,运行默认 PC 命令,检查 TXT 中刚产生的唯一日志内容。再产生一条新日志,第二次导出应包含新内容。

  3. 产生录音、通话、Find My 等原功能日志;执行 `app log flush` 后正常重启,确认旧日志仍可导出。

  4. 中途拔线或取消后工具不生成不完整 TXT;重新插线可再次导出。电脑睡眠恢复后也应能继续导出。

  5. 手动 U 盘/声卡工作时自动监听不抢占;关闭该模式、重新 `app usbserial auto on` 后恢复实时导出。U 盘已接管时 `app log save` 应返回忙,不应写 FAT。

  6. 分别测试自动监听开/关时的屏幕休眠、待机电流及原音频业务,确认实际使用效果。

相关推荐
honsor1 小时前
以太网温湿度传感器原理与 Modbus TCP 组网实战,机房动环监控落地
网络·嵌入式硬件·物联网·网络协议·tcp/ip
lhbweilai1 小时前
分析FreeRTOS内核对象API的源码实现(三)
c语言·stm32·单片机
2401_862880821 小时前
Linux中断、中断子系统、内核同步互斥机制
linux·驱动开发·嵌入式硬件
姓刘的哦2 小时前
GT911触摸芯片
linux·stm32
HRTOS2 小时前
HRTOS 4.0 实测:8051 操作系统毫秒级任务延时精度测试
经验分享·单片机·51单片机
HRTOS2 小时前
HRTOS 4.0 实测:指定任务运行机制与任务切换耗时
经验分享·单片机·51单片机
HRTOS2 小时前
HRTOS 4.0 实测:事件阻塞与唤醒调度耗时测试
经验分享·单片机·51单片机
Tronlong创龙12 小时前
SBC‑TLT153 嵌入式 Linux 应用开发,交叉编译与 GDB 调试实践(上)
嵌入式硬件·嵌入式开发·硬件开发·工业控制·工业开发板
巴渝小禹13 小时前
单片机死循环delay_us()计算方法
单片机·嵌入式硬件