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.

[参考译文] 编译器/OMAP-L138:挑战使用 C 语言进行 OMAP-L138 PRU 编程

Guru**** 2538950 points
Other Parts Discussed in Thread: OMAP-L138

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/894023/compiler-omap-l138-challenges-omap-l138-pru-programming-in-c

主题中讨论的其他器件:OMAP-L138

你(们)好。

您的支持将我重定向到该论坛、并要求我发布我的问题
一个示例。 遗憾的是、我无法在此提供我的 CCS 项目、因为它是专有的
我无法在此处公开发布的代码。

支持人员告诉我、我可能会要求您直接联系我提交
我的 CCS 项目作为参考。 如果没有这一点、诊断将非常重要
困难。

正如您从我最近的问题中所知、我实际上正在开发 OMAP-L138 PRU
´s TI 的 PRU 编译器在 C 语言中应用。

该任务是通过之前使用 pasm 汇编的汇编程序来解决的。 我是
这些问题、我并不是很了解、因为我不熟悉 PRU
开发。 甚至我的资深同事也开发了旧的汇编语言
PRU 代码、不能为我提供任何提示。 我正在集成我的前一个
一个又一个函数的发展。

设置如下所示、即我正在使用 PRU 编译源代码
编译器、并让它自动使用十六进制实用程序生成 C 数组。 这种情况
ARM 主应用程序在启动时将阵列加载到 PRU 指令 RAM 中、
然后启动 PRU。 由于我的数据 RAM 是半满的、因此我移动了所有部分
除了像您在 E2E 论坛中建议的那样将堆栈连接到 IRAM 之外。

我将器件版本切换为1、这适用于 OMAP L138。 我工作
在优化级别2中、将其更改为"关闭"可n´t 解决问题。 我是
无法直接在目标上调试 PRU 代码、我只能连接到
ARM、停止它并查看 PRU 寄存器以进行调试。

我已经执行了以下操作:

我的程序以100µs μ s 周期执行。 为了实现这一点、我编写了一个函数
"waitForCycleFinish"、用于轮询中的 PRU 内部处理器周期计数器
µs 并将其复位大约18740个周期、相当于大约100 μ s。 这种情况
工作正常。

另一项任务是操作一些 LED。 这些连接到硬件移位
连接到 PRU R30的寄存器74HC595。 此设置需要它
首先在 R30位15移出0 (针对移位寄存器的选通输出使能)、
然后移出0至 R30位16 (移位寄存器移位时钟)、然后移出
然后、R30位23上的第一个 LED 控制值(移位寄存器数据输入)
切换 Shift 时钟等。 最后、必须设置 Strobe 输出使能
再次设置为1以启用移位寄存器´s 输出。 也是用于 LED 控制
编写了函数"r30OutputOperations"、"ledShiftOut"、"led_off"、"led_on"、
"simpleLedTest"。 对于第一个测试、这些会使所有 LED 以1秒的频率切换
周期、具体取决于 PRU 内部处理器周期计数器。

目前为止、这种方法效果非常好。 如果我添加下一个功能、即共享存储器
n´t 以共享内存递增计数器、代码不会到达
while (true)循环。 我可以看到这一点、因为 PRU 是内部的
n´t 周期计数器不再复位。 共享内存
在 A 开始之前间接通过存储在 PRU 数据 RAM 中的变量 ARM
特定地址。 如果我取消注释其中一个地址、则会出现问题
在 main 开始处的赋值、例如 INpSigResultBaseAddrPtr =(易失性
uint32PTR_T *) 0x094;另一方面、如果我取消注释这些分配和
注释掉 R30移出操作 while (true)循环的所有调用
正常运行。 我的一位高级同事给了我一个提示
增加堆栈大小、但这不起作用。 提供的堆栈大小
即使在最深层的函数中、我也需要更多的空间。 我已经做了一些评论
与其他同事一起、他们中没有人能够解释这种行为。
遗憾的是、我们没有任何已经对 PRU 进行编程的专家
使用 PRU C 编译器。 在主机固件端、没有进行任何更改、即旧版本
基于 pasm 的代码仍然可以正常运行。 我已经搜索了
有关 PRU C 编译器以及 PRU 提示和技巧的可用文档
编程n´t、但没有找到有关如何解决问题的任何信息。

您能为我提供任何提示吗? 尤其是、如果您愿意、这将对我有所帮助
如果其中有任何错误、请检查我的构建设置。 或者您可能遇到了
同样的问题。

如果我在 main 的开始和我的 while (1)之间执行任何变量分配
n´t (esp、将 msCounter 设置为0)、while (1)循环不再运行。 一
还检查了生成的.asm 和.map 文件、但它们看起来是这样的
代码应该正确运行。

提前感谢您的帮助。

此致、

Chris

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

    大家好、这个案例可以删除-很遗憾、我没有找到自己删除的可能性。

    上述影响是由错误的链接器命令文件引起的。 我将在该主题中提供提示、在该主题中、我请求有关链接器命令文件的支持。

    此致、Chris

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

    Christian、

    n`t 删除线程。 我们已将线程标记为已关闭并已解决、因此无需后续操作。 n`t 您不介意、请将链接发布到您在此处发布提示的主题帖、以便如果有其他社区成员可以从您的发现中学习。

    谢谢。

    Rahul