This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/AM5728:共享存储器无效

Guru**** 2606345 points
Other Parts Discussed in Thread: AM5728, SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/581201/rtos-am5728-shared-memory-not-valid

器件型号:AM5728
Thread 中讨论的其他器件: SYSBIOS

工具/软件:TI-RTOS

您好!

我们有一个 AM5728定制板。  ARM 是主控制器、在 Linux 下运行。  DSP 运行 TI_RTOS、并通过 GPMC 连接到 FPGA 进行加载、并通过 PCIe 进行通信。  整个过程的工作方式如下:

  1. FPGA 图像存储在 eMMC 上。
  2. Linux 将映像读取到 ARM 和 DSP 共享的存储器中。
  3. Linux 通过 MessageQ 向 DSP 发送一条消息、指明图像已加载到存储器中。
  4. DSP 通过 GPMC 将图像写入 FPGA。
  5. FPGA 以硬件信号进行响应、表示已成功加载。

此过程通常可以正常工作、但在电路板上电后或待加载的映像文件更改后、几乎总是会失败。

在调试该问题时、我们注意到 DSP 偶尔会读取映像存储器、并且其值为0x55555555、该值不存在于映像文件中的任何位置。  只要 DSP 在数据中看到0x5555555、FPGA 编程就会失败。  如果我们没有执行任何其他操作、但重复上述过程(即没有重启或重启)、则映像将成功加载。  

此时、我们怀疑存在某种缓存问题、尽管不确定 它在哪一侧、还是 ARM 或 DSP。  在 ARM 端、尝试同步传输以强制从 eMMC 到存储器的数据传输完成、然后通知 DSP 开始下载。  但是、我们的 Linux 开发人员

    • 我目前正在使用一种机制,该机制在 Linux 方面没有进行高速缓存。 事实上,内存驱动程序甚至不能实现 fsync 功能,因为它被记录为直接访问物理内存–Linux 在这两者之间不做任何事情。

这似乎是一个死端

在 DSP 方面、我尝试通过.cfg 文件使整个共享存储器区域取消缓存、如下所示:

VAR Cache = xdc.useModule('ti.sysbios.family.c66.Cache');
Cache.setMarMeta(0x8CA80000,0x01000000,0);

0x8CA80000是 DSP 端存储器地址。  Linux 端通过0xF0000000处的资源表定义。

这似乎根本无助于事情。  因此、当我从存储器读取数据时、我厌倦了使缓存无效、如下所示:

如果((I % 32)=0)
{
cache_inv (&fpgaDownload[i]、128、cache_Type_All、true);
} 

"I"是32位字的计数、因此"I" mod 32是每128个字节、我认为这是缓存行大小。

再说一次、运气不佳、行为是相同的。 请记住、这偶尔会起作用、如果 ARM 向存储器写入相同的映像两次、则几乎总是起作用。

然后、我在 DSP 中执行了一个有趣的调试日志。 在尝试加载 FPGA 之前、我在循环中扫描了存储器的0x5555555。 如果我检测到0x55555555、我将错误和偏移记录到中
存储器、睡眠了1秒、我再次开始、继续循环、直到负载成功。 令我惊讶的是,它运行正常,但花了30秒! 请注意0x55555555地址是如何的
检测到的文件向下移动、有时重复一遍又一遍、持续几秒钟。 就像 ARM 认为从 eMMC 的内存传输已经完成、但实际上并不是。

FPGA:加载大小为5159580字节的 FPGA 映像

FPGA:扫描找到的 FPGA 图像、大小为1744960字节

FPGA:扫描发现的 five 为1753152字节的 FPGA 图像

FPGA:扫描发现的 five 为1753152字节的 FPGA 图像

FPGA:扫描发现的 five 为1753152字节的 FPGA 图像

FPGA:扫描发现的 five 为1753152字节的 FPGA 图像

FPGA:扫描发现的 five 为1753152字节的 FPGA 图像

FPGA:扫描发现的 five 为1753152字节的 FPGA 图像

FPGA:扫描发现的 five 为1753152字节的 FPGA 图像

FPGA:扫描发现的 five 为1753152字节的 FPGA 图像

FPGA:扫描发现的 five 为1753152字节的 FPGA 图像

FPGA:扫描找到的 five 为323680字节的 FPGA 图像

FPGA:扫描找到的 five 为323680字节的 FPGA 图像

FPGA:扫描找到的 five 为323680字节的 FPGA 图像

FPGA:扫描找到的 five 为323680字节的 FPGA 图像

FPGA:扫描找到的 five 为3981696字节的 FPGA 图像

FPGA:扫描发现的 five 为4387072字节的 FPGA 图像

FPGA:扫描发现的 five 为4387072字节的 FPGA 图像

FPGA:扫描发现的 five 为4387072字节的 FPGA 图像

FPGA:扫描找到的 five 为5030080字节的 FPGA 图像

FPGA:扫描找到的 five 为5030080字节的 FPGA 图像

FPGA:扫描找到的 five 为5030080字节的 FPGA 图像

FPGA:扫描找到的 five 为5030080字节的 FPGA 图像

FPGA:扫描找到的 five 为5030080字节的 FPGA 图像

FPGA:写入图像时间:30261 msec 1289895 32位字

FPGA:0msec 后 DONE 变为高电平!

 

(以上每行为1秒间隔)

 

那么、对于如何进一步解决此问题或者在让 DSP 使用之前如何确保文件已完全加载、还有什么其他想法呢?

 

谢谢、

 

Chris
 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chris、缓冲器从 A15/Linux 传输到 C66的支持机制是通过 CMEM 缓冲器。 CMEM 确保数据在 C66使用之前在 DDR 中有效。
    有关详细信息、请参阅以下资源:
    www.ti.com/.../sprac60.pdf
    processors.wiki.ti.com/.../Linux_IPC_on_AM57xx

    此致、
    Michael
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有一个建议的答案、由于此主题在一周内未激活、建议的答案被标记为验证。 请随意选择"拒绝回答"按钮、并回复更多详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很抱歉不能早点回到这一点、但 CMEM 方法确实解决了我们的内存问题。  谢谢!