API GUIDE / TNPU / MIDDLEWARE
TNPU Middleware 接口
Middleware API
void im_tnpu_config_struct_init(im_tnpu_config_t *config);
error_code_t im_tnpu_init(im_tnpu_t *dev, const im_tnpu_config_t *config);
error_code_t im_tnpu_deinit(im_tnpu_t *dev);
uint32_t im_tnpu_boot_firmware_size_get(void);
error_code_t im_tnpu_boot_area_write(im_tnpu_t *dev, uint32_t offset,
const void *data, size_t size);
error_code_t im_tnpu_submit(im_tnpu_t *dev, const im_tnpu_task_t *task,
uint32_t timeout_ms, uint32_t *result_out);
im_tnpu_submit() 通过 HAL 写参数和栈保护字,对外部 code/input/output buffer 执行 cache 操作,让 HAL 发送新任务 mailbox 命令,然后阻塞在内部 thread_waiter_t 上。
SoC IRQ 入口只调用 hal_tnpu_irq_handler(&dev->hal_handle)。HAL 解码 mailbox 完成或异常,确认 mailbox 完成,并用存储的 user context 调用已注册的回调。middleware 用该回调唤醒 waiter;cache 校验和结果读取保留在线程上下文。timeout 传 0 时使用 im_tnpu_config_t::timeout_ms。任务执行期间不会忙轮询。超时或异常时,middleware 在报告 ERROR 前关闭 PLIC 源和 TNPU-to-host 中断通路。
任务前:外部 code 从 target_pc 起 4 KiB 做 data clean 与 instruction invalidate;外部 input 做 clean;外部 output 做 clean+invalidate。任务成功后:外部 output 再次 invalidate 再交还 CPU。TNPU 内部 DRAM 不参与 cache 维护。
middleware 有 RESET、READY、BUSY、ERROR 四种状态,一次只接受一个同步任务。超时或栈保护失败会使 middleware 进入 ERROR:当前正在执行的 TNPU 任务无法在不复位的情况下安全中止,而复位会覆盖 boot 区中的用户内核。再次提交前需 im_tnpu_deinit()、im_tnpu_init() 并重新加载自定义内核。
Middleware 示例
code/middleware/tnpu/example/ 通过 im_tnpu_boot_area_write() 加载 DRAM 驻留加法内核,通过 im_tnpu_submit() 提交,并在 IRQ_TNPU 唤醒 middleware waiter 后校验结果。示例不直接访问 TNPU 寄存器、HAL mailbox,也不在应用层调用 IRQ 接口。