This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM6548:读取矢量中断管理器 (VIM) 中的 VIM_VEC_INT_j 时出现死锁

Guru**** 2894990 points

Other Parts Discussed in Thread: AM6548

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1634654/am6548-deadlock-when-reading-vim_vec_int_j-in-vectored-interrupt-manager-vim

器件型号: AM6548

您好、

我之所以提出这项质询、是因为我无法就原来的质询作出答复。 也许是因为我迟到了我的答复(抱歉)。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1623622/am6548-deadlock-when-reading-vim_vec_int_j-in-vectored-interrupt-manager-vim

我的原始问题是:

我们有一个在 AM6548 R5_0 内核上运行的应用。 出于安全原因、我们执行的任务是检查许多寄存器是否存在意外更改。 有时、当 R5 读取 VIM 中的 VIM_VEC_INT_j 寄存器(0x40F82000 +公式)时、它会陷入某种僵局。 我们已经尝试使用调试器连接到 R5_0 内核、但这无法实现(请参阅随附的图像)。 可以连接到其他内核 (R5_1、A53_x_y)。 当连接到其他内核之一 (R5_1) 时、可以读取 AM6548 SOC 上的存储器和寄存器。 对存储器和寄存器进行一些分析后、在读取 VIM_VEC_INT_j 寄存器时发生中断、似乎会发生死锁。

您能解释为什么会出现这种僵局吗?
我们如何监控 VIM_VEC_INT_j 寄存器?

image.png

下面是一些重现问题的代码示例:

#define READ_REGISTER32(address) (*(volatile uint32_t *)((uint32_t)(address)))

int main()
{
    uint32_t value = 0;
    uint32_t offset = 0x00002000;
    uint32_t j = 0;
    uint32_t count = 0;

    /* Initialize board (pinmux, DMSC, interrupt controller, ... */

    while (1)
    {
        offset = 0x00002000;

        for (j = 0; j < 0x00000200; j++)
        {
            /* Disable interrupt */
            setInterruptEnabled(FALSE);

            value = READ_REGISTER32(0x40F80000 + offset);

            /* Enable interrupt */
            setInterruptEnabled(TRUE);

            if (count == 1000000)
            {
                /* Print to see alive */
                printf("o 0x%x v 0x%x\n", offset, value);
                count = 0;
            }

            offset += 4;
            count++;
        }
    }

    return 0;
}

此致
约翰尼·莫斯特拉姆

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Johnny、

    感谢您分享上述示例代码。 我将尝试在我结束时重现问题、并提供相应的反馈。

    请留出一些时间来处理此问题。

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Johnny、

    感谢您的耐心。 我能够使用上面提供的示例代码重现此问题。

    VIM_VEC_INT_J 寄存器读取会暂停 MMR 接口、直到读取完成。  

    在寄存器读取过程中、似乎会发生某种竞态条件。 我还看到、此区域的默认 MPU 配置严格排序、默认情况下也不允许执行。

    我已经为 VIM_VEC_INT_j 寄存器添加了另一个 MPU 配置设置、将其标记为非缓存并允许用户执行。 此设置现在不会重现此问题。  

    请参阅以下配置设置。

    尝试进行相同的配置并告知我们结果。

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Tushar:

    我已经尝试了您建议的配置。 我们有自己的 MPU 配置(基于 TI PDK 8)、但它应该与您列出的配置相同。

        {
            .regionId         = 11U,
            .enable           = 1U,
            .baseAddress      = 0x40F82000U,
            .size             = armutil__MpuRegionSize_4KB,                     // = 11
            .subRegionEnable  = ARMUTIL_MPUREGION_SUB_REGION_ENABLE_ALL,        // = 0
            .neverExecute     = 0U,
            .accessPermission = ARMUTIL_MPUREGION_ACC_PERM_PRIV_USR_RD_WR,      // = 3
            .shareable        = 0U,
            .cacheable        = (uint32_t)TRUE,
            .cachePolicy      = ARMUTIL_MPUREGION_CACHE_POLICY_NON_CACHEABLE,   // = 0
            .memoryAttributes = 0U,
        },
    

    在读取 VIM_VEC_INT_j 寄存器停止之前需要更长的时间。 当我使用调试器连接到 R5 内核 (R5_0 和 R5_1) 时、收到了略有不同的错误消息。

    此致

    Johnny

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Johnny、

    可以看到、在您的配置中、可缓存区域标记为 true。  

    确保配置如下所示。

    此致、

    Tushar