栈观察与所有者生命周期耐久验证¶
Nexus 提供有界、只读的填充模式观察,不填充活动栈、不建立采样 worker、不挂起任务,也不宣称填充模式能检测全部预留栈字节。产品栈预算与物理工位采样仍由外部负责。
Core 与 MSP 来源¶
nx_stack_observe 接收调用方证明已填充区域的原始正数字节容量,最多读取该容量,返回低地址未修改前缀及其余已触及字节,不保留指针。无效、回绕或与输出重叠的范围保持输出不变。原 request、stream、owner 和 task 结构不增加字段。
区域必须在没有活动栈帧时填充。采样要求区域静止,排除当前 SP、全部活动帧与异常预留。因此 MSP 观察需要启动填充来源与审阅的静止采样点。此 API 不读取 MSP 寄存器或修补缺失来源。完全未修改的区域也只读到提供容量,不越界继续扫描。
触及模式观察不是峰值测量:未写入的栈帧预留或恰好写入填充值可能不可见。它不是栈 canary 校验或溢出检测。物理任务/MSP 预算仍需负载、嵌套异常和工位证据。
可选 FreeRTOS 静态任务绑定¶
nx_freertos_stack_observe 仅在 [os].trace = true 时编译,包括维护中的 diagnostic 配置。Standard/minimal/lowpower 不编译其 TU。调用方提供原静态任务 handle、TCB、stack 和 word capacity。xTaskGetStaticBuffers 确认精确活动 TCB/stack 身份,但不能确认容量;容量仍归原创建合同。
调用要求特权、未屏蔽、运行中 Thread。调用方在整个扫描期间排除 join、delete、启动前 discard、重新绑定/初始化和对采样栈的写入。已返回并挂起的可 join 任务可在外部 join 前采样;join 回收任务前必须停止使用绑定。删除后不查询旧 handle。
锁定 FreeRTOS tasks.c 在维护的启用填充配置下使用 0xA5 填充新静态任务栈。适配使用此精确值并执行容量有界 Core 扫描,刻意不调用内核无界空闲空间 helper。不引入额外 task/TCB 状态、掩码、队列或运行时注册表。
POSIX FreeRTOS port 在提供的静态数组存放启动记录,并另建 pthread 执行栈。静态缓冲查询成功只证明 API 身份及有界检查,不证明 MCU 或 Linux 执行栈峰值。
已测软件成本¶
开发证据使用既有生产 Runtime CMake 图、Cortex-M4F hard-float、GNU Arm 14.3、-Os、-fshort-enums 与 section GC。Standard 图不编译栈快照 TU,diagnostic 图编译一个。按精确适配命令 ABI 编译的探针测得调用方绑定 16 字节、输出 12 字节,均可选且由调用方持有。
所属对象 section 测得适配 .text 242 字节、Core 扫描 .text 64 字节,两者 .data/.bss 均为零。这些是最终链接对齐和新增保留内核身份查询之前的对象代码数据,不是完整镜像 Flash 差值。未引用 section 可丢弃。快照最多执行 words * sizeof(StackType_t) 次字节比较并复制定长输出,不推断周期或中断延迟。
真实内核生命周期耐久测试¶
两个无过滤 case 经实际锁定 FreeRTOS POSIX 内核、两个真实 producer 任务、一个真实 owner 任务、UART owner 和 Native UART 提供者,分别执行 32 与 256 轮。各轮轮换正常完成、取消及排空失败隔离后显式成功排空。
每轮校验隔离请求不能 prepare/reclaim,producer 和 owner 任务已 join,executor/provider 不保留 request/data 指针,IRQ 提示在 sink 销毁前 detach,provider stop 完成,通知销毁,内核任务数量回到轮前基线。致命清理失败中止夹具,不在任务仍借用时释放存储。
大型主机夹具由测试显式持有,位于协调者 pthread 栈之外。Native 硬件模型步骤周围使用有界 scheduler-suspend guard,防止信号驱动 POSIX 调度器挂起 pthread mutex 持有者而运行另一模型使用者。这是夹具组合,不改变生产提供者或 MCU 调度规则。
288 轮结果建立 Linux 上此软件生命周期。Native IRQ 提示与模型 TC/drain 不是物理中断或线侧证据。三板工位接入前,物理耐久、真实 UART/DMA 唤醒延迟和板级电流测量仍未执行。