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.

[参考译文] F28M36P63C2:优化对 ADC1Regs 的访问速度慢、如何提高代码速度?

Guru**** 2387830 points
Other Parts Discussed in Thread: F28M36P63C2, C2000WARE, CONTROLSUITE
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1194305/f28m36p63c2-optimizing-access-to-adc1regs-is-slow-how-to-increase-code-speed

器件型号:F28M36P63C2
Thread 中讨论的其他器件: C2000WAREcontrolSUITE

尊敬的所有人:

我在 F28M36P63C2的 C28上的代码 会定期更改 ADC 输入引脚。 C28以150MHz 的全速运行。 为此、我使用以下函数:

EALLOW;
TP4_ON;
 memset ((void*)&Adc1Regs.ADCSOC0CTL.all、0x3006、16);
TP4_OFF;
EDIS;

现在、我想优化我的代码、并想知道为什么 memset 函数采用3.6µs。 我尝试了不同的方法来减少它、即尝试从 RAM 运行代码、但它不成功。 我想访问 ADc1Regs 需要额外的等待状态吗?

我如何改进时间行为、任何提示都是非常受欢迎的。

此致、

Karl

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

    您好、Karl、

    我正与其他专家联系、向他们询问这个问题、因为我不熟悉 memset 函数的详细信息。

    此致、

    Ben Collier

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

    谢谢 Ben、

    同时、我尝试通过一个递增指针来分段访问 Adc1Regs 寄存器。 速度相同、也很慢。 我认为 Adc1Regs 可能需要一些时间来获得新值、但我在文档中没有找到任何东西。

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

    Karl、

    C28通过模拟通用接口总线(ACIB)访问 ADC、该总线在每个时钟周期限制为8位读取/写入。  这将包括在 DMA 或 ARM 尝试与您的上述写入同时进行读取时可能发生的任何仲裁。

    假设情况并非如此、我认为 ACIB 以 ADC 时钟速率运行、因此我将仔细检查您用于生成该域时钟的分频器、以及它是否等于您在上面看到的时间。

    在最大条件下、ADC 时钟最大值= 60MHz 或16.67ns 周期。  上面显示的写入指令是一个16位寄存器写入、因此完成此操作需要33ns。  因此、我同意3.6us 过慢、但我们需要检查 ADC 时钟的配置方式。

    我还想看看我们在 C2000Ware 中提供的示例文件、我们应该具有类似的配置函数、 如果其他所有内容都相等(时钟速率等)、您可以看到这些写入函数是否提供了与使用当前代码中的 memset 指令类似的性能。

    最棒的

    Matthew

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

    Matthew、

    非常感谢你的帮助。 我检查了 ADC 时钟。 C28以150MHz (PLLSYSCLK)运行、ADC 时钟分频器设置为4、因此 ADC 和 ACIB 应以37.5MHz (ASHSCLK)运行。 这些设置来自 controlSUITE 关联演示文件。  

    memset 函数写入16 个 ADCSOCxCTL 寄存器。 在37.5MHz 或26.67ns 时、一个写入周期应为53.33ns、16个写入周期应为853.33ns。 但在我的例子中、它是3.6µs μ A。

    我不使用 memset、而是使用了16个单写入指令、结果是相同的:3.6µs。

     

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

    Karl、

    感谢您确认时钟设置。  

    我想您会提到这一点、但要确定的是、在此期间、没有任何其他通过 M3对 ACIB 的访问?  我知道它可以读取 ADC 结果、但您很可能会在 M3停止的情况下调试 C28x、但需要确定。

    让我由一位同事来运行、看看我是否忘记了该器件的总线时序。

    最棒的

    Matthew

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

    Karl、

    我过于乐观地说、写入总共需要2个周期(实际写入以2个8位块发生)、我忽略了地址总线和一些总线仲裁。

    下面是 TRM ACIB 一章(第894页)中的 C/P、它更详细地介绍了时序。  从16位以下写入开始、16位写入可能需要8-10个 ASYS 周期。  这将为16个连续写入提供3.41us-4.27us 的范围、这与您看到的时序相匹配。

    最棒的

    Matthew