工具/软件:
您好 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 -