Core:请求、状态与时间¶
这些声明来自公共头文件。选择、生命周期、支持的执行模式和物理资源授权范围仍以对应设计及支持记录为准。
fault.h¶
在平台保持故障停止之前执行有界观察。
作者 Nexus Team
枚举
函数
-
void nx_fault_observe(nx_fault_domain_t domain, nx_result_t reason, const char *file, unsigned line)¶
在调用者保留效果之前观察终止故障。
备注
默认弱实现直接返回,不保存状态,也不产生副作用。产品可提供一个强实现,但在每种调用它的任务/ISR/已屏蔽上下文中都必须有界且不分配内存。发生损坏后,不得假定内核、时钟、栈、传输或外设仍正常。这里只提供尽力而为的观察,不修复栈,也不证明安全输出或复位。hook 不得取得 OS 锁、重入 provider、改变传入屏蔽、修改已接受的请求或释放保留的存储。若 hook 返回,终止路径的调用方仍将停驻。产品可执行另行审查且不返回的恢复操作。不隐式保留事件、注册表或 worker。
- 参数:
domain – [in] 实际报告路径,不表示严重程度评估。
reason – [in] 观察到的故障,绝不授予回收借用的权限。
file – [in] 静态源码字符串字面量或 NULL;不得保留或读取不可信动态内存。不解引用任务名。
line – [in] 诊断位置;不可用时为零。
memory.h¶
仅将变量放入显式选定的数据区域。
作者 Nexus Team
宏定义
-
NX_CORE_MEMORY_STRING_DETAIL(value)¶
将静态存储放入配置声明的可选内存区域。
备注
这些属性用于变量定义,置于类型之前,每个声明只定义一个变量;它们不是函数或指令属性。每次使用都有独立的输入 section,便于回收未使用存储。DATA 在复位时从 Flash 复制初始值;BSS 在复位时清零;NOINIT 既不复制也不清零,读取前必须初始化。不承诺掉电保持。BSS/NOINIT 拒绝非零初始值。存储按字对齐,并受显式 ELF 预算约束。未选入时使用会触发编译错误。TCM 仅用于 CPU 数据,绝不能用作 DMA 或可执行存储。CCM 同样仅用于 CPU 数据,放置在其中不授予总线主设备访问权限。ADDSRAM DMA 仍须由 provider 验证地址、对齐和所有权。普通存储、主 MSP 及未选入的镜像保留现有布局。U575 SRAM4 选择还会准备由复位流程拥有的 PWR/SRAM4/LPDMA 运行门控;自主运行及 DMA 借用接纳仍需各自的 provider。
-
NX_CORE_MEMORY_STRING(value)¶
-
NX_CORE_MEMORY_ATTRIBUTE(name)¶
-
NX_MEMORY_ADDSRAM_DATA¶
-
NX_MEMORY_ADDSRAM_BSS¶
-
NX_MEMORY_ADDSRAM_NOINIT¶
-
NX_MEMORY_TCM_DATA¶
-
NX_MEMORY_TCM_BSS¶
-
NX_MEMORY_TCM_NOINIT¶
-
NX_MEMORY_CCM_DATA¶
-
NX_MEMORY_CCM_BSS¶
-
NX_MEMORY_CCM_NOINIT¶
-
NX_MEMORY_SRAM1_DATA¶
-
NX_MEMORY_SRAM1_BSS¶
-
NX_MEMORY_SRAM1_NOINIT¶
-
NX_MEMORY_SRAM4_DATA¶
-
NX_MEMORY_SRAM4_BSS¶
-
NX_MEMORY_SRAM4_NOINIT¶
request.h¶
调用者拥有的准入、借用、结清与稳定取消机制。
作者 Nexus Team
枚举
函数
-
void nx_request_initialize(nx_request_t *request)¶
初始化全新且未被借用的请求存储。
备注
仅限任务上下文。绝不能通过初始化撤销存续的借用。
- 参数:
request – [out] 全新存储,尚不对 provider/观察者可见。
-
nx_result_t nx_request_prepare(nx_request_t *request, nx_time_us_t deadline)¶
准备处于 READY 或结果已消费的 SETTLED 请求。
备注
唯一所有者,仅限任务上下文;失败不产生借用。
- 参数:
request – [inout] 不再有观察者或适配器借用的存储。
deadline – [in] 包含排队时间的绝对传输 deadline。
- 返回:
成功返回 NX_SUCCESS;拒绝无效指针或已借用状态。
-
nx_request_state_t nx_request_state(const nx_request_t *request)¶
以 acquire 顺序读取请求状态。
备注
任务/IRQ 中的有界操作;SETTLED 保证 provider 的最终访问已经发生,不保证独立的适配器观察者已经退出。
- 参数:
request – [in] 由调用者保持存续的已初始化存储。
- 返回:
当前状态;NULL 返回 QUARANTINED。
-
nx_result_t nx_request_admit(nx_request_t *request, nx_request_state_t state)¶
建立请求链唯一的准入判定和提供者借用。
备注
只允许一个串行化的执行所有者;先验证硬件/缓冲区。多生产者适配器须在整个准入期间持有元数据保护;不支持并发准入。
- 参数:
request – [inout] READY 请求;调用者须保持存储,直到 SETTLED。
state – [in] 适配器使用 QUEUED;直接 provider 使用 ACTIVE。
- 返回:
NX_SUCCESS 表示 ACCEPTED。任何失败均表示 REJECTED,且不保留引用、不访问载荷,也不遗留效果。
-
nx_result_t nx_request_transition(nx_request_t *request, nx_request_state_t state)¶
推进已准入的请求,不重复准入。
备注
执行所有者调用;任务/IRQ 中的短元数据操作。
- 参数:
request – [inout] 已获准入、由执行器拥有的请求。
state – [in] ACTIVE、DRAINING 或 QUARANTINED。
- 返回:
成功返回 NX_SUCCESS;非法转换返回 NX_ERROR_STATE。
-
void nx_request_settle(nx_request_t *request, nx_result_t result, size_t transferred)¶
作为提供者最后一次访问,以 release 顺序发布 SETTLED。
备注
先撤离 active/queued 引用,并捕获所有静态唤醒目标。此后任何硬件/IRQ/延后观察者都不得再访问请求或载荷。仅取消/超时不能满足此条件。排空失败时继续保持 QUARANTINED。
- 参数:
request – [inout] 所有源均已排空后的借用存储。
result – [in] 最终传输结果,不是准入状态。
transferred – [in] 有效传输的字节/样本数。
-
nx_result_t nx_request_result(const nx_request_t *request, nx_result_t *result, size_t *transferred)¶
在 acquire 观察发布之后,复制唯一的最终结果。
- 参数:
request – [in] 存续的请求存储,且不得并发复用。
result – [out] 最终操作结果。
transferred – [out] 有效字节/样本数。
- 返回:
成功返回 NX_SUCCESS;仍在借用时返回 NX_ERROR_BUSY;参数无效时拒绝。
-
nx_result_t nx_request_slot_bind(nx_request_slot_t *slot, nx_request_t *request, uint64_t *epoch)¶
将稳定槽绑定到新的请求实例世代。
- 参数:
slot – [inout] 零初始化、尚未绑定且由适配器拥有的槽。
request – [in] 待绑定的存续存储;绑定本身不表示准入。
epoch – [out] 用于后续控制命令的非零身份标识。
- 返回:
返回 NX_SUCCESS、BUSY、INVALID 或 EXHAUSTED;身份标识绝不重复。
-
nx_request_t *nx_request_slot_lookup(const nx_request_slot_t *slot, uint64_t expected_epoch)¶
在解引用之前,通过稳定存储解析取消请求。
- 参数:
slot – [in] 由适配器同步保护的稳定槽。
expected_epoch – [in] 命令所指定的实例代次。
- 返回:
仅在已绑定的实例代次匹配时返回存续请求;否则返回 NULL。
-
nx_result_t nx_request_slot_release(nx_request_slot_t *slot, uint64_t expected_epoch)¶
仅在请求结清且控制引用排空之后撤销槽引用。
- 参数:
slot – [inout] 相关命令/观察者均已退出的稳定槽。
expected_epoch – [in] 要释放的实例代次。
- 返回:
成功返回 NX_SUCCESS;身份标识过期返回 STATE;仍有借用返回 BUSY。
request_observer.h¶
可选、无锁、基于稳定身份的请求观察。
作者 Nexus Team
函数
-
nx_result_t nx_request_observer_bind(nx_request_observer_t *observer, const nx_request_slot_t *slot, uint64_t epoch)¶
绑定准确且存活的实例世代,不存储其指针。
- 参数:
observer – [inout] 全新且已零初始化,或已撤离的 sidecar;控制存储须独立。
slot – [in] 由调用者互斥保护的稳定调用者槽。
epoch – [in] 非零且精确的槽实例代次,绝不重新生成。
- 返回:
返回 SUCCESS 或 INVALID/STATE;拒绝时不保留引用。
-
nx_result_t nx_request_observer_sample(nx_request_observer_t *observer, nx_time_us_t now, nx_request_observation_t *out)¶
复制准确 epoch 的状态,以及以 acquire 观察的最终结果。
备注
借用状态不暴露推测的结果/计数。NULL 槽、过期 epoch 和重叠均在访问请求前拒绝。它既不推进硬件,也不把 deadline 解释为借用释放。调用者保证绑定存储的生命周期。输出须与完整描述符及已借用缓冲区不重叠;这里只检查公共 request 跨度。
- 参数:
observer – [inout] 由调用者串行化保护的已绑定 sidecar。
now – [in] 与请求 deadline 相同的单调时间域。
out – [out] 独立输出;错误时保持不变。
- 返回:
成功返回 SUCCESS;身份标识过期/已释放返回 STATE;参数无效返回 INVALID;时间倒退返回 IO;计数器饱和,不复用 epoch。
-
void nx_request_observer_detach(nx_request_observer_t *observer)¶
仅移除此附加观察引用,不改变借用。
备注
由调用者串行化;请求处于 QUARANTINED 时也允许调用。它不表示请求结算、槽释放或销毁。
- 参数:
observer – [inout] 所有读取者均已退出后的存续 sidecar。
-
struct nx_request_observation_t¶
- #include <request_observer.h>
已复制的事实;仅 settled 为 true 时 result/count 有效。
公共成员
-
uint64_t epoch¶
-
nx_time_us_t observed_at¶
-
nx_time_us_t deadline¶
-
nx_request_state_t state¶
-
nx_result_t result¶
-
size_t transferred¶
-
bool settled¶
-
uint64_t epoch¶
-
struct nx_request_observer_t¶
- #include <request_observer.h>
调用者拥有的可选附加状态,绑定之前必须使用全新清零存储。
备注
只允许一个串行化观察者;不依赖 Arch/OS/SoC,也不使用锁。采样期间调用者须排除槽 bind/release、请求 prepare/reuse 及并发观察调用。稳定槽须存续至 detach;观察绝不取得或释放借用。
公共成员
-
const nx_request_slot_t *slot¶
-
uint64_t epoch¶
-
nx_time_us_t last_observed¶
-
nx_time_us_t max_gap¶
-
uint32_t samples¶
-
uint32_t transitions¶
-
uint32_t clock_errors¶
-
nx_request_state_t last_state¶
-
bool observed¶
-
const nx_request_slot_t *slot¶
stack_observation.h¶
对调用者涂色的栈范围作有界只读观察。
作者 Nexus Team
函数
-
nx_result_t nx_stack_observe(const void *base, size_t bytes, uint8_t paint, nx_stack_observation_t *out)¶
读取有界的低地址涂色前缀,不修改存储。
备注
调用者须保证该区域静默,且填充标记时没有活动栈帧。不依赖 Arch/OS,也不在内部屏蔽中断。工作量最多为 bytes 次读取。未被写入的保留区,或恰好等于填充值的写入,可能掩盖实际使用;这不是溢出检测。MSP 资格需要独立确认启动时填充标记的来源,以及静默的采样点。该跨度须排除当前 SP、全部活动栈帧及异常栈保留区。它既不填充栈,也不声称读取物理 MSP 寄存器。
- 参数:
base – [in] 调用者证明来源的、存续且向下增长的栈区域。
bytes – [in] 原始已填充标记区域的正容量,单位为字节。
paint – [in] 区域启用前使用的精确填充值。
out – [out] 独立输出;跨度或别名无效时保持不变。
- 返回:
返回 SUCCESS 或 INVALID,不分配内存,也不保留指针。
-
struct nx_stack_observation_t¶
- #include <stack_observation.h>
字节前缀涂色观察,不是准确的物理栈峰值。
status.h¶
精简且独立于厂商的结果集合。
作者 Nexus Team
枚举
-
enum nx_result_t¶
操作结果;提交时成功只表示已准入。
取值:
-
enumerator NX_SUCCESS¶
-
enumerator NX_ERROR_INVALID¶
-
enumerator NX_ERROR_BUSY¶
-
enumerator NX_ERROR_STATE¶
-
enumerator NX_ERROR_TIMEOUT¶
-
enumerator NX_ERROR_CANCELLED¶
-
enumerator NX_ERROR_IO¶
-
enumerator NX_ERROR_UNSUPPORTED¶
-
enumerator NX_ERROR_OVERFLOW¶
-
enumerator NX_ERROR_EMPTY¶
-
enumerator NX_ERROR_PERMISSION¶
-
enumerator NX_ERROR_NACK¶
-
enumerator NX_ERROR_ARBITRATION¶
-
enumerator NX_ERROR_EXHAUSTED¶
-
enumerator NX_ERROR_CONTEXT¶
-
enumerator NX_SUCCESS¶
time.h¶
绝对单调微秒截止时间与回绕扩展。
作者 Nexus Team
宏定义
-
NX_DEADLINE_NEVER¶
类型定义
-
typedef uint64_t nx_time_us_t¶
同一启动/时钟域内的微秒数,不具有墙上时钟语义。
函数
-
nx_time_us_t nx_time_now_us(void)¶
读取选定提供者的单调时钟。
备注
物理 provider 要求平台已成功启动,调用者为特权任务/可配置 IRQ;不支持 NMI/HardFault 调用者。不调用 OS、不分配内存,也不等待。物理时钟在已成功启动且仍存续的 epoch 之外返回零;仅凭零不能证明就绪,启动状态才是权威。撤销时钟前须等待全部消费者退出。停止/重启或时钟变化会使全部旧 deadline 失效,即使新 epoch 的数值相同。UINT64_MAX 为保留值;时钟耗尽要求受控重启。若观察到硬件溢出确认失败,即使已成功隔离有限源,也会终止当前 epoch,并进入不可继续的终态。provider 保留所有权、屏蔽中断、调用 nx_fault_observe;若观察者返回则停驻。它绝不会以无效的零时间恢复 deadline 消费者。观察既不释放借用,也不证明安全输出;产品负责另行审查且不返回的恢复路径。普通关闭仍须先等待所有消费者及可选低功耗所有者退出。
- 返回:
自时间域初始化以来的微秒数。
-
bool nx_deadline_expired(nx_time_us_t deadline, nx_time_us_t now)¶
依据时钟快照检查绝对截止时间。
- 参数:
deadline – [in] 绝对时间或 NX_DEADLINE_NEVER。
now – [in] 同一时钟域中的快照。
- 返回:
有限 deadline 已到期时为 true,包含恰好相等的情况。
-
nx_time_us_t nx_deadline_after(nx_time_us_t now, uint64_t duration_us)¶
增加持续时间,不使单调时间域回绕。
- 参数:
now – [in] 当前有限时间。
duration_us – [in] 相对时长,单位为微秒。
- 返回:
绝对 deadline,饱和于 NX_DEADLINE_NEVER。
-
nx_result_t nx_clock32_initialize(nx_clock32_t *clock, uint32_t counter, uint32_t frequency_hz)¶
初始化计数扩展及其时钟域。
备注
唯一执行所有者。复位会建立新的时钟域;复位/时钟变化后不得复用尚未完成的 deadline。
- 参数:
clock – [out] 调用者拥有的扩展状态。
counter – [in] 第一次硬件快照。
frequency_hz – [in] 非零且稳定的计数器频率。
- 返回:
成功返回 NX_SUCCESS;参数无效返回 NX_ERROR_INVALID。
-
nx_result_t nx_clock32_observe(nx_clock32_t *clock, uint32_t counter, nx_time_us_t *time_us)¶
扩展回绕计数器并换算为微秒。
备注
即使空闲,也必须至少每 2^32 个 tick 观察一次。仅凭两次快照无法检测多次漏掉的回绕。计数器须在等待期间持续运行,频率不得变化。
- 参数:
clock – [inout] 已初始化、仅有一个所有者的扩展状态。
counter – [in] 当前计数器快照。
time_us – [out] 扩展后的已用微秒数。
- 返回:
返回 NX_SUCCESS、NX_ERROR_STATE 或 NX_ERROR_EXHAUSTED。