ZHCZ035C November   2023  – July 2025 AM263P2-Q1 , AM263P4 , AM263P4-Q1

 

  1.   1
  2.   摘要
  3. 1使用说明和公告模型
  4. 2器件修订版本 1.0 使用说明和公告
    1. 2.1 器件修订版本 1.0 使用说明
      1.      i2324
      2.      i2488
    2. 2.2 器件修订版本 1.0 公告
      1.      i2189
      2.      i2310
      3.      i2374
      4.      i2311
      5.      i2345
      6.      i2351
      7.      i2352
      8.      i2353
      9.      i2354
      10.      i2356
      11.      i2357
      12.      i2358
      13.      i2359
      14.      i2383
      15.      i2392
      16.      i2393
      17.      i2394
      18.      i2401
      19.      i2404
      20.      i2405
      21.      i2426
      22.      i2427
      23.      i2428
      24.      i2433
      25.      i2438
      26.      i2439
      27.      i2485
      28.      i2486
  5. 3商标
  6. 4修订历史记录

i2433

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;
    }
}