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.

[参考译文] TM4C1294NCPDT:TM4C1294NCPDT 闪存写入问题

Guru**** 2473260 points
Other Parts Discussed in Thread: TM4C1294NCPDT, EK-TM4C1294XL, TM4C123GH6PM, TM4C129ENCPDT, SEGGER

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/671683/tm4c1294ncpdt-tm4c1294ncpdt-flash-write-issue

器件型号:TM4C1294NCPDT
主题中讨论的其他器件: EK-TM4C1294XLTM4C123TM4C123GH6PMTM4C129ENCPDTSEGGER

您好!

在我的项目中执行闪存擦除/写入操作期间、我遇到了一个奇怪的问题。 我正在使用 TM4C1294NCPDT 微控制器、将其内部闪存拆分为两个相等的部分、同时我还在使用镜像模式。 因此、在我的项目中、我执行固件升级过程、将数据写入闪存的未使用部分、因此、如果固件从闪存的较低部分(0x00000000)启动、则写入较高部分(从0x00080000开始)、反之亦然。

问题是在 FlashEras()或 FlashProgram()函数期间冻结 CPU,此时所有内核寄存器的值完全相等。 这些函数来自 TivaWare 2.1.4.178。 我尝试使用这些函数的 MAP_版本、结果相同。 您可以在第一张图片上看到 MAP_FlashEras()的问题。 困难的是、即使在项目的其他部分更改某些代码、问题也会消失或再次出现。

我成功创建了演示相同问题的简单项目、可以在 EK-TM4C1294XL Launchpad 板上运行。 该项目只会将某个计数器从0x90000写入到0x100000。 在我的设置中、如果您只是注释掉、问题就会消失   

vTaskDelayUntil (&ui32LastTime、30000 / portTIk_RATE_MS); 

并取消注释下一行  

//while (1){}; 

在'main.c'文件中的'FlashWrTask()'函数中。

e2e.ti.com/.../FlashFailureTest.zip

要运行我的项目、请在'Project Properties -> CCS General -> Main'选项卡上将'Linker comand file'设置为'FlashFailureTest.cmd'。 并将'C/C++ Build->Build Variables'选项卡上的 TIVAWARE_DIR 变量设置为您的 TivaWare 路径。

该项目使用:

  • FreeRTOS v9.0.0
  • TivaWare 2.1.4.178
  • TI v16.9.7.LTC 编译器
  • CCS 7.2.0.00013

有人能帮我确定此问题的根本原因吗?

硬件中是否可能有错误? 我在 TM4C123 CPU 中发现了类似的问题

