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.

[参考译文] TMS320F28388D:缓冲器索引操作所花费的时间太长(按预期)

Guru**** 2390755 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1480290/tms320f28388d-buffer-index-operation-cost-too-much-time-as-expected

器件型号:TMS320F28388D

工具与软件:

您好!

我使用 CLA 来监控32个输入通道的状态。 ClaTask1将由 TINT1触发、并且 Timer01设置为20usec。 在 ClaTask1中、它将 在任务启动时在测试输出引脚上设置、然后执行 recordStateInBit()、然后在任务结束时关闭测试输出引脚 测试输出引脚状态将是 ClaTask1的工作时间。

我面临的问题是、如果我使用"1"。 读取引脚的方法、那么 ClaTask1的工作时间将非常长、大约50usec。 如果我使用"2"。 这样,ClaTask1的工作时间就非常短,大约8usec。 但我认为这不会导致工作时间如此不同。 您对此有什么看法吗?

将 ChPinIdxBuf 置于 RAMLS7中



此致、

诺曼

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

    嗨、Nai:

    ChPinIdxBuf 数组使用的数据类型是什么?

    由于以下原因、我希望选项2需要更长的时间:在选项2中、将#define 值传递到 GPIO_readPin ()函数中、这意味着函数的输入将在编译时处理。 这最大限度地减少了 CPU 在运行时所需的指令数量。 在选项1中、CLA 本身需要执行指令以 th  在将值传递给函数之前抓取 I'PinIdxBuf 元素。  

    在调试代码时、通过在 CCS 窗口中导航至 View >> Disassembly、可以查看正在执行的实际汇编代码。 这将进一步说明不同行具有不同执行时间的原因。 选项1可能生成更少的汇编行以供 CLA 运行。  

    需注意的另一点是、您通常只想调用 CLA 代码中的内联函数以减少 CLA 完成的分支指令(因为 CLA 的堆栈比正常 CPU 更小、称为暂存区)。 我建议创建 recordStateInBit()和内联函数。  

    此致、

    Delaney

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

    尊敬的 Delaney:

    真的非常感谢您的建议、我检查了反汇编代码、我有一些结论:

      GPIO_readPin (uint32_t 引脚)函数中有除法和 模数数学、我知道 CLA 不能很好地进行除法和模数 运算。

    然后、我检查了反汇编中的选项1和选项2、

     我发现、如果我使用选项 1、   $C$L4器件将多次重复、而重复次数等于(PIN%32U)。 我的 MONITOR_CHANNELS 定义为32、 TestInputPin 被定义为91。 因此、 $C$L4部件将在 ClaTask1一次中重复32*27次。 这实际上将花费 数十微秒。 我不太熟悉 CLA 的指令、但我认为该部分与模数 运算有关。

     (选项1诊断代码)

    我发现,如果我使用选项2,反汇编代码只有很少的指令,我认为是因为选项2 传递了#define 值,所以  GPIO_readPin ()中的除法和模数数学可以由编译器操作,以缩短运行时的大量时间。

     (选项2诊断代码)

    我的理解是否正确?

    然后、因为在本例中、要监控的引脚在运行时不会更改、所以我想我可以直接调用 GPIO_readPin (PIN_MONITOR_x)  32次、并且将对 PIN_MONITOR_1~PIN_MONITOR_32进行#define 、这样我就可以让编译器进行除法和模数运算以缩短 CLA 的运行时间。 虽然这使得代码看起来很长很丑、但这是我能想到的最好方法、还是有其他方法?

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

    嗨、Nai:

    是的、您回答正确。  如您所述,通过对 GPIO_readPin ()的输入使用不同的编译器定义,您将获得最佳性能。 遗憾的是、CLA 代码有时需要一些更实用的代码、因为指令集较小、对于某些 操作而言不那么有效。

    此致、

    Delaney