ThreadX 配置与接入

ThreadX 增加真实内核后端,同时保留静态 factory、不可变器件接口面和可移植等待合同。它选择官方 Eclipse ThreadX GNU kernel port,不是重命名 FreeRTOS 或替换成主机调度模型。后端合同定义调用方存储、bootstrap 证明、deadline、close/join 与不支持机制。

唯一作者装配选择 backend = "threadx"。CPU/IRQ 事实仍归 SoC。tools/configure/threadx.py 将内核特定 policy 校验为独立不可变 ThreadXKernelProfileIR,不虚构 FreeRTOS idle stack、notification-slot、MPU、TrustZone 或 tickless 能力字段。CMake 持有源码图和精确依赖;类型化 IR 提供事实与策略,不建立另一源码图。

维护的选择范围

首批平台绑定接纳真实 Board 身份:

Board 身份

SoC 系列

Port

native-reference

Native

Linux GNU

stm32f407zg-qiming-v31

STM32F407

Cortex-M4 GNU

stm32f407ve-sky-qingchun

STM32F407

Cortex-M4 GNU

gd32f470zg-liangshan

GD32F470

Cortex-M4 GNU

目录名不是 Board 身份,未知 Board/SoC 组合拒绝。纯 CPU runtime 可选择显式 Native 或 Cortex-M4/M4F 事实,但不建立 SoC、板级路由或物理资格。此 ThreadX 后端仍拒绝 Cortex-M0/M0+/M3/M7/M23/M33/M55/M85,其独立 Arch/FreeRTOS 支持不受影响。

编写配置

schema = 2
board = "stm32f407_qiming_v31"
backend = "threadx"
clock = "hse8-pll168"
optimization = "Os"

[memory]
main_stack_bytes = 2048
libc_heap_bytes = 0

[os]
tick_source = "systick"
tick_hz = 1000
interrupt_mask = "basepri"
syscall_priority = 5
max_priorities = 32

board 定位已审包,再校验实际身份。产品任务、queue payload/depth、stack 预算及 start/stop 策略留在外部。ThreadX 优先级为后端特定语义:数值小先运行,不能把 FreeRTOS 相反顺序复制到产品。

OS 字段

Native Linux

Cortex-M4/M4F

tick_source

仅 host,默认

默认 systick 或显式 external

tick_hz

1–1,000,000,精确整除 1e9 ns

1–1,000,000;SysTick 必须精确整除真实 core clock

interrupt_mask

仅 none

默认 basepri 或显式 primask

syscall_priority

仅 0

BASEPRI 时 1..已实现最大值;PRIMASK 时 0

max_priorities

仅 32

仅 32

OS 选项 null/省略时使用显式默认值;非 object、未知字段、整数字段 boolean 及非法组合失败。ThreadX 拒绝 profile、idle_stack_words、notification_slots、tickless、memory_protection、security_model、runtime_stats 与 lowpower_port。首批 port 最低调用方存储 200 字节、8 字节对齐;这是固定准入事实,不是应用栈峰值或主机 pthread 栈预算。Timer 在 ISR 处理是固定选择,没有隐式 timer worker。

PRIMASK policy 保留物理 CPU BASEPRI 能力,但选择 PRIMASK kernel 行为和逻辑 ceiling 零。BASEPRI C 与 ASM 使用同一数值编码 ceiling。Native none 不授权模拟硬件 IRQ 调用 ThreadX。MCU ThreadX 占用 PendSV,仅选中时占用 SysTick。ThreadX 不占用 SVC;external Tick hook 必须绑定真实源,不能静默保留 SysTick。既有 Core monotonic time 仍为 deadline 域。

Linux 源码与证据

构建派生 Linux timer overlay 绑定唯一精确已审 upstream SHA 并保留原 MIT 声明。GNU sem_clockwait 须通过真实编译/链接能力探针。Timer 在时钟观察与等待均使用 CLOCK_MONOTONIC,并规范化精确一十亿纳秒进位。未知源或输出拒绝,不回退 realtime 等待。原厂商 checkout 不变。

开发证据区分真实官方内核内 25 个 GoogleTest case、mock 外部 CPU/IRQ/libc 的生产机制测试、Python 配置测试及真实 ARM 对象大小探针。原开发记录未保留在原仓库路径;现存接入后续记录含自身真实源码快照和原始执行,不证明最终 clean source、SDK 消费或 HIL,也不替代缺失原始字节。后续 PRIMASK/配置记录保留自身原始字节及命令;实现演进不重写原 RED/GREEN。后续记录含 50 个 fresh case:30 真实 kernel service、6 真实 bootstrap、14 mock 外部边界的生产机制,并记录三板两 policy 共六个链接、一个精确缺 Tick 拒绝及三个纯 CPU integer/softfp 链接。这些是开发结果,不是物理执行。

FreeRTOS timebase 低功耗选择器

FreeRTOS 保持既有 profile。新增 lowpower_port 默认 custom,保留显式产品 port/weak-null 行为。选择 timebase 要求 tickless SysTick、特权 single-world 和已审 STM32F407/GD32F470 timer,不授权深睡。纯 CPU runtime/emission 因 CPU 事实不提供 SoC timer/alarm 合同而拒绝此选择。该字段绝不选择 ThreadX 睡眠机制。真实 timer 实现测试、物理唤醒延迟/功耗/clock 行为分别建立资格。

可重复软件门禁

python scripts/ci/os_threadx.py --compiler arm-none-eabi-gcc --output <fresh-dir> 对三块维护 Board 的 BASEPRI 与 PRIMASK 执行生产平台图。各 ELF 保留真实 task、queue、close、notification、join、timer、scheduling 入口;两个官方 PendSV alias 必须解析为同一 strong 指令入口。每个官方 common/M4 源须有真实编译对象及相同数值 C/ASM policy。门禁保留精确 ELF/BIN/map、资源报告、作者/解析配置、编译数据库、命令结果及执行前后源码身份。

第七个构建必须明确在 ELF 链接因缺少 strong external-Tick provider 失败。无关编译失败、已有 ELF、weak/缺失保留入口、host/dynamic 符号、旧输出和源码变更均不合格。本门禁没有命令烧录或执行 MCU。兼容策略中 configured_backends 仅列可选择名称,真实解析器仍拒绝不支持 CPU/Board 组合。