ZHCZ035C November 2023 – July 2025 AM263P2-Q1 , AM263P4 , AM263P4-Q1
ICSS:读取 LSW 时,读取 64 位 IEP 计时器没有锁定 MSW 逻辑
当低 32 位数据为 0xFFFFFFFC 或更高(在 250MHz 上)时、IEPx 64 位时间戳可能不正确。在这种情况下会更新高 32 位值,但较低的值是旧数字。当 IEP 计数器 (IEP_COUNT_REG1: IEP_COUNT_REG0) 从 ICSS PRU 内核连续读回时,会出现该问题。
示例 1:
第 1 个读数:0x000000D0(高字节):0xFFFFFFFC(低字节)
第 2 个读数:0x000000D0(高字节):0x00000028(低字节)
示例 2:
第 1 个读数:0x000000D7(高字节):0xFFFFFFFC(低字节)
第 2 个读数:0x000000D7(高字节):0x0000002C(低字节)
示例 3:
第 1 个读数:0x000000D6(高字节):0xFFFFFFF0(低字节)
第 2 个读数:0x000000D7(高字节):0xFFFFFFFC (低字节)
如上所示,这会导致计时器增量行为变得非单调,或者计时器差异异常大,如示例 3 中所示。这是由从 IEPx 计数器加载 64 位值时出现的 1 周期竞态条件导致的。
注意:这些权变措施存在于 SDK9.2 和更高版本中
使用 C 语言针对 PRU 的权变措施:
uint64_t timestamp = (uint64_t) (0x2E0010);
/*权变措施从此处开始*/
if ((timestamp & 0xFFFFFFFF) >= 0xFFFFFFFC)
{ timestamp = *(uint64_t*) (0x2E0010); }
/*权变措施在此处结束*/
使用汇编语言针对 PRU 的权变措施:
ldi32 r4, 0xFFFFFFFC ; 0-4 for 250MHz clock
;load 64-bit timestamp to r2:r3
lbco &r2, c26, 0x10, 8
qbgt skip_iep_read_errata. r2, r4
;re-read IEP if IEP_COUNTER_LOW >= 0xFFFF_FFFC
lbco &r2, c26, 0x10, 8
skip_iep_read_errata:
使用 C 语言针对 R5F、A53 的权变措施:
uint64_t getIepTimeStamp64 (void)
{
uint64_t u64Timestamp1 = (volatile uint64_t)(0x300AE010);
uint64_t u64Timestamp2 = (volatile uint64_t)(0x300AE010);
if (u64Timestamp2 > u64Timestamp1)
{
#ifdef __DEBUG
if (((u64Timestamp2 >> 32)-(u64Timestamp1 >> 32)) == 1)
{
/* HW errata fixed due to picking u64Timestamp1*/
if ((u64Timestamp2 & 0xFFFFFFFF) >= (u64Timestamp1 & 0xFFFFFFFF))
{ DebugP_log ("Errata fixed (1): %llx : %llx\r\n",
u64Timestamp1, u64Timestamp2); }
}
#endif
return u64Timestamp1;
}
else
{
#ifdef __DEBUG
if ((u64Timestamp2 & 0xFFFFFFFF) < (u64Timestamp1 & 0xFFFFFFFF))
{ /* Adjust the IEP MSW in the case running into HW errata */
DebugP_log ("Errata fixed (2): %llx : %llx\r\n", u64Timestamp1,
u64Timestamp2); }
#endif
/* HW errata fixed due to picking u64Timestamp2*/
return u64Timestamp2;
}
}