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.

[参考译文] TMS570LC4357:F021 API Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/822690/tms570lc4357-f021-api-fapi_domarginreadbybyte-does-not-return

器件型号:TMS570LC4357

您好!

我的客户正面临使用 F021闪存 API 的奇怪行为。
代码使用 Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy
该代码在100~1000 μ s 时间内挂起一次,并且 Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy
当问题发生时、似乎没有代码正在运行(似乎不再接受 ISR)

客户需要在几天内解决该问题、因为他们的最终客户计划从今年8月开始使用该系统。
非常感谢您在这个问题上提供的快速帮助。

环境:
器件:TMS570LC4357
使用 F021闪存 API 版本02.01.01、F021_API_CortexR4_BE_L2FMC_V3D16_NDS.lib

在调试期间、客户发现如果在禁用中断的情况下执行闪存 API、问题消失。
请参阅以下代码。
taskENTER_critical ()/taskEXIT_critical ()是 SAFERTOS 函数,并且它们之间的 FIQ 以外的中断被禁用。

/*在某些情况下,任务希望在关键区域内执行操作,因此调用 taskENTER_critical ()来禁用中断。 *

taskENTER_critical ();/*<===== 此处禁用中断*/

/*初始化银行*/

(空) Fapi_initializeFlashBanks (Freq_in_MHz);

/*操作已完成。 退出关键区域。 *

taskEXIT_critical ();/*<===== 此处启用中断*/



/*读取数据检查*/

lese_bytes = ui_len;

while (lese_bytes>0)

{

/*在某些情况下,任务希望在关键区域内执行操作,因此调用 taskENTER_critical ()来禁用中断。 *

taskENTER_critical ();/*<=========== 在此处禁用中断*/

/*调用闪存读取 API */

(void) fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByte (((((unsigned char *) sec_address、(unsigned char *) buf

/*操作已完成。 退出关键区域。 *

taskEXIT_critical ();/*<===== 此处启用中断*/

/*偏移地址增量*/

sec_address =(unsigned int *)(unsigned long int) sec_address + read_size);

/*存储地址增量*/

buf_address += read_size;

/*字节编号递减*/

elee_bytes -= read_size;

/*检查剩余的字节编号*/

if (elime_bytes < FLS_Sector_write_size_MAX)

{

read_size = elee_bytes;

}

} 


在上述代码执行期间、可能会发生一些中断。 它们是计时器(OS 节拍)、I2C、ADC 和 UART。
Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy
根据 F021 API 文档(SPNU501H)、在禁用中断的情况下调用这些 API 似乎没有限制。

Q1)是否需要在禁用中断的情况下调用 Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByBy 如果是、原因是什么?

Q2)是否存在导致器件冻结的可疑客户使用点?

Q3)是否有调试此问题的建议?

如果您需要客户提供的更多信息、请告诉我。

谢谢、此致、
田志郎一郎

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

    Tashiro-san、您好!

    Q1:F021闪存 API 不会禁用中断。  只有在存储中断矢量的组上有一个激活的闪存操作(擦除、编程)时、才需要禁用中断。

    Q2:您的客户是否使用 FEE 驱动器从 EEPROM 读取数据并将数据写入 EEPROM (组7)? 如果您使用闪存 API、在闪存组被初始化后、闪存组应该被激活并且扇区必须在访问扇区之前被启用。

    Q3:当代码被卡住时、您是否检查 了寄存器值? FBBUSY、FEDACSTATUS 等


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

    您好 QJ、

    感谢您的快速回复!
    我从客户那里获得了一些更新。

    此问题似乎与勘误表 L2FMC#5有关。
    客户对组7使用内存类型“正常”。
    将内存类型更改为“Device”(设备)后,问题就消失了。

    但不清楚为什么 L2FMC#5会导致设备死锁。
    我想它会导致一些异常(UNDEF、中止等)

    客户在出现问题后(两次)进行了寄存器转储。
    FBBUSY (FlashWrapper_FBUSY)= 0x7C (01111100b)、因此 bank0/1/7不忙。
    未设置 FEDACSTATUS。

    e2e.ti.com/.../3377.1st_5F00_dump.txt

    e2e.ti.com/.../7271.2nd_5F00_dump.txt

    根据 PC 和 CPSR、代码处于 FIQ 模式。
    LR (0x0020872C)指向计时器 ISR。
    您是否知道这些寄存器转储会发生什么情况?

    谢谢、此致、
    田志郎一郎

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

    您好 QJ、

    客户发现即使使用勘误表 L2FMC#5解决方法也仍然出现类似问题(目前仅发生一次)。
    但是、这种情况会大幅减少。

    无权解决方法:500到5000次
    解决方法:50000次后仅一次

    客户也在测试中断禁用(taskENTER_critical / taskEXIT_critical)代码。
    使用此解决方法、到目前为止、在120000时间内未观察到任何问题。

    谢谢、此致、
    田志郎一郎