有界的 UART 硬件 FIFO 字节收发¶
当精确的 H743 或 U575 装配需要硬件 FIFO 缓冲,并要求明确限制每次中断处理的字节工作量时,可选择 irq-fifo-bytes。provider 使用现有公共 UART 接口、调用方持有的 TX 请求和静态 RX 字节环,不创建任务、worker、动态对象或第二个所有者。按阈值分批处理不代表已取得物理时延或无丢失吞吐量保证。独立选择的 irq-fifo-rtscts-bytes 模式在明确的四引脚软件参考路由上增加硬件 RTS 和 CTS,详见下文。
选择精确的控制器与时钟¶
FIG-16 展示当前构造与运行时所有权,不表示 FIFO 时序或硅片资格。 工厂返回 一个 nx_uart_port_t。选中的只读方法表调用私有 provider,后者由一份共享的编译期 算法和精确系列的官方 LL 叶操作组成。箭头仍分别表示生成、查找和调用,不增加 仅作转发的运行时层。
选择 |
H743 参考配置 |
U575 参考配置 |
|---|---|---|
精确芯片 |
STM32H743ZIT6 |
STM32U575ZIT6Q,TZEN0 |
控制器与路线 |
USART3,PD8/PD9 AF7 |
USART1,PA9/PA10 AF7 |
时钟配置 |
|
|
每方向硬件 FIFO 深度 |
16字节 |
8字节 |
包含 RDR 的最大 RX 暂存量 |
17字节 |
9字节 |
向量 |
USART3 IRQ39 |
USART1 IRQ61 |
正常夹具 |
裸机、优先级5、115200波特、8N1 |
裸机、优先级5、115200波特、8N1 |
该夹具中的软件 RX 环 |
64字节 |
64字节 |
额外的 RDR 级不能忽略:FIFO 深度不等于完整的 RX 积压容量。TX 移位寄存器也是独立的。本选择不改变关闭 FIFO 的普通 UART 或 DMA 模式。F407/F470 和其他 UART IP 不会从公共 API 自动继承 FIFO 支持。H743 高频配置、U575 Secure 执行、DMA、块/字 RX、非 8N1 帧和低功耗/自主运行仍不在这两种 FIFO 选择的范围内。普通 irq-fifo-bytes 仍不启用流控。
这些完整输入使用现有 Board 路线。FIFO 子节与其他资源来自同一份手写装配配置 和定型 IR。
# Selected FIFO software reference; no measured timing or HIL qualification.
schema = 2
board_package = "../../../../boards/stm32h743_nucleo_zi2"
backend = "baremetal"
clock = "hsi64-fixed-cache-off"
optimization = "Os"
[factory]
capabilities = true
[memory]
main_stack_bytes = 2048
libc_heap_bytes = 0
[uart.console]
binding = "uart3"
mode = "irq-fifo-bytes"
baud = 115200
[uart.console.rx]
format = "bytes"
capacity = 64
[uart.console.irq]
priority = 5
calls_os = false
[uart.console.fifo]
rx_threshold = "half"
tx_threshold = "half"
rx_budget_bytes = 2
tx_budget_bytes = 3
# Selected FIFO software reference; no measured timing or HIL qualification.
schema = 2
board_package = "../../../../boards/stm32u575_nucleo_zi_q"
backend = "baremetal"
clock = "msis4"
optimization = "Os"
[factory]
capabilities = true
[memory]
main_stack_bytes = 2048
libc_heap_bytes = 0
[uart.console]
binding = "uart1"
mode = "irq-fifo-bytes"
baud = 115200
[uart.console.rx]
format = "bytes"
capacity = 64
[uart.console.irq]
priority = 5
calls_os = false
[uart.console.fifo]
rx_threshold = "half"
tx_threshold = "half"
rx_budget_bytes = 2
tx_budget_bytes = 3
明确选择硬件 RTS 和 CTS¶
irq-fifo-rtscts-bytes 保留相同的公共字节接口和选配 FIFO 状态布局。它使用独立的只读方法表,选择同一算法的编译期特化版本,不为 FIFO 或普通 UART 增加可变流控标志、实例时钟字段、队列、任务或 worker。
选择 |
H743 软件参考配置 |
U575 软件参考配置 |
|---|---|---|
精确芯片、控制器与时钟 |
STM32H743ZIT6、USART3、 |
STM32U575ZIT6Q、TZEN0、USART1、 |
TX / RX / CTS / RTS,均为 AF7 |
PD8 / PD9 / PD11 / PD12 |
PA9 / PA10 / PA11 / PA12 |
软件参考包 |
|
|
首批正常选择 |
裸机、优先级 5、115200 波特、8N1、64 字节 RX 环 |
裸机、优先级 5、115200 波特、8N1、64 字节 RX 环 |
新模式派生固定的 8N1 帧及 flow = "rts-cts"。省略 frame 子节时使用该值;显式提供 frame 时,必须包含全部四个字段并与派生值完全一致。该模式不选择仅 RTS、仅 CTS、调制解调器通知、极性反转、运行时格式变更、RS485-DE 共用或 FIFO/DMA 组合。现有四个 FIFO 阈值/预算字段仍需显式提供。
这些包声明硅片封装引脚和 AF 编号,不建立 Nucleo 连接器、虚拟串口接线、产品 PCB 或对端电气兼容性结论。四个引脚都是独占资源;Board 若已将任一流控引脚保留给 USB、DE 或 GPIO,就与该 UART 选择冲突。双引脚 Board 绑定不会静默变成四引脚路由。
# Selected FIFO software reference; no measured timing or HIL qualification.
schema = 2
board_package = "../../../../boards/stm32h743zi_rtscts_reference"
backend = "baremetal"
clock = "hsi64-fixed-cache-off"
optimization = "Os"
[factory]
capabilities = true
[memory]
main_stack_bytes = 2048
libc_heap_bytes = 0
[uart.console]
binding = "uart-flow"
mode = "irq-fifo-rtscts-bytes"
baud = 115200
[uart.console.rx]
format = "bytes"
capacity = 64
[uart.console.irq]
priority = 5
calls_os = false
[uart.console.fifo]
rx_threshold = "half"
tx_threshold = "half"
rx_budget_bytes = 2
tx_budget_bytes = 3
# Selected FIFO software reference; no measured timing or HIL qualification.
schema = 2
board_package = "../../../../boards/stm32u575zi_rtscts_reference"
backend = "baremetal"
clock = "msis4"
optimization = "Os"
[factory]
capabilities = true
[memory]
main_stack_bytes = 2048
libc_heap_bytes = 0
[uart.console]
binding = "uart-flow"
mode = "irq-fifo-rtscts-bytes"
baud = 115200
[uart.console.rx]
format = "bytes"
capacity = 64
[uart.console.irq]
priority = 5
calls_os = false
[uart.console.fifo]
rx_threshold = "half"
tx_threshold = "half"
rx_budget_bytes = 2
tx_budget_bytes = 3
硬件 CTS 限制下一个串行帧的启动,不禁止 CPU 向仍有空间的 TDR/FIFO 写入。CTS 升高后,已经开始移出的帧仍可结束。ISR 中的 CTS 标志与物理引脚电平相反;CTSIE 保持关闭。provider 不会为了完成取消或停止而绕过 CTS。持续的外部阻塞可能超过自由运行时的排空限额:请求进入 QUARANTINED,其存储仍处于借用状态。只有真实的线上完成和经验证的撤回,才允许结算请求;之后物理 CTS 释放时也遵守该要求。对端恢复策略仍由外部负责。
硬件 RTS 响应硬件接收暂存量,不响应软件环的水位。软件环满时,此特化版本停止读取 RDR,并撤回 RX 阈值、非空、满、IDLE 和错误中断源,随后读回确认。它保留当前头部及其错误标志,并保持 UE、RE 和 RTSE。硬件 FIFO/RDR 随后可继续积累数据,通过真实 RTS 施加背压。对端若忽略 RTS,或在其变化后继续发送过多数据,仍可能导致溢出;此设计不产生无条件的无丢失保证。
公共字节读取释放环空间后,会重新启用选定的 RX 源并读回确认。如果保留的头部尚未达到阈值,非空电平源可在没有新字节或新 IDLE 边沿时推动处理。重新启用失败时返回 NX_ERROR_IO,实际已复制的计数和字节仍有效;准入关闭,所有者继续承担清理责任。关闭中的读取不会重新启用这些源。撤回源后,先前挂起的向量可能产生有界的额外入口;暂停时该入口不得消费保留的头部。
生成的冷装配在准备引脚前,会保存全部四个引脚及选定时钟门控的快照。进入 AF 模式前先将 TX 和 RTS 的 GPIO 锁存值设为高,并为 CTS 和 RX 配置上拉。输出类型、速度、上下拉、AF7 和模式字段都需要读回确认。只有观察到 UE 为零时才编程 CTSE/RTSE,并在首次启用前证明它们正确。整体停止在 TX 仍被借用时保持流控;只有各源和向量已撤离、发布者已退出,UE 为零且两个 ACK 清除后,才能清除流控/FIFO 字段并恢复原始四引脚快照和门控。缺少证明时继续保留所有权。GPIO 复位电平、未启用时的 AF 行为及物理启动/停止交接仍需实板验证。
区分阈值与 IRQ 预算¶
字段 |
含义与允许值 |
|---|---|
|
硬件接收阈值: |
|
硬件空闲空间阈值:相同的分数名称,最后一项用 |
|
每次处理入口的最大 RDR 读取数;H743为1..16,U575为1..8。 |
|
每次处理入口的最大 TDR 写入数,使用相同的逐芯片限制。 |
四个字段全部显式填写。正常夹具的阈值为 half,RX 预算2、TX 预算3。预算独立于 阈值,可以小于硬件批量。定型 IR 将名称映射为已审查的官方 LL 原始0..5编码; 配置值不是已移位的寄存器掩码。RX 与 TX 的最后一个编码含义不同。精确系列的 状态语义保留在硬件叶操作中,不使用一个通用 FIFO 模型代替。
稳定接收使用阈值、IDLE 和错误来源。处理程序先确认捕获的 IDLE,再排空数据。 若预算用尽后仍有数据,便启用电平敏感的 RX 非空来源并检查读回;后续有界入口 无需新流量或第二次 IDLE 即可读取短尾。空后以读回证明撤销该临时来源,不重写 未改变的掩码。必要变更被拒绝时关闭准入,并保留恢复责任。
PE、FE 和 NE 描述当前 RDR 头部。先清除已捕获的标志,再弹出该头部;丢弃坏字节后重新读取下一个状态。不启用流控时,硬件溢出和软件环满会累计丢失状态,同时保留较早排队的有效字节;RTSCTS 特化版本则按上文所述,在环满时保留待处理的头部。read_bytes 可在返回已复制字节的同时返回 NX_ERROR_OVERFLOW;该指示不等于精确的缺失字符数。没有待报告丢失状态时,空读取返回 NX_ERROR_EMPTY。
保持任务与请求契约¶
FIG-06 描述共享请求生命周期;FIFO 空间不是请求完成状态。 可选的 QUEUED 路径属于显式适配器。取消与 deadline 到期都保留已接受存储。
从平台的特权且未屏蔽中断的任务所有者启动平台。检查首要错误、清理错误及剩余效果。构造失败可能保留冷租约,必须由同一所有者完成停止。
获取
nx_factory_uart(NX_UART_ID_CONSOLE)。查找是纯操作,可早于启动;设备 操作要求平台已成功启动。请求只初始化一次,经
nx_uart_tx_prepare准备,再通过nx_uart_port_submit提交。deadline 使用当前有效的nx_time_now_us域中的绝对时间。已接受请求 与不可变 payload 须保持有效,直到以 acquire 观察到SETTLED。由串行化任务所有者调用
nx_uart_port_service。IRQ 派发只搬运有界字节并锁存 事实,不结清请求。可选唤醒提示不能替代请求谓词。内核适配器须另行验证其 选中的 IRQ 策略。使用
nx_uart_port_cancel请求排空。排空或隔离期间继续 service 并保留存储。 平台停止前先汇合消费方和观察者;RX 环、唤醒目标与所有者须保持到停止成功。
每次 TX 装载都检查请求、字节位置、终态原因和当前空间。TXFT、TX 非满和 TX FIFO 空都不能证明最后一个停止位已经离开引脚。只有装载后新观察到的 USART TC 才能证明线上完成;任务 service 仍须以读回证明 TX 来源撤回,再清除 active 引用 并以 release 发布 SETTLED。
取消与 deadline 观察阻止后续 payload 装载,并保留第一个终态原因。已装载的 FIFO/移位器字节仍在借用期内。8N1 排空允许最多 (FIFO depth + 1) * 10 个串行位, 在现有单调时间域中向上取整并加上已审查余量。UART 与 TIM2 使用同一获准时钟, 不增加额外时钟字段。后续观察不刷新已有排空 deadline。到期仍缺少撤回证明时, 存储保持 QUARANTINED,不会虚构 flush 或成功归还。
证明冷配置与完整停止¶
产生效果前,初始化验证状态/环/配置分离、精确控制器/向量、有效时钟/复位访问 以及外来控制处于静默。仅在观察到 UE=0 时配置 FIFOEN 与两个阈值,并检查最终 帧、使能、TEACK/REACK 和 NVIC 使能/优先级。首个效果之前记录所有权。清理失败 保留该标记和生成的冷租约、关闭准入并要求重试停止;首要错误本身不能证明回滚。
完整停止先关闭准入并排空已接受的 TX 与唤醒发布者。证明来源撤回、禁用并汇合 向量(含 pending 与 active),再证明 UE=0 及 TEACK/REACK 清除。此后才可清除 FIFOEN/阈值字段并丢弃剩余 RX 硬件数据。证明缺失则保留所有权。成功停止的前任 再次停止时不访问硬件,即使后来已有新所有者接管控制器。
跨度检查拒绝请求、payload、RX 输出/count、环、选中所有者/配置、活跃借用与 已控制 MMIO 之间的别名,包括已知 NVIC/系统窗口。环绕跨度与不合法输出对齐 在写入前拒绝。调用方仍须提供有效、可访问、类型正确的存储并遵守生命周期。
执行有限并发采集¶
外部 nexus-examples 应用 apps/uart_fifo_acquisition 使用公开 UART face,在有限 TX request 仍被借用时接收。其调用者拥有的采集区、service 时间戳和 request 存储均有固定边界。只有 acquire 观察到 SETTLED 后,才允许准备下一 payload 和 sequence。关闭流量窗口会请求取消并继续排空;排空到期或时钟损坏时仍保留存储。Platform cleanup 仅从冷态或实际已关闭的流量状态开始,在显式尝试预算内重试 BUSY/IO,Platform 撤回后绝不使用时钟。cleanup 耗尽不等于成功 join。
可选的平台自有工装 tests/contracts/uart_fifo_acquisition 将该外部应用链接到两份精确 FIFO 参考装配,生成 reference 与 instrumented 镜像;私有 provider 头仍只在工装内部使用。instrumented 镜像使用一个 raw cycle probe 包装选定 IRQ 依赖。站点可以提供另行审查的、有界 dispatch marker;默认不选引脚或 marker。普通 reference 排除 wrapper 和 probe。链接证明必须读取实际向量,从其 strong stub 经 wrapper 跟踪到恰好一次真实 provider 分派,且传入选定的 state 实参。
tools/hil/uart_fifo.py 保留 device/wire 采集和声明的换算参数,拒绝不一致的 session、计数、长度及源文件身份。四列 IRQ CSV 仅产生未验证的候选区间,不输出 samples.irq_latency;独立 assertion 来源、dispatch 关联、完整采集窗口和校准仍须审查,并满足既有 SOC-55 准入。raw DWT 区间和 wrapper 时长不能补出未观测的 IRQ 到达延迟。任何 parser、模型或链接检查都不建立实板执行证据。
分别评估成本与证据¶
仅选中所有者在普通 UART 前缀上增加 const 配置链接;配置包含四个单字节编码/ 预算。普通字节状态、公共方法与普通初始化保持不变。对象精确对齐、Flash 保留 与指令成本须来自选中 ARM ELF,不能从字段大小估算。
IRQ 预算独立统计 RDR 读取与 TDR 写入。状态读取、来源变更、屏障和唤醒派发也 消耗 CPU。外部模型检查这些访问,并证明排空的阈值批次不重写未改变掩码。 计数不是实测周期、WCET 或吞吐量保证。另行获准的周期探针只能观察其声明平台; U575 未经审查的 DWT 能力保持关闭。
在已准备锁定工具与依赖的仓库根目录执行:
python tools/dev/dev.py configure --preset fixture-io-evolution-h743-uart-fifo
python tools/dev/dev.py build --preset fixture-io-evolution-h743-uart-fifo
python tools/dev/dev.py configure --preset fixture-io-evolution-u575-uart-fifo
python tools/dev/dev.py build --preset fixture-io-evolution-u575-uart-fifo
成功的正常构建须产生 ELF/BIN/map、链接资源和 provider-retention 报告,包含一个 选中接口及其真实 FIFO 表。这些命令不烧录硬件或启动 UART 流量。产品协议与流量 产生仍由外部负责。
当前开发验证通过90项真实 provider GoogleTest/GoogleMock,每系列45项,以及18项正常 TOML/生成工厂用例,每系列9项:共108项,无失败或跳过。模型使用锁定的官方 LL 阈值函数,分别表示 FIFO、RDR 和移位器状态。两个规范配置也均通过正常 ARM 配置/构建、资源预算,以及每镜像一个接口、一张方法表和七个方法槽的保留检查。
独立的 RTSCTS 开发验证通过了 76 项真实 provider 用例,每个系列 38 项,以及 22 项正常 TOML/生成 factory 用例,每个系列 11 项,均无失败或跳过。两个精确四引脚正常配置也通过了 ARM 配置/构建。这些结果只建立所述参考选择的软件行为和链接证据,不证明对端响应、物理交接、时序或干净且可复现的软件候选。下文既有的无流控算术比较,不是新 RTSCTS 选择的实测成本比较。
对于这两个精确的 Os FIFO 夹具,仅缩窄有界中间运算就移除了链接的软件除法辅助函数。H743 BIN/载入 Flash 从9216变为8372字节,节省844字节;U575 从8948变为8016字节,节省932字节。每个镜像的已分配/预留 RAM 保持2296字节,包含2048字节主栈预留。绝对 deadline 仍为64位。这些是该选中算术对比的实际制品大小,不表示 FIFO 零成本、与普通 IRQ 字节模式的比较、实测周期或 WCET,也不建立干净且可复现的软件候选。
物理 HIL 为 not_executed。模型或链接结果均不证明振荡器精度、对端兼容性、U575 抗噪声、物理时延或硅片勘误资格。RM0433 Rev9 第48.5.4节/表402和 RM0456 Rev7 第66.5.5节/表674定义已审查 FIFO 形态;其他芯片和模式需要分别精确审查。
另见公共 UART 契约, 共享私有算法, H743 特化, U575 特化, H743 RTSCTS 特化, U575 RTSCTS 特化, U575 有限 DMA 选择及当前资格边界.