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.

[参考译文] PROCESSOR-SDK-AM62X:AM62x M4F 内核上的 GPIO 切换延迟不准确

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1504886/processor-sdk-am62x-gpio-toggling-delay-inaccuracy-on-am62x-m4f-core

器件型号:PROCESSOR-SDK-AM62X

工具/软件:

您好 TI 支持团队:

是在上开发的 AM62x 平台的完整视觉应用 M4F 内核 构建环境。 我遇到了两个与时钟同步或性能调优相关的关键问题、非常感谢您的指导。


问题1:GPIO 切换延迟不准确

我将使用寄存器访问来直接切换 GPIO 引脚、并具有基于 NOP 的时序延迟:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "kernel/dpl/AddrTranslateP.h"
#include "kernel/dpl/ClockP.h"
#include "kernel/dpl/DebugP.h"
#include "kernel/dpl/HwiP.h"
#include "ti_drivers_config.h"
#include "ti_board_config.h"
#include "ti_drivers_open_close.h"
#include "ti_board_open_close.h"
#include "resource_table_no_ipc.h"


#define M4F_GPIO ((volatile CSL_GpioBank_registersRegs*)AddrTranslateP_getLocalAddr(0x04201010))

int main()
{

uint8_t status = 0;

System_init();
Board_init();


/* Open drivers */
Drivers_open();
/* Open flash and board drivers */
status = Board_driversOpen();
DebugP_assert(status==SystemP_SUCCESS);

M4F_GPIO->DIR &= ~(0x2000);

while(1)
{
asm volatile("str %[val], [%[gpio]]" :: [val] "r" (0x2000), [gpio] "r" (&M4F_GPIO->SET_DATA));

// I repeat asm("NOP"); command 1000 times
asm("NOP");

.

.

.

asm volatile("str %[val], [%[gpio]]" :: [val] "r" (0x2000), [gpio] "r" (&M4F_GPIO->CLR_DATA));

// I repeat asm("NOP"); command 1000 times again
asm("NOP");

.

.

.

}

/* Close board and flash drivers */
Board_driversClose();
/* Close drivers */
Drivers_close();

Board_deinit();
System_deinit();

return 0;
}


假设 M4F 以400 MHz 运行(每周期2.5ns)、1000 NOP 应延迟~2.5 µs。 但是、在示波器上、每个 GPIO 高电平/低电平相位耗时 ~ó n 2.94 µs 、从而产生一个完整的周期 ~ó n 5.88 µs —关于 增加17.6% 超出预期。

有趣的是、当我增加 NOP 计数(例如、产生100 µs 延迟)时、示波器结果会变得更加准确。 这表明恒定的开销对更短的延迟产生了更显著的影响。

我的问题:

  • 导致这种意外 GPIO 延迟的原因(例如外设同步、互连延迟、存储缓冲)?

  • 对于从 M4F 内核进行微秒级 GPIO 切换、是否有更确定性的方法或 TI 推荐的方法?

  • 请求摘要

    您能帮我解决以下问题吗?

    1. 从 M4F 切换 GPIO 时、哪些因素会导致固定延迟(~400ns)、如何减少延迟或消除延迟?

    2. 为什么小型双精度 FFT (128点)需要~25ms、以及如何在 AM62x M4F 上进行优化?

    3. 是否存在任何会导致这些延迟的已知时钟同步或互连配置?

    任何见解、文档参考或示例代码都会非常有用。

    此致、


    Soheil

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

    尊敬的 Soheil:
    您能否针对 FFT 问题单独提出一个问题、以便我们能够为您提供更好的帮助?

    谢谢、

    Shreyansh

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

    尊敬的 Soheil:

    就像 Shreyansh 说的那样、请为 FFT 讨论创建一个新主题。

    本主题将用于讨论 GPIO。 我将重新分配给关于 GPIO 的 MCU+ SDK 专家进行进一步评论。

    此致、

    Anshu

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

    尊敬的 Anshu 和 Shreyansh:

    感谢您的建议。

    我在此主题中添加 FFT 计算示例的唯一原因是需要提供更多背景信息并展示另一种观察到异常延迟的情况。 我的主要目的是演示时钟或时序问题可能会影响多个进程、不仅是 GPIO 切换、还包括 FFT 等功能。

    但是,我理解你的观点。 接下来我将专门针对 FFT 问题提出一个单独的查询。

    再次感谢、
    Soheil

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

    尊敬的 Soheil:

    Unknown 说:
    鉴于 M4F 速度以及输入数据的复杂性较低、此延迟似乎过长。 我怀疑可能存在与以下各项相关的问题:

    请在代码中将 M4F_GPIO 定义为局部变量、而不是将其定义为宏。 我可以看到、每次在调用的代码中使用/引用宏时、都会调用 AddrTranslateP_getLocalAddress () API 调用、它在内部调用各种函数并执行更多指令、从而导致延迟增加。

    请参阅以下代码。

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include "kernel/dpl/AddrTranslateP.h"
    #include "kernel/dpl/ClockP.h"
    #include "kernel/dpl/DebugP.h"
    #include "kernel/dpl/HwiP.h"
    #include "ti_drivers_config.h"
    #include "ti_board_config.h"
    #include "ti_drivers_open_close.h"
    #include "ti_board_open_close.h"
    #include "resource_table_no_ipc.h"
    
    
    
    
    int main()
    {
    
    uint8_t status = 0;
    
    System_init();
    Board_init();
    
    
    /* Open drivers */
    Drivers_open();
    /* Open flash and board drivers */
    status = Board_driversOpen();
    DebugP_assert(status==SystemP_SUCCESS);
    
    volatile CSL_GpioBank_registersRegs* M4F_GPIO = ((volatile CSL_GpioBank_registersRegs*)AddrTranslateP_getLocalAddr(0x04201010));
    
    M4F_GPIO->DIR &= ~(0x2000);
    
    while(1)
    {
    asm volatile("str %[val], [%[gpio]]" :: [val] "r" (0x2000), [gpio] "r" (&M4F_GPIO->SET_DATA));
    
    // I repeat asm("NOP"); command 1000 times
    asm("NOP");
    
    .
    
    .
    
    .
    
    asm volatile("str %[val], [%[gpio]]" :: [val] "r" (0x2000), [gpio] "r" (&M4F_GPIO->CLR_DATA));
    
    // I repeat asm("NOP"); command 1000 times again
    asm("NOP");
    
    .
    
    .
    
    .
    
    }
    
    /* Close board and flash drivers */
    Board_driversClose();
    /* Close drivers */
    Drivers_close();
    
    Board_deinit();
    System_deinit();
    
    return 0;
    }

    进行上述更改后、您应该能够看到更好的结果。

    此致、

    Tushar

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

    感谢您发送编修。
    它确实有效  

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

    尊敬的 Soheil:

    感谢您的确认。

    很高兴为您提供Slight smile

    此致、

    Tushar