[关闭]
@leaveye 2015-06-10T04:54:34.000000Z 字数 2043 阅读 1142

DSP上位机通讯设计方案

DSP ARM I/O


原始方案

ARM>DSP

Created with Raphaël 2.1.2ARMARMDSPDSPset(DL, BUSY): 马上要写数据xfer(DL, buf, len)set(DL, DONE): 数据已经写完

DSP>ARM

Created with Raphaël 2.1.2DSPDSPARMARMset(UL, BUSY): 马上要写数据xfer(UL, buf, len)set(UL, DONE): 数据已经写完

改进方案1

ARM 的写操作,写到 OutBound (A2D 区域) 应可结束,告知 DSP 后即可返回。由 DSP 到指定地址读取(搬移或格式转换)数据。
DSP 的写操作,写到 OutBound (D2A 区域) 应可结束操作,告知 ARM 后即可返回。由 ARM 到指定地址读取数据。
因此,OutBound 作为通讯资源,需要独立的保护。

ARM>DSP

timeout=4Tmax

Tmax 表示统计(估算)最长的单次传输时间。4 是因为读写双向,2 个 DSP。
SADDR 表示 ARM PCIE OutBound 空间内,ARM 端写入数据在 DSP 端的地址。

Created with Raphaël 2.1.2ARMARMDSPDSPtimed_wait(DL, IDLE, timeout): 确保无其它写操作在进行——没有谁在用 OB 吧?状态到达——的确没有。start(DL, len): 声明资源占用——『我要用 OB 了!传输 len 字节』set(DL, BUSY): 声明资源已占用生成 xferid——嗯,又要写数据了,这次有 len 字节。就叫做 xferid 吧。timed_wait_reply(DL, timeout): 等待 DSP 响应——对面知道了没?accept(DL, xferid, len): 答复可写——『我知道了,这次写的 len 字节是 xferid 。』pcie_map_ob_region(buf, len): 映射地址空间并计算 SADDR——使用 OB 发数据。嗯,会发到 SADDR 去……finish(DL, xferid, SADDR, len): 已写入数据长度——『数据块 xferid 我已经放到 SADDR 了。完毕。』mem_lock(ADDR, len): 锁定目标内存EDMA(SADDR->ADDR): 数据搬移push(FIFO): 缓存入队set(DL, IDLE): 声明资源已释放return(len): 返回成功长度
Created with Raphaël 2.1.2ARMARMDSPDSPtimed_wait(DL, IDLE, timeout): 确保无其它写操作在进行——没有谁在用 OB 吧?等待超时——这谁啊,用完不打扫干净。finish(DL, -1, 0, 0): 已写入数据长度——『刚刚啥都没写哦!』len = 0——没有数据诶。set(DL, IDLE): 声明资源已释放timed_wait(DL, IDLE, timeout): 确保无其它写操作在进行——没有谁在用 OB 吧?状态到达——的确没有。start(DL, len): 声明资源占用——『我要用 OB 了!传输 len 字节』set(DL, BUSY): 声明资源已占用生成 xferid——嗯,又要写数据了,这次有 len 字节。就叫做 xferid 吧。timed_wait_reply(DL, timeout): 等待 DSP 响应——对面知道了没?accept(DL, xferid, len): 答复可写——『我知道了,这次写的 len 字节是 xferid 。』pcie_map_ob_region(buf, len): 映射地址空间并计算 SADDR——使用 OB 发数据。嗯,会发到 SADDR 去……finish(DL, xferid, SADDR, len): 已写入数据长度——『数据块 xferid 我已经放到 SADDR 了。完毕。』mem_lock(ADDR, len): 锁定目标内存EDMA(SADDR->ADDR): 数据搬移push(FIFO): 缓存入队set(DL, IDLE): 声明资源已释放return(len): 返回成功长度
Created with Raphaël 2.1.2ARMARMDSPDSPtimed_wait(DL, IDLE, timeout): 确保无其它写操作在进行——没有谁在用 OB 吧?状态到达——的确没有。start(DL, len): 声明资源占用——『我要用 OB 了!传输 len 字节』len > size - used——这次的 len 字节放不下。timed_wait_reply(DL, timeout): 等待 DSP 响应——对面知道了没?refuse(DL, len): 无可写空间——『放不下了,先别写了。』return_failure(ENOBUFS): 返回失败返回重试直接重试

DSP>ARM

Created with Raphaël 2.1.2
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注