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.

[参考译文] CCS/TMS320F280049C:Driverlibs 中的程序存储器使用效率低下?

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/935670/ccs-tms320f280049c-inefficient-program-memory-use-in-driverlibs

器件型号:TMS320F280049C

工具/软件:Code Composer Studio

您好!

我用完了 RAM (必须更改链接器文件以分配更多内容)、因此我检查了存储器使用情况、发现 eCAP 初始化占用了648个字...这对于几行代码来说非常重要。 我开始想知道这是否可能是由驱动程序库的使用引起的、并将 driverlib 命令替换为 bitfield 命令:

ECAP_disableInterrupt (ECAP1_base、
   (ECAP_ISR_SOURC_CAPTURE_EVENT_1 |
   ECAP_ISR_SOURC_CAPTURE_EVENT_2 |
   ECAP_ISR_SOURC_CAPTURE_EVENT_3 |
   ECAP_ISR_SOURC_CAPTURE_EVENT_4 |
   ECAP_ISR_SOURC_COUNTER_OVERflow |
   ECAP_ISR_SOURC_COUNTER_PERIOD |
   eCAP_ISR_SOURC_COUNTER_COMPARE);
ECAP_clearInterrupt (ECAP1_base、
   (ECAP_ISR_SOURC_CAPTURE_EVENT_1 |
   ECAP_ISR_SOURC_CAPTURE_EVENT_2 |
   ECAP_ISR_SOURC_CAPTURE_EVENT_3 |
   ECAP_ISR_SOURC_CAPTURE_EVENT_4 |
   ECAP_ISR_SOURC_COUNTER_OVERflow |
   ECAP_ISR_SOURC_COUNTER_PERIOD |
   eCAP_ISR_SOURC_COUNTER_COMPARE);

成为:

EALLOW;
   ECap1Regs.ECEINT.ALL = 0;
   ECap1Regs.ECCLR.ALL = 1;
EDIS;

内存使用量从648个字增加到645个字。 EALLOW 和 EDIS 指令占用2个字、但我可以将它们与所有 EALLOW 受保护的指令捆绑在一起、以对其进行修整、而不是针对每个指令集重复它们。 如果这对于其余指令都适用、我可以通过替换指令来将代码大小减小30-40%。  

这是我的编译器设置问题、还是 driverlib 指令在内存中效率如此低? 因为在我要达到的速率时、 我将在计划程序的25%下耗尽 RAM、并且必须将此内容移至闪存、每次我想检查指令更改的效果时、我实际上都不想继续写入闪存。

提前感谢

Peter

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

    尊敬的 Peter:

    编译器会立即取消一条 EDIS 指令、后跟一条 EALLOW 指令。 由于这些函数是内联的、禁用函数中的最后一条 EDIS 指令和清除函数中的第一条 EALLOW 指令将被取消。

    此致、

    Veena

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

    尊敬的 Peter:

    您看到差异的原因是、driverlib 函数会对 ECAP 寄存器执行读-修改-写操作。 而对于上述的位域代码、则会直接写入寄存器。 如果是 driverlib、在寄存器读取期间会花费额外的周期。

    此致、

    Veena

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

    因此、为了确保我得到了正确的结果:

    它不是编译器设置、也不是我的代码。 默认情况下、driverlib 指令需要更多的存储器、因为它们针对同一任务执行了更多的步骤。 对吧?

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

    尊敬的 Peter:

    在这种情况下、driverlib 和 bitfield 代码执行的任务不同。 一个执行读取-修改-写入、另一个执行只写入。

    driverlib 函数对 ECAP 寄存器-> reg &=值执行读取修改写入。  

    位域代码直接写入寄存器而不读取当前值-> reg = value。

    无论您使用 driverlib 或位字段代码、第1个代码都会占用更多的周期。 在这种情况下、由于禁用了所有中断、因此您可以直接写入寄存器而无需读取。 等效的 driverlib 代码为  HWREGH (ECAP1_BASE + ECAP_O_ECEINT)= 0;。 这应采用与位字段代码 ECap1Regs.ECEINT.ALL = 0相同的代码大小;

    此致、

    Veena