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.

[参考译文] TMDS64EVM:R5F 内核 CAN't 从 PRU 读取共享 RAM 输出

Guru**** 2914580 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1648293/tmds64evm-r5f-core-can-t-read-shared-ram-outputs-from-pru

器件型号: TMDS64EVM
主题: SysConfig 中讨论的其他器件

我正在开发在 ICSSG1 PRU0 上运行的固件。 为了测试 PRU 和 R5F Arm 内核之间的共享 RAM 接口、我在 PRU 代码中有一个简单的循环、该循环将有序递增的帧计数写入共享 RAM 存储器位置 (PRU 地址 0x1_000c、R5F 地址 0x3009_000c)。

当连接到 PRU 并使用 PRU 进行调试时、代码按预期运行、我可以看到正在写入 0x1_000c 并在其中更新的帧值没有问题。

当我连接到 R5F 并使用 SDK 库例程加载 PRU 代码时、我在 0x3009_000c 的共享存储器中看不到任何更新、即使它看起来就像 PRU 正在运行一样。

从 R5F 中运行的 PRU 初始化代码借用了一个 SDK 示例工程:

PRU_init.c 

执行该代码的终端输出与我期望看到的值相匹配:

[MAIN_Cortex_R5_0_0] PRUICSS_OPEN!
PRUICSS_initMemory DRAM = 8192!
PRUICSS_initMemory 共享 RAM = 65536!
PRUICSS_disableCore = 0!
PRUICSS_writeMemory = 742!
PRUICSS_resetCore = 0!

通过观察 ICSSG1 PRU0 IRAM 区域 (0x300B_4000)、加载到该位置的数据与编译后处理步骤生成的 PRU 十六进制数组中的数据相匹配。

通过查看 ICSSG_PRU_CONTROL 寄存器 (0x300A_2000)、PRU 似乎已启动并正常运行。 加载固件并启用 PRU 内核后的寄存器值为 0x00008003 (RUNSTATE = 1、ENABLE = 1、SOFT_RST_N = 1)。

ICSSG_PRU_STATUS 寄存器 (0x300A_2004) 正在更新(注意:这可能不是问题,但寄存器值不是在调试连接到 PRU 时根据 PC 值预期的 PC 值 — 在连接到 PRU 时循环处于 0x7E0 范围内、但在通过连接到 R5F 的 ICSSG_PRU_CONTROL 观察 PC 计数器值时、PC 值正在迭代 0x160 范围内)。

我正在以简单的 R5F 示例工程为基础、除了以下几点外、几乎没有更改其设置:

1) 在工程 SysConfig 中、我添加了一个 MMU 条目以确保可以读取/写入 PRU 共享存储器:

image.png

在 SysConfig 存储器配置器下、我还为共享 RAM 区域添加了存储器区域定义、指示它与 ICSSG1 PRU 内核共享:

image.png

2) 我的所有 R5F 可执行代码都加载到 DDR 中并在 DDR 中运行。 不确定这是否会影响 R5F 与 PRU 共享 RAM 交互的能力。

有任何调试方法或者我可能出了什么问题?

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

    您是否看到 0x3008_000c 已更新而不是 0x3009_000c? 这可能指向未针对 C28 更新的常量表块指针寄存器(POR 期间不会在常量表中直接启用 SMEM 偏移)

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

    C28 是否应为 0x10000? 这是 PRU C#寄存器对我的外观... C28 是唯一一个全为 0 的 C28。 如何正确设置?

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

    通过 从 R5F 或 PRU 对 ICSSG_PRU_CPPR0 进行编程

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

    我要写什么值? 0x30090000?

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

    0x100 表示 C28 中的 SMEM 基址(即 0x10000、C28/9_POINTER 控制位 23:8)