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.

[参考译文] 修改 pdk_am335x_1_0_17时,出现无限循环错误。

Guru**** 2589280 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/976830/modifying-pdk_am335x_1_0_17-an-endless-loop-error-happened

您好、E2E、

我正在修改我们定制板的 PDK。 并遇到一些错误。

PDK 版本: pdk_am335x_1_0_17

该错误发生在 GPMC_v1.c 文件 GPMC_CONTRAL_v1 函数中。

\ti\pdk_am335x_1_0_17\packages/ti\drv\gpmc\src\V1\gpmc_v1.c

静态 Int32_t GPMC_CONTRAL_v1 (GPMC_Handle handle、uint32_t cmd、void *参数)

  if ((handle!= NULL)&&(arg!= NULL))

在这一行中、我发现如果我不使用这样的评论、将会发生无限循环错误。

  if ((handle!= NULL)/*&&(arg!= NULL)*/)

这就是发生无限循环的地方。  

\ti\pdk_am335x_1_0_17\packages/ti\board\src\flash\nand\GPMC\nand_GPMC.c

   while (intrStatus = 0)

    {

        内部状态= NAND_gpmcElmIntStatusGet (handle、0);

    }

执行此功能后、intrStatus 仍为0、"while"保持启用状态。

当我使用 Step into 来查找错误时,我会找到这个。在调用了这么多函数之后,我在该文件中找到了一个函数,这看起来很奇怪。

TI\pdk_am335x_1_0_17\packages\ti\cSL\hw_types.h

静态内联 UINT32_t HW_RD_FIELD32_RAW (uint32_t addr、
uint32_t mask、
uint32_t 移位)

uint32_t regVal =*(volatile uint32_t *)((uintptr_t) addr);//行1
regVal =(regVal & mask)>> SHIFT;//line 2
/*在此之后不调用任何函数。 如有必要、将实现为宏*/
hw_sync_barer();
return (regVal);

ADDR = 0x48080018、MASK = 1、SHIFT = 0

如果我运行此操作,在第1行 regVal 得到偶数并返回0之后。 这个0最终成为之前 的 intrStatus 的图。

这就是我的问题。 如果需要更多代码、请告诉我。 我将使用"插入文件"或一些粘贴库或向您显示我的代码的内容。

感谢你的帮助

韩文

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

    您是否曾尝试在 TI EVM 上运行此软件、以查看 TI 评估硬件是否出现同样的问题? 我不清楚是 TI GPMC 驱动程序存在问题、还是由于通过 GPMC 进行硬件交互而导致问题。 请帮助我们了解您的硬件是什么样子的。 您是否在定制硬件上连接 GPMC NAND。 发生问题时、器件和闪存之间会发生什么交互。  

    此致、

    Rahul  

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

    您好 Rahul、

    很抱歉、我没有回复这么长时间。我知道错误发生的原因。错误不是硬件错误。

    在 pdk_am335x_1_0_17\packages/ti\board\src\flash\nand\GPMC\nand_GPMC.c 中,以下行:

    静态空 NAND_gpmcElmErrLocProcessingStart (GPMC_Handle handle)

    GPMC_CONTROL (Handle、GPMC_V1_CMD_ELMSTARTERRLOCPROC、NULL);

    解析此函数时,它会调用 GPMC_CONTROL 函数(在 pdk_am335x_1_0_17\packages/ti\drv\gpmc\src\gpmc_drv.c 中)

    并调用 GPMC_CONTRAL_v1 (在 pdk_AM335x_1_0_17\packages/ti_drv\GPMC\src\V1\GPMC_v1.c 中)

    静态 Int32_t GPMC_CONTRAL_v1 (GPMC_Handle handle、uint32_t cmd、void *参数)

    GPMC_v1_HwAttrs const *hwAttrs;/* GPMC 硬件属性*/
    uint32_t *参数=(uint32_t *)参数;
    uint32_t dataAddr;
    uint32_t dataSize;
    int32_t RetVal = GPMC_STATUS_ERROR;

    /*输入参数验证*/
    if ((handle!= NULL)&&(arg!= NULL)//此处我们需要 arg!= NULL 以确保它继续执行"if line"之后的操作,但在前一代码中,arg 为 NULL。

    因此、错误发生、如果我删除 了 arg!= NULL 部分、它也会继续运行。

    此致、  

    韩文