类型化 factory、静态实例与多态接口面¶
当前平台保留类型化工厂查找和 C 多态。配置生成精确实例;factory 查找只返回它们,不构造、初始化、加锁或探测。硬件启动和请求执行是各自显式动作。
FIG-04 表示当前身份结构。控制器与子端点有不同接口和 ID,即使实现共享同一物理总线。
生成器拥有的责任¶
一份 schema-2 TOML 选择实例名、绑定、模式和精确容量。严格解析器产生类型化 IR;生成器发布只读接口面、共享 ops 引用、独立私有上下文、固定 IRQ 接线和紧凑获取函数。Native 装配同样取得独立模型状态;测试单例不是生产实例生成机制。
nexus_factory.h 针对每份 Platform 装配生成,因此其中的 ID 不是通用头或持久编号方案。默认 ID 是带具名常量的紧凑 uint16_t 别名。COUNT、非法值和未选中的条目均返回 NULL。芯片能力记录不授予 Board 路由或实物资格。
新产品优先使用强类型引用¶
每份 Platform 装配都会生成 nexus_factory_strong.h。新产品应包含该头文件,并将类别专用的 NX_*_REF_* 常量传给 nx_factory_*_ref() getter。这些包装返回相同的静态接口面,不增加全局存储、硬件访问或配置键。
默认标量 ID 仍是装配局部的 uint16_t 别名,C 不会拒绝混用两个这样的别名。具有独立结构类型的引用可让编译器拒绝类别不匹配,但不认证外部数值,也不使实例进入活动状态。可选能力记录另外通过 factory.capabilities 选择。
factory 头文件只为选中的接口类别包含完整公共 API,并为未选中的 getter 保留前置声明。代码需要特定 API 或完整接口面布局时,应显式包含对应公共 I/O 头;空 getter 仍返回 NULL。
将生命周期诊断映射回装配¶
生成的 nexus_bindings.h 使用 NX_PLATFORM_CONTROLLER_INDEX_<kind>_<assemblyID> 命名每个已解析 controller 位置,并提供 NX_PLATFORM_CONTROLLER_INDEX_COUNT。名称使用生成的 C 符号,例如 NX_PLATFORM_CONTROLLER_INDEX_UART_LINK_A。它们是 diagnosed start/stop 报告的零基 controller 序号,不是 typed factory ID、持久编号或 wire ABI。诊断中 SIZE_MAX 仍表示没有 controller。
启用 factory.capabilities 后,nx_factory_controller_capability() 使用这个 size_t 序号返回 controller 既有的不可变 capability 对象。它不分配副本或引入另一张元数据表。nx_factory_controller_label() 使用相同序号和精确字段:
字段 |
返回的不可变事实 |
|---|---|
|
装配中填写的实例 ID |
|
选定的 controller 类别 |
|
选定的具体硬件 controller |
|
选定的语义 mode |
无效序号(包括 COUNT)返回 NULL。标签查询遇到无效字段或 NX_FACTORY_CONTROLLER_FIELD_COUNT 也返回 NULL。文字为静态内容,属于当前装配。两个查询均不访问硬件、clock、锁或可变生命周期状态;可在 start 前和 stop 后读取不可变事实,不授予 ready、资源所有权或执行权限。
默认关闭该选项时,不生成诊断文字或运行时查询对象。具名序号常量本身不占运行时存储。参见实际factory emitter、binding emitter、配置回归及生成 Native factory 测试。这些源码/测试位置是审查入口,不是可下载的执行 receipt 或新源码软件资格。
一次调用执行什么¶
动作 |
实际工作 |
|---|---|
|
选择并返回已有只读 UART 接口面 |
|
执行选定初始化,保留清理结果 |
公共 I/O 操作 |
验证接口面,再分发 |
IRQ 入口 |
访问固定具体提供者和其拥有的硬件 |
显式 service/wait |
推进或观察选定生命周期 |
停止 |
按合同关闭/排空;不能提前收回仍在借用的存储 |
产品可在提供者存储生命周期内保留接口面。停止硬件不会撤销指针,也不会同步调用方。应用必须确保调用方与发布者停止访问并完成必要同步,才能回收外部 adapter 存储。获取函数不改变模式或悄悄取得执行所有权。
验证生成设计¶
以下完整维护装配选择独立 Native 实例:
schema = 2
board_package = "multi_board"
backend = "native"
clock = "model"
[factory]
capabilities = true
[memory]
main_stack_bytes = 2048
libc_heap_bytes = 0
[gpio.led_a]
binding = "led0"
mode = "output"
[gpio.led_b]
binding = "led1"
mode = "output"
[uart.link_a]
binding = "uart0"
mode = "irq"
baud = 115200
[uart.link_a.rx]
format = "events"
capacity = 4
[uart.link_a.irq]
priority = 5
[uart.link_b]
binding = "uart1"
mode = "irq"
baud = 115200
[uart.link_b.rx]
format = "events"
capacity = 4
[uart.link_b.irq]
priority = 5
[spi.bus_spi_a]
binding = "spi0"
mode = "short-poll"
[spi.bus_spi_b]
binding = "spi1"
mode = "short-poll"
[spi_device.sensor_spi_a]
controller = "bus_spi_a"
model_bytes = 64
[spi_device.sensor_spi_b]
controller = "bus_spi_a"
model_bytes = 64
[spi_device.sensor_spi_c]
controller = "bus_spi_b"
model_bytes = 64
[i2c.bus_i2c_a]
binding = "i2c0"
mode = "poll-messages"
[i2c.bus_i2c_b]
binding = "i2c1"
mode = "poll-messages"
[i2c_device.sensor_i2c_a]
controller = "bus_i2c_a"
model_bytes = 64
address = 80
[i2c_device.sensor_i2c_b]
controller = "bus_i2c_a"
model_bytes = 64
address = 81
[i2c_device.sensor_i2c_c]
controller = "bus_i2c_b"
model_bytes = 64
address = 80
[flash.flash0]
binding = "flash0"
mode = "poll-byte"
[watchdog.watchdog0]
binding = "watchdog0"
mode = "independent"
[exti.exti0]
binding = "exti0"
mode = "edge-event"
edge = "both"
event_capacity = 4
[exti.exti0.irq]
priority = 5
[pwm.pwm0]
binding = "pwm0"
mode = "fixed-pwm"
period_ticks = 1000
duty_ticks = 0
tick_hz = 1000000
[adc.adc0]
binding = "adc0"
mode = "low-rate-scan"
channels = [8, 9]
sample_times = [7, 7]
reference_mv = 3300
异步教程运行完整生成 factory 可执行文件,验证冷态查找、共享 ops 下的独立上下文、总线/端点身份、无效 ID、停止/重启和隔离保留。这些接口的权威是接入合同及生成/公开头文件;本页解释设计,不重复函数声明。