此致
Dmitry

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、希望我能提供帮助-(此处为带 MCU 的闪存"擦除/写入"-超出了我的经验。) 所以经常-建议海报"增加堆叠"。

    您的帖子的卓越性必须加以注意-细节很好-叙述、屏幕盖和"使用列表"肯定会对"更称职"的其他人有所帮助...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Dmitry、
    感谢您妥善记录此问题。 我已导入您的项目并重新创建了问题。 就像您在调试时遇到问题一样、因为当 CPU 锁定时、返回的所有信息都无效。 我很期待这件事。

    我怀疑由于某种原因 CPU 试图对正在编程或擦除的闪存组进行读取或写入。 在这种情况下、闪存包装程序将 CPU 置于保持状态(非常长的等待状态)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bob:

    由于 CPU 能够"检测"(部分)"问题/麻烦/不合规" (通过将其引导至长时间保持来证明)-而不仅仅是"暂停"-不能  (部分-甚至是轻微的)识别问题-额外提供?  

    显然、"没有工作! (小的“街头游戏”——“使联合游戏变得更加活跃”。) — —也许你可以“上行”——大多数东西都能击败,“被卡住(很长时间)!”  

    Fi/I 正在实施这样的"故障识别"-对于100A+ BLDC 控制器-强制在(非常)恶劣的环境中运行。 "确定此类问题"(以便 可以发起现场、对抗的防御)现在是 我们的问题,"第一个问题!"    (我们从未/从未(甚至)考虑过" 长期搁置!")

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    这只是我的猜测而已。 如果闪存正在被擦除或编程并且 CPU 试图读取闪存、CPU 将被保持直到擦除或编程操作完成。 它不应是无限的。 此外、看门狗可以使器件脱离该状态。 通常、主闪存只应在程序更改期间被擦除或编程。

    不幸的是、我可能需要一段时间才能完成这个任务、因为我在本周的剩余时间都不在办公室。 我会在我有时间时尝试处理它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢,Bob。。。 然而(即使)如果投机性的----"启动到(任何)"暂停/停止预期的活动"----而没有任何,"发出这种事实的信号"----或"试图收集"(并传达)"某些线索"----似乎不是很好,"最好/最聪明的"----它不是吗?

    闪存"擦除/写入"是一个复杂的过程-它看起来是"合理的"-(一些)防御和/或识别措施将证明非常有用。   特别是-(任何/全部)"被骗"海报-未通知-和"无助等待"。   同样、"没有你的工作"-但建议 "改进处理" (肯定)优于"等待/提问/祈祷"。

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

    尽管声称(几乎)您的 MCU 没有经验或资质-而这是"闪存擦除/写入"问题-"kiss"可能(再次)引起您的帮助。   (有人希望)

    Fire/i (也是)支持 FreeRTOS (主要是 MIT 和亚马逊许可的)-但其使用可能会"引起/促成"您的问题-这是不是吗?   

    以下是几项基于 kiss-based 的一般性建议:  

    • 您是否可以(暂时)"退出任何 RTOS "-并重复测试。   我们的目的是"尽量减少(可能)影响变量的数量"。
    • 您的两个"闪存区域"是否正确拆分为指定(不同)的位置。   我相信、此类闪存"擦除/写入"可以(仅-或者最好)在这类"单独区域"之间运行。
    • 在此操作之前(再次临时)、您可能会"降低系统时钟速度"(可能减半)、以查看这是否会影响您的结果。
    • 除非 明确禁止、否则在特定"闪存擦除/写入"代码段的关键/关键部分之间插入"延迟"通常是有用的。
    • 在启动"闪存写入"之前、您无法"证明"已成功执行"闪存擦除"?   事实证明、这不是有洞察力的吗?

    KISS 要求我们: "将问题分解成更小、更合理的测量和分析部件、然后系统地进行进度-"一次一个"。

    我提供这一信息是因为供应商的 Bob 注意到他的退货延迟、并且您对此处(或您发现的)信息的恢复很可能会" 快速、轻松和增强" Bob 在退货前的诊断工作(如果未解决)...

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

    我将尝试回答您的问题:

    1. 正如我在开始帖子中所说、这个问题对于向项目添加/延迟代码非常明智。 仅在主循环中写入闪存的简单项目不能证明问题。 我刚才添加了 FreeRTOS、因为它在我的'big'项目中使用、因为我的想法是假设 RTOS 使用 SysTick 计时器、并且可能在 FlashWrite 操作期间出现 SysTick 中断、这会导致故障。 即使在这个"简单"项目中、如果您注释掉仅使用1的'CheckResetCose()'函数调用、并且在 FreeRTOS 调度程序启动之前、问题不会出现。
    2. 我不知道您对"正确拆分闪存区域"的理解是什么。 它们不是物理拆分的、因为它们都在内部闪存中。 在"大"项目中、我将闪存大小限制为可用内部闪存的一半。 在这个"人"项目中、我没有这样做。
    3. 我已经尝试在主函数开始时将时钟速度降低到60MHz"全局"、这可以解决问题。 但我无法确定它确实解决了问题、还是隐藏了它、因为我在代码中做了一些更改。
    4. FlashErase 和 FlashWrite 函数来自 TivaWare、它们正在检查其中的闪存忙位。 MAP_FlashErase 和 Write 函数来自 ROM、我不知道它们是如何工作的。

    但是、所有建议都没有回答这样一个问题:为什么所有内核寄存器变为相等的值、包括 CTRL_FAULT_BASE_PRI 寄存器、该寄存器不会保存到堆栈中、并且在堆栈溢出时不会损坏。 在屏幕截图中、您可以看到失败后程序的位置。 我认为这不是一个随机地址。 但为什么所有内核寄存器都包含它呢?

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

    感谢您-已阅读/审阅您的写作-我已经致电我们公司的几位客户-他们使用的是'129家。   (我们不喜欢其他180MHz M4和200MHz+ M7产品-我确实注意到了我对您的 MCU 的经验...)

    您写道:" 我正在使用 TM4C1294NCPDT 微控制器、将其内部闪存拆分为两个相等的部分、而且我还在使用镜像模式。"

    我写了"闪存区域"正确拆分"。   通过此操作-我注意到"(某些)"129 MCU 采用 -"独立"-闪存组对"这一事实。   这些显示为"物理拆分"。   根据我在该实施方面的经验(根据"其他人的 MCU")以及此处的几篇(过去)文章- MCU 与这些"闪存组对"的使用-通常证明是最佳的。    虽然我不准备说这将(积极)"为您服务"-但确实值得您考虑...

    您注意到、我建议" 减少系统时钟"-"解决问题"。   但是、您随后添加"对问题进行云处理"、(您)"对代码进行了一些更改。"   有没有这种“改变”不在我的建议范围之内——反亲吻——和混淆——难道不是吗?   (目标是最大程度地减小(未知)和变量-而不是引入新变量。)

    不使用-也不"喜欢'129"-我没有解释您的报告、 "所有包含相同值的内核寄存器"。   这种共同价值是否能提供任何见解?   (至少是预期和/或"合法?")   当"Write to a Core Register (unwanyand)"loos"-寄存器地址设置为递增时、可能会发生此值重复。   建议您查看相关的"闪存擦除/写入"代码。

    该供应商(C2000)提供的更高级的 MCU 系列包括以下注释: "擦除操作是动态操作-在擦除完成前施加脉冲-或者达到最大脉冲数且擦除失败。"    这可能会也可能不会描述您的问题。   我曾问您:"测试您的擦除操作"-您的响应方式不符合我的理解...

    迄今为止、我提供了最好的指导、"感谢免费"、作为"外部人员"、公司/我回答"高度特定(内部)供应商 MCU 问题"的能力可能不 是"卡中的"。   我尝试过...

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

    从您的屏幕截图中、首次发布通知 RTOS 操作系统和调试 ROV 尚未启动。 调试 ROV 可以帮助您查看在闪存写入期间 CPU 是否抛出 M3模块中断或其他异常标志。 如果 F5/F6步进的 ICDI 设置未正确设置、则闪存写入应用程序的一部分中不调用 IntMasterDisable()。

    将较低闪存扇区镜像或影子副本镜像到较高的闪存扇区可能需要8k 页边界、并且在 CB1提到的写入过程中会保留256KB 块。 这是 CPU 可能停止并且 ICDI 与 DAP 失去联系的原因之一。 也许要确保在 ICDI ARM 高级设置中启用 MPU、这样 MPU 就可以在故障条件下运行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 BP101:

    我正在使用 FreeRTOS、由于我知道调试 ROV 不能与之配合使用、因此它只能与 TI-RTOS 配合使用。 在故障期间、ICDI 未与目标断开连接我仍然能够观察外设寄存器并可以运行和暂停固件执行、但我无法执行 F6 (Step Run)。

    我将在 RAM 中写入16k 个扇区和缓冲区的闪存、我将其用作要写入的数据、也在16k 边界上对齐。

    返回到我的项目:
    每次写入第4个扇区时发生故障。 我已经尝试在第三个扇区之后暂停固件、然后将断点放置在 SysTick 中断处理程序中。 正如我看到的、SysTick 中断在 FlashWrite 操作期间发生了几次。 从 ROM (在0x1000000区域中)执行 FlashWrite 函数。 因此、我将在每个断点停止后再次运行固件(F8)。 因此、第4个扇区能够被自动启动、固件开始写入第5个扇区。 然后、我禁用 SysTick 计时器中的断点并运行固件而不使用断点、它捕获第8个扇区写入失败。

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

    大家好、

    我有更新。 我设法使我的项目失败、或者不仅仅是通过添加一些 NOP。

    看到相同的项目、但我在 main 函数中添加了一些 NOP。 共有26个 NOP。 和闪存操作运行良好。 如果您注释掉最后的第26个 NOP、闪存操作将失败。 然后、如果你从底部注释出下一个 NOP、闪存操作将失败、直到21个 NOP 在代码中、然后继续注释掉 NOP、项目将正常工作、直到11个 NOP 在代码中。 如果您注释第11个 NOP、项目将再次失败。

    e2e.ti.com/.../FlashFailureTest2.zip

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

    [引用 user="CB1_MOBIST"]在 特定"闪存擦除/写入"代码段的关键/关键部分之间插入"延迟"(除非明确禁止)通常证明是有用的。

    正如先前建议的那样- 您插入 "NOP" -符合 "插入延迟" 建议-正如之前发布的...

    我们怀疑、之前 也有人建议、额外的"系统时钟的减慢"将会减少 "所需 NOP"的数量。    

    如先前所述、 "降低系统时钟速度" 和 "插入关键延迟"的"组合"应适合您...  (已成功使用我们的 Cortex M7器件和 M4 (来自其他器件))

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

    [引用 USER="Dmitry Govorov">因为我看到 SysTick 中断在 FlashWrite 操作期间发生了几次。 [/报价]

    也许,为什么闪存16KB 块之前的 IntMasterDisable()调用可能会停止 不需要的中断,IntMasterEnable()就在之后。  从 SRAM 传输的 UART 数据中也会出现类似的中断、 因此索引指针损坏 了缓冲区阵列。  

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

    [引用 user="Dmitry Govorov"]硬件中是否可能存在错误? 我在 TM4C123 CPU 中发现了类似的问题

    TM4C123硬件可能出现故障

    TI E2E 社区
    ---------------------- 截至2015年2月4日此长线程的摘要:在以下情况下,Tiva TM4C123微处理器中存在严重的错误,可能导致未定义的行为(如堆栈损坏):- A.

    [/引述] TM4C123器 件中的错误记录在勘误表 MEM#14中"从闪存执行期间的闪存写入操作可能导致错误的指令提取"。 查看2017年3月发布的《TivaTmC 系列 TM4C129x 微控制器芯片版本1、2和3勘误表》SPMZ850G,我看不到 TMC129器件的相应勘误表。

    在调查 TM4C123 MEM#14时、TM4C123上失败的示例程序在 TM4C129器件上未失败、据信是因为 TM4C129使用了不同的闪存架构。

    但是、根据您对 TM4C129器件上问题的描述、由于更改 NOP 可能会导致问题的发生和发生、因此您怀疑 TM4C129中存在错误。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    喜欢调查性的"证据/细节"-这通常伴随着您的帖子。

    您正确地注意到、RE:TM4C123 MEM#14:"在 TM4C123上失败的示例程序在 TM4C129器件上未失败、据信是因为 TM4C129使用了不同的闪存架构。" 然而-"违规程序"(正确)是否与 TM4C123 (较小)配合/约束? (如果您运行该程序-这肯定已经正确实施。)

    另外一点- TM4C129有(多个)版本-闪存架构也各不相同。 plz 待机...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    喜欢调查性的"证据/细节"-这通常伴随着您的帖子。

    您正确地注意到、RE:TM4C123 MEM#14:"在 TM4C123上失败的示例程序在 TM4C129器件上未失败、据信是因为 TM4C129使用了不同的闪存架构。" 然而-"违规程序"(正确)是否与 TM4C123 (较小)配合/约束? (如果您运行该程序-这肯定已经正确实施。)

    然而-"违规程序"(正确)是否与 TM4C123 (较小)配合/约束? (如果您运行该程序-肯定会发生这种情况!) 是否已确定示例程序非常适合 TM4C123?

    另外一点- TM4C129有(多个)版本-闪存架构也各不相同。 使用分离/独立的"闪存组对"(如之前建议的那样、这个线程)似乎提供了"最成功的可能性!" 使用配备了"闪存组对"的"129个系列成员"似乎很有用。

    如报告所述-其他(外来) ARM MCU 也报告了类似的此类问题。 这些问题(通常情况下)并没有被升级为"错误"、而是在离散闪存操作之间使用"保守系统时钟"和适当(足够)延迟、以及使用"闪存组对"(如果可用)已证明是成功的...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="CB1_MOBIET"]您正确地注意到、关于 TM4C123 MEM#14:" TM4C123上失败的示例程序在 TM4C129器件上未失败、据信是因为 TM4C129使用了不同的闪存架构。" 然而-"违规程序"(正确)是否与 TM4C123 (较小)配合/约束? (如果您运行该程序-肯定已经正确实施。)[/QUESP]我首先启动了一个在 TM4C123GH6PM 上失败的程序、然后将该程序移植到 TM4C1294NCPDT (未失败)。 很遗憾、我找不到 TM4C1294NCPDT 的程序版本、无法找到我所做的确切更改。

    因此、我们将使用 Dmitry 的示例进行研究。

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

    [引用 user="Dmitry Govorov">查看相同的项目,但我在主函数中添加了一些 NOP。 共有26个 NOP。 和闪存操作运行良好。 如果您注释掉最后的第26个 NOP、闪存操作将失败。我可以使用相同版本的 TI 编译器和 TivaWare、但使用 CCS 8.0.0.00016来重复此失败。

    测试中使用 了 TM4C129ENCPDT 器件版本3。

    到目前为止的测试总结如下:

    1) 1)未修改的程序成功运行。

    2)使用了 XDS110和 CCS Statistical 函数分析、默认情况下每1024个周期对 PC 采样一次、以捕获成功运行的配置文件。

    3) 3)注释了最后第26个 NOP、程序开始失败。 在大多数故障后、调试器无法停止目标。 使用 CCS Statistical 函数 Profiling 捕获失败运行的配置文件。  统计函数分析似乎显示程序卡在 xPortPendSVHandler()函数中,因为跟踪结束时所有采样的 PC 值都是同一地址 0x55ae,它是  xPortPendSVHandler()末尾的 BX r14指令。

    4)采用之前的失败程序、如果 在 xPortPendSVHandler 上设置了硬件断点、然后在断点命中时恢复程序、程序将成功运行以完成。 我执行了多次跑步、并且:

    a) 在 xPortPendSVHandler 上没有断点时、程序会失败。

    b)在 xPortPendSVHandler 上具有断点、并在遇到断点且程序成功完成时恢复。

    还不了解根本原因是什么、但如果设置断点、可能会导致问题消失、请怀疑存在一些计时问题。

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

    Chester Gillon 说:
    b)在 xPortPendSVHandler 上具有断点、并在断点被命中且程序成功完成时恢复。

    此外、 如果在 xPortPendSVHandler 上设置了断点、但使用非零跳过计数使调试器在断点被命中后自动恢复、也允许程序成功完成。 跳过计数由 CCS IDE 处理、因此目标将在恢复前暂停几毫秒。

    对于 TM4C123错误 Mem#14、单步执行的操作也足以防止故障。

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

    Chester 为您展示了精彩的时间/努力-谢谢-非常感谢。

    现在(几乎)不明显的是、"插入延迟"-在用户代码的关键/关键部分-肯定会增加"稳健性"-甚至可能导致程序成功?

    这种情况下、我们在这里敦促"插入延迟"-过去3天...

    根据公司和我的经验、这种"闪存擦除/写入"确实需要"防护带"、即使    他们"看起来"成功也是如此。    这证明了这一点、因为这样的操作肯定会"增加"完全/正确"执行所需的时间-并且这些时间将(仅限)随着器件老化而增加-并且也证明"温度敏感"。

    防护带-由延迟提供-提供 "廉价但有效的保险" -并已通过(其他/外来) ARM MCU "证明成功"-以及(现在)与此处的 MCU 一起-也...

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

    [引用 USER="CB1_MOBILE]]现在(几乎)不清楚、 "插入延迟"-在用户代码的关键/关键部分-肯定会增加"稳健性"-甚至可能导致程序成功?[/引述]问题在于确定代码的"关键/关键"部分、在该部分插入延迟以针对潜在原因提供可靠的修复、而不是掩盖原因。

    使用 Dmitry 的示例程序、在主函数中插入一个 NOP 而不对闪存进行编程的操作会使故障"消失"。

    示例程序将 闪存配置寄存器(FLASHCONF)的默认值保留为零。 如果在加载失败的程序且程序在 main 处停止:

    A)如果以闪存配置寄存器的默认值启动运行的程序、程序将失败。

    b)如果在  运行程序之前使用调试器将闪存配置寄存器中的 FPFOFF (强制预取关闭)位置位、程序将成功运行。

    因此、认为闪存预取缓冲区对问题有一定影响。 在主函数中插入 NOP 时、会导致故障"消失"、从而可能随机播放存储器中其他函数的地址、因此需要查找哪个函数对闪存预取缓冲器的地址对齐敏感。

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

    我想指出、我(之前也是如此)建议使用配备了"双分组闪存"的 MCU (正确)-以及插入密钥/关键"延迟"-具体解决"闪存预取缓冲器施加的灵敏度"!   

    重要的是-同时包含供应商的 MCU -以及 "其他!"的 MCU    这种 (近乎)通用解决方案明显胜过"一个和唯一一个供应商"(解决方案)!

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

    [引用 user="Dmitry Govorov">查看相同的项目,但我在主函数中添加了一些 NOP。 共有26个 NOP。 和闪存操作运行良好。 如果您对最后的第26个 NOP 进行注释、 闪存操作将失败。[/quot]在先前显示故障似乎与与 与 xPortPendSVHandler 函数交互的闪存预取缓冲区相关的测试之后、在 xPortPendSVHandler 函数 w.r.t 中查找了指令的地址。32字节闪存字节预取缓冲区的边界。 对于这些测试、在没有任何断点的情况下运行程序、并且闪存配置寄存器处于其默认值。

    这是 对工作程序的 xPortPendSVHandler 的反汇编、其中 main 中有26个 NOP:

    xPortPendSVHandler():
    00005554:F3EF8009 夫人 R0、PSP
    109ISB
    00005558:F3BF8F6F ISB SY
    112LDRR3、pxCurrentTCBConst
    0000555c:F85F302C LDR.w R3、[PC、#-0x2C]
    113LDRR2、[R3]
    00005560:681A LDR R2、[R3]
    116TST r14、#0x10
    00005562:F01E0F10 TST.w LR、#0x10
    117它 eq
    00005566:BF08 它 EQ
    118vstmdbeq r0!、{S16-S31}
    00005568:ED208A10 vstmdb R0!、{S16、S17、s18、S19、 S20、S21、S22、S23、S24、 S25、s26、S27、s28、S29、 S30、S31}
    121stmdb r0!、{R4-r11、r14}
    0000556c:E9204FF0 stmdb R0!、{R4、R5、R6、r7、 R8、R9、R10、r11、LR}
    124STR r0、[R2]
    00005570:6010 结构 R0、[R2]
    126stmdb sp!、{R3}
    00005572:F84D3D04 结构 r3、[sp、#-0x4]!
    127.LDR r0、ulMaxSyscriesInterruptPriorityConst
    00005576:F85F0040 LDR.w R0、[PC、#-0x40]
    128LDR R1、[r0]
    0000557A:6801 LDR R1、[r0]
    129MSR basepri、R1
    0000557c:F3818811 MSR basepri、R1
    130DSB
    00005580:F3BF8F4F DSB 第
    131号ISB
    00005584:F3BF8F6F ISB 第
    132章BL vTaskSwitchContext
    00005588:F7FBFC46 BL 0xe18
    133MOV r0、#0
    0000558c:F04F0000 MOV.w R0、#0
    134MSR basepri、r0
    00005590:F3808811 MSR basepri、r0
    135ldmia sp!、{R3}
    00005594:F85D3B04 LDR r3、[sp]、#4
    138LDR R1、[R3]
    00005598:6819 LDR R1、[R3]
    139LDR r0、[R1]
    0000559a:6808 LDR R0、[R1]
    142ldmia r0!、{R4-r11、r14}
    0000559c:E8B04FF0 LDM.w R0!、{R4、R5、R6、r7、 R8、R9、R10、r11、LR}
    146TST r14、#0x10
    000055a0:F01E0F10 TST.w LR、#0x10
    147它 eq
    000055a4:BF08 它 EQ
    148.vldmiaeq r0!、{S16-S31}
    000055a6:ECB08A10 Vldmia R0!、{S16、S17、s18、S19、 S20、S21、S22、S23、S24、 S25、s26、S27、s28、S29、 S30、S31}
    150MSR PSP、r0
    000055aa:F3808809 MSR PSP、r0
    151ISB
    000055ae:F3BF8F6F ISB 第
    152号BX r14
    000055b2:4770 BX LR 

    这是 主代码中包含25个 NOP 的故障程序的 xPortPendSVHandler 的反汇编:

    xPortPendSVHandler():
    00005550:F3EF8009 夫人 R0、PSP
    109ISB
    00005554:F3BF8F6F ISB SY
    112LDRR3、pxCurrentTCBConst
    00005558:F85F302C LDR.w R3、[PC、#-0x2C]
    113LDRR2、[R3]
    0000555c:681A LDR R2、[R3]
    116TST r14、#0x10
    0000555e:F01E0F10 TST.w LR、#0x10
    117它 eq
    00005562:BF08 它 EQ
    118vstmdbeq r0!、{S16-S31}
    00005564:ED208A10 vstmdb R0!、{S16、S17、s18、S19、 S20、S21、S22、S23、S24、 S25、s26、S27、s28、S29、 S30、S31}
    121stmdb r0!、{R4-r11、r14}
    00005568:E9204FF0 stmdb R0!、{R4、R5、R6、r7、 R8、R9、R10、r11、LR}
    124STR r0、[R2]
    0000556c:6010 结构 R0、[R2]
    126stmdb sp!、{R3}
    0000556e:F84D3D04 结构 r3、[sp、#-0x4]!
    127.LDR r0、ulMaxSyfrabrost InterruptPriorityConst
    00005572:F85F0040 LDR.w R0、[PC、#-0x40]
    128LDR R1、[r0]
    00005576:6801 LDR R1、[r0]
    129MSR basepri、R1
    00005578:F3818811 MSR basepri、R1
    130DSB
    0000557c:F3BF8F4F DSB 第
    131号ISB
    00005580:F3BF8F6F ISB 第
    132章BL vTaskSwitchContext
    00005584:F7FBFC48 BL 0xe18
    133MOV r0、#0
    00005588:F04F0000 MOV.w R0、#0
    134MSR basepri、r0
    0000558c:F3808811 MSR basepri、r0
    135ldmia sp!、{R3}
    00005590:F85D3B04 LDR r3、[sp]、#4
    138LDR R1、[R3]
    00005594:6819 LDR R1、[R3]
    139LDR r0、[R1]
    00005596:6808 LDR R0、[R1]
    142ldmia r0!、{R4-r11、r14}
    00005598:E8B04FF0 LDM.w R0!、{R4、R5、R6、r7、 R8、R9、R10、r11、LR}
    146TST r14、#0x10
    0000559c:F01E0F10 TST.w LR、#0x10
    147它 eq
    000055a0:BF08 它 EQ
    148.vldmiaeq r0!、{S16-S31}
    000055a2:ECB08A10 Vldmia R0!、{S16、S17、s18、S19、 S20、S21、S22、S23、S24、 S25、s26、S27、s28、S29、 S30、S31}
    150MSR PSP、r0
    000055a6:F3808809 MSR PSP、r0
    151ISB
    000055aa:F3BF8F6F ISB 第
    152号BX r14
    000055ae:4770 BX LR 

    对于发生故障的程序、 xPortPendSVHandler 中的第1条 ISB 指令位于地址0x5580、这是闪存预取缓冲区边界的开始、而对于工作程序  、xPortPendSVHandler 中的第1条 ISB 指令位于地址0x5584。 ISB 指令的 ARM 文档为:

    [引用]ISB 充当指令同步屏障。 它刷新处理器的流水线、以便 ISB  ISB 在指令完成后再次从缓存或存储器中提取所有后面的指令。为了调查 ISB 指令的地址对齐是否对 third_party\freertos\Source\ccs\arm_cm4F\portasm 源文件中的闪存预取缓冲区边界敏感:

    a)将 xPortPendSVHandler 和以下 vPortSVCHandler 函数的.align 指令从4字节更改为32字节(闪存预取缓冲区的大小):

    .align 32
    xPortPendSVHandler:.asmfunc
    
    
    
    .align 32
    vPortSVCHandler:.asmfunc
    

    b)在 xPortPendSVHandler 函数中、在 DSB 和 ISB 指令对之间插入越来越多的 NOP。

    其作用是控制 xPortPendSVHandler 函数中 ISB 指令相对于闪存预取缓冲区边界的地址对齐。

    结果如下(每行3次运行以进行检查、结果始终相同):

    DSB 和 ISB 之间的 NOP 数量 第一个 ISB 的地址 第二个 ISB 的地址 程序结果
    0 0x55b0 0x55da 通过
    1 0x52b2. 0x52dc 通过
    2. 0x52b4. 0x52de 通过
    3. 0x52b6 0x52e0 通过
    4. 0x52b8. 0x52e2 通过
    5. 0x52ba 0x52e4 失败-当暂停时、所有内核寄存器的值相同。 SAW 0x00005CA3、0xffffffff 或0x0
    6. 0x52bc. 0x52e6 失败-当暂停时、所有内核寄存器的值相同。 SAW 0x00005CA3或0x0
    7. 0x52be 0x52e8 失败-当暂停时、所有内核寄存器的值相同。 SAW 0x00005CA3或0xffffffff
    8. 0x52c0 0x52ea 失败-当暂停时、所有内核寄存器的值相同。 SAW 0x00005CA3、0x0或0xffffffff
    9. 0x52c2. 0x52ec 失败-当暂停时、所有内核寄存器的值相同。 SAW 0x00005CA3、0x0或0xffffffff
    10. 0x52c4. 0x52ee 通过
    11. 0x52c6 0x52f0 通过
    12. 0x52c8 0x52f2 通过
    13. 0x52ca 0x52f4 通过
    14. 0x52cc 0x52f6 通过
    15. 0x52ce 0x52f8 通过

    根据上述测试 、当 xPortPendSVHandler 中的第1条 ISB 指令相对于闪存预取缓冲区边界具有0、2、26、28或30字节的地址偏移时、程序将失败。

    希望 TI 能够确定当使用闪存预取缓冲器且在闪存中运行的程序正在对闪存扇区进行编程时、此程序是否在 TMC129器件中披露了 ISB 指令的地址位置勘误表。

    同时、解决方法可能是确保 为 xPortPendSVHandler 函数提供32字节对齐、以便其 ISB 指令的有问题地址偏移不会因程序的其他更改而发生。

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

    无论您的测试、 "证明原因-还是不"-您的巨大(集中)努力都值得称赞。

    也就是说、如果您创建的测试探究(仅或主要)"ISB 指令的地址对齐"-这可能不能确认 、"整个"擦除/写入"过程"已(完全)成功...

    如果 您刚才确定的"故障"受到以下因素的影响、它(会)会证明您感兴趣:

    • "系统时钟" 减少(例如、降低至60MHz)
    • 选择的 MCU 采用" 双组"闪存-并且在每个组之间发生"擦除/写入"
    • 扩展数据传输的"大小"

    同样、在使用"IAR" IDE 和(其他) ARM Cortex MCU (M4和 M7)以及合规性(如上所示)时、不会出现类似"MCU 闲置"(如正常报告所示)...

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

    这样可能无法确认 、"整个"擦除/写入"过程已(完全)成功...

    示例程序会检查 MAP_FlashErase ()和 MAP_FlashProgram ()函数的返回结果、并且这些函数没有报告错误。 当程序失败时、它会崩溃、而不是报告闪存擦除或程序失败。

    [引用 USER="CB1_MOBIT]MCU 选择采用" 双组"闪存-并且每个组(/引用)发生"擦除/写入" TM4C1294NCPDT 具有一个512 KB 的低闪存组和一个512 KB 的高闪存组。 示例程序正在从下部存储区运行并擦除/编程上部存储区。

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

    再说一次,"绝不"我的写作被解释为"批评"你的"伟大"努力。    正如这里经常显示的那样-您是"少数人之一"-他们始终努力"帮助他人"。   太棒了!

    [引用 user="Chester Gillon">示例程序检查 MAP_FlashEras()和 MAP_FlashProgram()函数的返回结果,这些函数没有报告错误。 当程序失败时、它会崩溃、而不是报告闪存擦除或程序失败

    请记住、"错误检查"方法(证明)"不能识别任何错误源"(超越"巧妙"崩溃)-(可能)在任何时候都不能证明是决定性的!    根据(非常)指示灯(即不存在)"错误识别"- "我们如何保证、错误报告 -证明"始终"是完美的?"   (我将此可能性基于明显缺乏 "任何错误识别"(可能)表示"没有灵感"的错误报告方法)。

    在您看来-可能(其他)影响影响了" 闪存擦除/写入"目标的可靠性?    包括:

    • RTOS 选择...  (FreeRTOS)
    • IDE 的选择 ...  (此处为 CCS)
    • 优化设置-及其(可能的)对生成的 ASM 的影响-(如果有) ... (未知、此处)

    不是 '129或 CCS 的"粉丝"(我们既不使用也不使用)-我无法通过 IAR IDE "删除"这些答案。  我可以报告、"闪存擦除/写入"-当符合"双组"时-和(有时)增加战略延迟(闪存擦除和写入之间) 并 在"IAR"下执行 -(其他) Cortex M4/M7下实现了"巨大成功"-工作频率@ 180MHz 及更高...

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

    [报价 USER="CB1_MOBIT]*如果 您刚刚发现的"故障"受到以下因素的影响、(会)会证明您感兴趣:

    • "系统时钟" 减少(例如、降低至60MHz)

    [/报价]我已对哪些因素可以使碰撞发生并转进行了更多调查。 最初的条件是:

    • TM4C129ENCPDT 修订版 A2
    • 120MHz 的时钟频率。
    • 调用 ROM_FlashErase 来擦除闪存。
    • 调用 ROM_FlashProgram 对闪存进行编程。
    • 具有32字节对齐的闪存中的 xPortPendSVHandler()。
    • 使用 TivaWare_C_Series-2.1.4.178。

    测试总结:

    更改为初始条件 调整 DSB 和 ISB 之间 xPortPendSVHandler()中的 NOP 数量的结果

    具有 0、1、2、3、4、 10、11、12、13、14、 15 NOP 测试运行到完成。

    对于 5、6、7、8、9 NOP、测试会崩溃。

    使用 TivaWare 中的 FlashErase (从闪存运行)、而不是 ROM_FlashErase (从 ROM 运行)

    具有 0、1、2、3、4、 10、11、12、13、14、 15 NOP 测试运行到完成。

    对于 5、6、7、8、9 NOP、测试会崩溃。

    使用 TivaWare 中的 FlashProgram (从闪存运行)、而不是 ROM_FlashProgram (从 ROM 运行) 在0至15 NOP 的情况下、测试将运行至完成。
    使用 TivaWare 中的 FlashProgram (从 SRAM 运行)、而不是 ROM_FlashProgram (从 ROM 运行) 在0至15 NOP 的情况下、测试将运行至完成。
    将 包含 xPortPendSVHandler()的 portasm.obj 放置在 SRAM 中而不是闪存中 在0至15 NOP 的情况下、测试将运行至完成。
    将时钟频率从120MHz 降低到80MHz

    具有 0、1、2、3、4、 5、6、7、8、10、 11、12、13、14、15 NOP 测试将运行至完成。

    使用9次 NOP 时、测试崩溃。

    设置 FLASH_CONF_FPFOFF 位以禁用强制关闭闪存预取 在0至15 NOP 的情况下、测试将运行至完成。

    其中、"crash"表示在擦除/编程3个或4个闪存扇区后、程序停止向 UART 报告进度。 "崩溃"后、无法使用 CCS 调试器对所发生的情况进行事后剖析。 CCS 调试器在"崩溃"后报告的错误根据使用的调试探针而有所不同:

    调试探针 碰撞后尝试验尸的结果
    Stellaris ICDI (JTAG)

    可以暂停程序。 但是、所有内核寄存器显示相同的值(所有内核寄存器中显示的值可能因运行而异)。 尝试单步执行报告错误:

    Cortex_M4_0:不能单步执行目标程序

    XDS110 (JTAG 或 SWD)

    无法挂起、并报告以下错误:

    Cortex_M4_0:停止目标 CPU 时出现问题:(错误-2062 @ 0x0)无法停止器件。 重置设备、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板进行下电上电和/或尝试更可靠的 JTAG 设置(例如、较低的 TCLK)。 (仿真包7.0.188.0)

    SEGGER J-Link (JTAG 或 SWD)

    无法挂起、并报告以下错误:

    Cortex_M4_0:停止目标 CPU 时出现问题:停止失败!

    Blackhawk USB560-M (JTAG)

    无法挂起、并报告以下错误:

    Cortex_M4_0:停止目标 CPU 时出现问题:(错误-2062 @ 0x0)无法停止器件。 重置设备、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板进行下电上电和/或尝试更可靠的 JTAG 设置(例如、较低的 TCLK)。 (仿真包7.0.188.0)

    因此、"崩溃"会将 Cortex-M4F 内核置于调试器被锁定的状态。 调试器再次连接之前需要进行复位。

    尚未成功确定崩溃的根本原因、但使用 Statistical Function Profiler 每896个时钟对程序计数器进行一次采样显示如下:

    a)程序位于 ROM_FlashProgram()中。

    b)在 FreeRTOS 上下文切换函数中获取两个样本、这两个样本被认为是 FreeRTOS 使用的定时器中断的结果。

    c)所有剩余样本都是相同的程序计数器,用于 xPortPendSVHandler()末尾的“BX lr”。

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

    切斯特、您好!

    这是您为解决此问题所做的出色工作。

    我只能添加一些有关 b)在 FreeRTOS 上下文切换函数中获取两个样本、这两个样本被认为是 FreeRTOS 使用的定时器中断的结果。
    我在运行 MAP_FlashEras()和 MAP_FlashWrite()函数期间看到了2-3个 SysTick 计时器中断。

    作为问题的快速解决方案、我做了几件事:

    1. 使用从 ROM 运行的 MAP_版本的擦除和写入功能
    2. 将 SysTickTimerISR 处理程序移至 RAM
    3. 将我在其中调用"擦除和写入函数"的父函数移动到 RAM 中

    当然、它不能解决问题的根本原因。 但它可能会为您提供一些想法。

    P.S. 您能否解释一下如何从 TivaWare 获取函数以从 SRAM 运行? 我只想将这些函数的源文件复制到我的文件中、然后在这些函数之前添加'__attribute__((ramfunc)'.

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

    [引用 user="Dmitry Govorov]P.S. 您能否解释一下如何从 TivaWare 获取函数以从 SRAM 运行? 我只想将这些函数的源文件复制到我的文件中、然后在它们之前添加'__attribute__((ramfunc)'。我编辑了链接器命令文件以手动将 TivaWare FlashErase ()和 FlashProgram ()函数添加到 .TI.ramfunc 部分:

    .TI.ramfunc:{*(.text:FlashErase)*(.text:FlashProgram)}load=flash、run=SRAM、table (BINIT) 

    这是因为 TivaWare 库已编译、每个函数都放置在其自己的段中。

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

    [引用 user="Dmitry Govorov"]当然、它不能解决问题的根本原因。 但也许它可以为您带来一些想法。我仍然没有确定根本原因。

    MSP432E 器件似乎基于 TM4C129器件、我为 MSP43E401Y 创建了一个等效测试程序、该程序因相同症状而失败-请参阅 MSP432E401Y:如果在闪存编程操作期间发生 FreeRTOS 上下文切换、处理器可能会崩溃

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

    您好 Dmitry、

    我们还使用了 TM4C1294NCPDT、并根据要求(由我们的客户)更新应用。 部件。

    供参考、对闪存进行更新时没有问题。

    或许需要思考的一些要点:

    - SYSCLK 设置为120MHz
          /*通过晶振'25MHz'设置 sysClock '120MHz'*/
          SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
                                              SYSCTL_OSC_MAIN |
                                              SYSCTL_USE_PLL |
                                              SYSCTL_CFG_VCO_480)、120000000);

    -我们使用前缀为'ROM_'的所有'FLASH'服务函数
     ( ROM_FlashEras();ROM_FlashProgram())

    -'ROM_FlashProgram()’部分(写入长度)为512字节

    -在'ROM_FlashProgram()'之后,我们将延迟下一个闪存部分
         /*延迟*/
         ROM_SysCtlDelay( sysClock/100uL );
         注意:在您的情况下、它可能会更长一点、因为
         同时、我们还从 USB-Memstick 读取数据。

    -未使用 WD (仍被禁用)

    -未使用 RTOS


    也许它会有所帮助。

    此致
    WJ