A9:三个执行器状态机 + 互斥
需求 §10.6 的三个序列,每路一份状态机,全部以「收尾」收口:
硬重启 EFUSE_EN↓ → 4 s(§7.4 的 3~5 s 窗口)→ EFUSE_EN↑ → 17 ms
(tON 5.1 + 缓启动斜坡 11.5)→ 等 PG
按键 按下 → 保持 T(100 ms / 2 s / 10 s)→ 松开,组合键一帧发完
EDL EDL_EN=1 → VBUS_EN=1 → 等枚举 → EDL_EN=0(SW-6 的顺序)
一个函数一步,不写 while(1):t_actuator_step() 只看时钟、推状态、返回「下次
最晚多久再来」,任务体在 app_main.c 里还是三行。放电由硬件联锁做(SR-7),
本文件里没有任何放电接口。
四条关键判断:
· 按下去的东西一定要松开 —— 正常结束 / 超时 / 出错 / abort 走同一条收尾路径,
写不进 595 就一直重试,不设放弃上限(放弃 = 电源键永久按住,而遥测正常);
· 等不到 PG 不许再断电(§10.10:PCA9555 不应答不关输出);
· PG 由 t_safety 的快照喂进来,执行器不碰 I²C ⇒ 两把锁永远不会嵌套;
· 不可重入直接拒(HAL_ERR_STATE),被拒的请求一个字节都不发。
23 个用例;21 条注错逐个跑过全部变红。其中一条第一遍没抓住 ——「等 PG 时一觉
睡满 500 ms」:测试自己掌握节奏就测不到 step 返回的睡眠时长,补了一个完全听
step 的任务循环测试。
Co-Authored-By: Claude Opus 5 <[email protected]>
这个提交包含在:
+81
-80
@@ -1,80 +1,81 @@
|
||||
# PhoneRail 宿主机构建 —— 不依赖 ESP-IDF,用来跑单元测试(CTest)。
|
||||
#
|
||||
# bash host/test.sh 配置 + 编译 + ctest
|
||||
#
|
||||
# 与 IDF 目标共享的源码只有 ../main 里的与硬件无关部分。
|
||||
# 新增一个既要上板又要被测的 .c,必须同时加进:
|
||||
# ../main/CMakeLists.txt 的 SRCS 和 下面的 PHONERAIL_CORE_SRCS
|
||||
# HAL 里新增一路实现则要同时加进:
|
||||
# ../components/phonerail_hal/CMakeLists.txt 的 SRCS(esp 那份)
|
||||
# 和下面的 PHONERAIL_HAL_SIM_SRCS(sim 那份)
|
||||
# 新增一个器件驱动则是:
|
||||
# ../components/drv/CMakeLists.txt 的 SRCS 和 下面的 PHONERAIL_DRV_SRCS
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(phonerail_host C)
|
||||
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||
add_compile_options(-Wall -Wextra -Werror)
|
||||
|
||||
set(FW_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/..)
|
||||
|
||||
# ---- 被测代码 -------------------------------------------------------------
|
||||
set(PHONERAIL_CORE_SRCS
|
||||
${FW_ROOT}/main/version.c
|
||||
${FW_ROOT}/main/rail.c
|
||||
${FW_ROOT}/main/rail_cfg.c
|
||||
${FW_ROOT}/main/sched.c
|
||||
${FW_ROOT}/main/tasks.c
|
||||
${FW_ROOT}/main/t_safety.c
|
||||
)
|
||||
|
||||
# HAL:接口在 include/,宿主机链 sim/ 的实现(esp/ 那份只有 IDF 目标编)。
|
||||
set(PHONERAIL_HAL_DIR ${FW_ROOT}/components/phonerail_hal)
|
||||
set(PHONERAIL_HAL_SIM_SRCS
|
||||
${PHONERAIL_HAL_DIR}/hal_err.c
|
||||
${PHONERAIL_HAL_DIR}/hal_i2c_acct.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_lock_sim.c
|
||||
${PHONERAIL_HAL_DIR}/sim/sim_hal.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_i2c_sim.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_gpio_sim.c
|
||||
${PHONERAIL_HAL_DIR}/sim/sim_sr595.c
|
||||
${PHONERAIL_HAL_DIR}/sim/sim_pca9555.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_pwm_sim.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_time_sim.c
|
||||
)
|
||||
|
||||
# 器件驱动:与平台无关(只经 hal_i2c_*),两个目标编的是同一份源码。
|
||||
set(PHONERAIL_DRV_DIR ${FW_ROOT}/components/drv)
|
||||
set(PHONERAIL_DRV_SRCS
|
||||
${PHONERAIL_DRV_DIR}/ina226.c
|
||||
${PHONERAIL_DRV_DIR}/dac63204.c
|
||||
${PHONERAIL_DRV_DIR}/sr595.c
|
||||
${PHONERAIL_DRV_DIR}/pca9555.c
|
||||
)
|
||||
|
||||
add_library(phonerail_core STATIC
|
||||
${PHONERAIL_CORE_SRCS} ${PHONERAIL_HAL_SIM_SRCS} ${PHONERAIL_DRV_SRCS})
|
||||
target_include_directories(phonerail_core PUBLIC
|
||||
${FW_ROOT}/main
|
||||
${PHONERAIL_HAL_DIR}/include
|
||||
${PHONERAIL_HAL_DIR}/sim
|
||||
${PHONERAIL_DRV_DIR}/include)
|
||||
|
||||
# ---- 测试框架 Unity(从 ESP-IDF v5.4 原样复制到 third_party/,与上板测试同一套)
|
||||
add_library(unity STATIC ${FW_ROOT}/third_party/unity/unity.c)
|
||||
target_include_directories(unity PUBLIC ${FW_ROOT}/third_party/unity)
|
||||
target_compile_definitions(unity PUBLIC UNITY_OUTPUT_COLOR)
|
||||
# 第三方源码不吃本工程的 -Werror
|
||||
target_compile_options(unity PRIVATE -w)
|
||||
|
||||
# ---- 测试用例:test/test_*.c 一个文件一个可执行 + 一条 ctest ---------------
|
||||
enable_testing()
|
||||
|
||||
file(GLOB PHONERAIL_TESTS ${FW_ROOT}/test/test_*.c)
|
||||
foreach(test_src ${PHONERAIL_TESTS})
|
||||
get_filename_component(test_name ${test_src} NAME_WE)
|
||||
add_executable(${test_name} ${test_src})
|
||||
target_link_libraries(${test_name} PRIVATE phonerail_core unity)
|
||||
add_test(NAME ${test_name} COMMAND ${test_name})
|
||||
endforeach()
|
||||
# PhoneRail 宿主机构建 —— 不依赖 ESP-IDF,用来跑单元测试(CTest)。
|
||||
#
|
||||
# bash host/test.sh 配置 + 编译 + ctest
|
||||
#
|
||||
# 与 IDF 目标共享的源码只有 ../main 里的与硬件无关部分。
|
||||
# 新增一个既要上板又要被测的 .c,必须同时加进:
|
||||
# ../main/CMakeLists.txt 的 SRCS 和 下面的 PHONERAIL_CORE_SRCS
|
||||
# HAL 里新增一路实现则要同时加进:
|
||||
# ../components/phonerail_hal/CMakeLists.txt 的 SRCS(esp 那份)
|
||||
# 和下面的 PHONERAIL_HAL_SIM_SRCS(sim 那份)
|
||||
# 新增一个器件驱动则是:
|
||||
# ../components/drv/CMakeLists.txt 的 SRCS 和 下面的 PHONERAIL_DRV_SRCS
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(phonerail_host C)
|
||||
|
||||
set(CMAKE_C_STANDARD 11)
|
||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||
add_compile_options(-Wall -Wextra -Werror)
|
||||
|
||||
set(FW_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/..)
|
||||
|
||||
# ---- 被测代码 -------------------------------------------------------------
|
||||
set(PHONERAIL_CORE_SRCS
|
||||
${FW_ROOT}/main/version.c
|
||||
${FW_ROOT}/main/rail.c
|
||||
${FW_ROOT}/main/rail_cfg.c
|
||||
${FW_ROOT}/main/sched.c
|
||||
${FW_ROOT}/main/tasks.c
|
||||
${FW_ROOT}/main/t_safety.c
|
||||
${FW_ROOT}/main/t_actuator.c
|
||||
)
|
||||
|
||||
# HAL:接口在 include/,宿主机链 sim/ 的实现(esp/ 那份只有 IDF 目标编)。
|
||||
set(PHONERAIL_HAL_DIR ${FW_ROOT}/components/phonerail_hal)
|
||||
set(PHONERAIL_HAL_SIM_SRCS
|
||||
${PHONERAIL_HAL_DIR}/hal_err.c
|
||||
${PHONERAIL_HAL_DIR}/hal_i2c_acct.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_lock_sim.c
|
||||
${PHONERAIL_HAL_DIR}/sim/sim_hal.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_i2c_sim.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_gpio_sim.c
|
||||
${PHONERAIL_HAL_DIR}/sim/sim_sr595.c
|
||||
${PHONERAIL_HAL_DIR}/sim/sim_pca9555.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_pwm_sim.c
|
||||
${PHONERAIL_HAL_DIR}/sim/hal_time_sim.c
|
||||
)
|
||||
|
||||
# 器件驱动:与平台无关(只经 hal_i2c_*),两个目标编的是同一份源码。
|
||||
set(PHONERAIL_DRV_DIR ${FW_ROOT}/components/drv)
|
||||
set(PHONERAIL_DRV_SRCS
|
||||
${PHONERAIL_DRV_DIR}/ina226.c
|
||||
${PHONERAIL_DRV_DIR}/dac63204.c
|
||||
${PHONERAIL_DRV_DIR}/sr595.c
|
||||
${PHONERAIL_DRV_DIR}/pca9555.c
|
||||
)
|
||||
|
||||
add_library(phonerail_core STATIC
|
||||
${PHONERAIL_CORE_SRCS} ${PHONERAIL_HAL_SIM_SRCS} ${PHONERAIL_DRV_SRCS})
|
||||
target_include_directories(phonerail_core PUBLIC
|
||||
${FW_ROOT}/main
|
||||
${PHONERAIL_HAL_DIR}/include
|
||||
${PHONERAIL_HAL_DIR}/sim
|
||||
${PHONERAIL_DRV_DIR}/include)
|
||||
|
||||
# ---- 测试框架 Unity(从 ESP-IDF v5.4 原样复制到 third_party/,与上板测试同一套)
|
||||
add_library(unity STATIC ${FW_ROOT}/third_party/unity/unity.c)
|
||||
target_include_directories(unity PUBLIC ${FW_ROOT}/third_party/unity)
|
||||
target_compile_definitions(unity PUBLIC UNITY_OUTPUT_COLOR)
|
||||
# 第三方源码不吃本工程的 -Werror
|
||||
target_compile_options(unity PRIVATE -w)
|
||||
|
||||
# ---- 测试用例:test/test_*.c 一个文件一个可执行 + 一条 ctest ---------------
|
||||
enable_testing()
|
||||
|
||||
file(GLOB PHONERAIL_TESTS ${FW_ROOT}/test/test_*.c)
|
||||
foreach(test_src ${PHONERAIL_TESTS})
|
||||
get_filename_component(test_name ${test_src} NAME_WE)
|
||||
add_executable(${test_name} ${test_src})
|
||||
target_link_libraries(${test_name} PRIVATE phonerail_core unity)
|
||||
add_test(NAME ${test_name} COMMAND ${test_name})
|
||||
endforeach()
|
||||
|
||||
在新工单中引用
屏蔽一个用户