Thread 中讨论的其他器件: SYSBIOS、 AM3359
工具/软件:TI-RTOS
具有 AM3352的定制板
SYSBIOS 6.46.1.38
XDC 工具3.32.1.22
我在 Main 中、所以除了 main 之外、不应该运行任何内容。
我们有一个例程、允许我们使用时间戳模块等待准确的时间量。 我们正在将产品转换为 AM3352、我需要确保例程仍然准确。 以下是例程:
void waitusec( uint32 uSDelay )
{
uINT task_restore_key = Task_disable();//禁用任务,这样我们就不会被更高的任务抢占。 *
U64 usec_delay_in_ticks = 0;
U64 StartTicks = 0;
U64电流技巧= 0;
Types_FreqHz 频率;
Types_Timestamp64 BigTicksStamp;
* GPIO2_CLEARDATAOUT = TEST_PLET_OUTPUT;
if (uSDelay!= 0)
{
/*确定达到等于1uS 所需的节拍数。 *
TIMESTAMP_getFreq (&freq);
usec_delay_in_ticks =(U64)((freq.lo / 1000000U)* uSDelay);
/*我们不必担心检查是否有翻滚问题。 我们的最大 CPU 频率为1GHz、或每"周期" 1ns。 a U64
变量为1.8 x 10至19的功率(真的很大)。 Timestamp 需要超过1500年的时间。
顺便说一下、时间戳模块从内核 AM3352寄存器(TSCH 和 TSCL)获取信息。 不使用计时器。 *
TIMESTAMP_get64 (&BigTicksStamp);
StartTicks = BigTicksStamp.hi;
StartTicks = StartTicks << 32U;
StartTicks = StartTicks | BigTicksStamp.lo;
while (CurrentTicks <(StartTicks + usec_delay_in_ticks))
{
/*等待延迟到期时不执行任何操作。 *
TIMESTAMP_get64 (&BigTicksStamp);
CurrentTicks = BigTicksStamp.hi;
CurrentTicks = CurrentTicks << 32U;
CurrentTicks = CurrentTicks | BigTicksStamp.lo;
}
}
* GPIO2_SETDATAOUT = TEST_PLETED_OUTPUT;
Task_restore (task_restore_key);//将任务恢复到其先前状态。 *
}
GPIO 输入/输出用于调试目的、以便能够在示波器上为例程计时
我发现、此例程所需的时间是预期的2-3倍。 当我等待1us 时、我得到3us、当我等待10us 时、我得到20us。
为什么这不准确? 是否需要启用一些时钟才能正确获得节拍?