你(们)好。
您的支持将我重定向到该论坛、并要求我发布我的问题
一个示例。 遗憾的是、我无法在此提供我的 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