您好!
我的客户正面临使用 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)是否有调试此问题的建议?
如果您需要客户提供的更多信息、请告诉我。
谢谢、此致、
田志郎一郎