工具/软件:
您好 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 推荐的方法?
-
请求摘要
您能帮我解决以下问题吗?
-
从 M4F 切换 GPIO 时、哪些因素会导致固定延迟(~400ns)、如何减少延迟或消除延迟?
-
为什么小型双精度 FFT (128点)需要~25ms、以及如何在 AM62x M4F 上进行优化?
-
是否存在任何会导致这些延迟的已知时钟同步或互连配置?
任何见解、文档参考或示例代码都会非常有用。
此致、
Soheil -