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.

[参考译文] AM263P4-Q1:OSPI Flash_Read ()会使 FreeRTOS 置为有效

Guru**** 2402105 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1493187/am263p4-q1-ospi-flash_read-causes-freertos-assert

器件型号:AM263P4-Q1

工具/软件:

关于示例"ospi_flash_IO_am263px-cc_r5fss0-0_nortos_ti-arm-clang"。 它是裸机、只能运行一次。

我使 FreeRTOS 在1ms、2ms、4ms、8ms 和20ms 下运行一些时间任务。

由于闪存操作需要很长时间,所以我   在 FreeRTOS 中从 vApplicationIdleHook 调用 Flash_write ()等函数。 如果我使用20ms 任务、当然会溢出。

我能够写大量的数据块,比如32k,没有问题。 通过"无问题",我的意思是  Flash_write ()返回成功 ,上面列出的时间任务继续中断空闲挂钩并正常执行。

但是,如果我做的 Flash_read ()大于约1k ,应用程序将在以下断言陷阱中停止。

1.你能想到为什么 Flash_write ()工作正常,但 Flash_read ()引起 freeRTOS 陷阱的原因吗?

2.在 FreeRTOS 环境中进行长时间闪存操作的最佳方法是什么? 我正在使用空闲挂钩、但这是最佳方法吗?

谢谢你。

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

    您好:

    我就此与我们的专家进行了沟通、请期待第二天左右的答复。

    感谢您的耐心、

    Susan

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

    您好:

    请允许我检查一下、然后返回给您。

    此致、

    Aswin

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

    您好:

    你能想到为什么 Flash_write ()工作正常,但 Flash_read ()会引起 freeRTOS 陷阱的原因吗?

    您能在代码中检查以下内容吗

    是否为 OSPI 闪存读取启用了 DMA。 此外、还缓存了读取/写入操作下的闪存区域。 您能否检查 MPU 配置是否与 MCU_PLUS_SDK 中的 ospi_flash_io 示例对齐。 审议中的区域必须有严格的秩序。

    2.读缓冲区是否分配在空闲任务的栈中? 如果缓冲区是本地缓冲区、堆栈大小是否足以进行闪存读取操作?  

    3.能否检查任务的栈是否溢出?

    4.器件中使用 XIP? 如果是、代码是否负责闪存本身的闪存操作?  

    在 FreeRTOS 环境中、执行长时间闪存操作的最佳方法是什么? 我正在使用空闲挂钩、但这是最佳方法吗?

    您可以使用低优先级任务、而不是使用空闲任务来执行闪存操作。 然后、其他任务可以与该任务通信以执行所需的闪存操作。

    此致、

    Aswin

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

    您好、Aswin、

    感谢您的回复、并对延误深表歉意。

     

    1. 是否为 OSPI 闪存读取启用了 DMA。

    是的、没错。

    另外还有一个被缓存的读/写操作闪存区域。 您能否检查 MPU 配置是否与 MCU_PLUS_SDK 中的 ospi_flash_io 示例对齐。 所审议的区域必须严格排序。

    这是用于写入和读取操作的 RAM 的 MPU 配置。 我尝试了缓存和强烈命令,但它没有区别:

    2. 读取缓冲区是否分配在空闲任务的栈中?

    否、但该示例也不使用堆栈。

    3. 您能否检查任务的栈是否溢出?

    这种情况不太可能发生、因为我不将堆栈用于读取缓冲区、并且 FreeRTOS 也会进行堆栈溢出检测。

    4. 在器件中使用的 XIP 中?

    否、未使用 XIP。

    您可以使用低优先级任务而不是使用空闲任务来执行闪存操作。

    但空闲是一项低优先级任务、不是吗? 是否有理由怠速不会同样有效?

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

    尊敬的 Kier:

    您是否可以发送正在处理的项目应用程序?

    此外、您使用的是定制电路板还是 EVM (CC 或 LP)。 如果是定制板、您能告诉我正在使用哪个闪存吗?

    此致、

    Aswin

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

    尊敬的 Aswin:

    谢谢你。 我正在处理一个项目、它演示了我可以向您提供的问题、但这不是我的实际项目。

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

    尊敬的 Kier:

    好极了。 您能分享吗?

    此致、

    Aswin

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

    我使用了一个小得多的读取缓冲区来解决这个问题。

    以前,我使用的读取缓冲区大于要读取的大小,因此只调用了一个 Flash_read ()来简化调试。 但是,如果我将缓冲区大小减小到512字节,然后用递增偏移多次调用 Flash_read (),那么它不会成为断言陷阱。

    由于生产解决方案中会使用较小的读取缓冲区、因此我想我们可以关闭这个窗口、而无需担心根本原因。