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.

[参考译文] AM2631:NOINIT 变量和 CSS 调试

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1277346/am2631-noinit-variables-and-css-debug

器件型号:AM2631
主题中讨论的其他器件: UNIFLASH

您好!

我使用的是 AM2631器件、需要帮助来回答几个问题。

1) 1)我想知道如何配置启动和链接器脚本、以便能够防止在软复位后擦除某些存储器区域。
2) 2)如何在写入访问操作时配置存储器访问断点。
3)如何 将缓存重新刷新到内存中

此致、
阿尔特姆

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

    尊敬的 Arterm:

    1.您可以在链接器脚本中创建专用段并将 NOINIT 类型分配给此输出段:例如:

     .section_noinit: > OCRAM、type=NOINIT

    NOINIT 段不会由链接器在 C 自动初始化过程中进行初始化。 您需要自行根据需要对此段进行初始化。

    2.你试过观察点吗? 可以针对特定的存储器读取/写入触发一个观察点。

      CCS-->运行-->新建断点-->硬件观察点

    3.您可以调用缓存 API 来查看缓存失效情况:

      CacheP_wbInv (addr、size、CacheP_TYPE_ALL);

    请参阅 SDK API 参考:

       https://software-dl.ti.com/mcu-plus-sdk/esd/AM263X/latest/exports/docs/api_guide_am263x/group__KERNEL__DPL__CACHE.html#ga894fcf969b6afb5f30e25861d39c9219

      

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

    感谢您的回答。
    请说明是否可以在不切换到 UART 引导模式的情况下使用 XDS110和 QSPI 引导来重新闪存外部存储器?

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

    尊敬的 Artem:

    您可以使用 UART、CAN 或 JTAG 将文件从主机 PC 传输到 EVM 上的闪存。 如果您要使用 UART 协议、则必须将 MCU 切换到 UART 引导模式。

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

    谢谢你。

    我使用了 JTAG uniflash SBL 来刷写程序-它工作正常。

    我遇到的另一个问题是、在从 CSS 运行系统复位或内核复位或通过代码运行 SOC 热复位 API 后、应用不会引导、并且 PC 在0x3000等低地址区域主动运行、 只有在下电上电后、我才能到达应用。

    导致此问题的原因是什么以及如何解决?

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

    尊敬的 Artem:

    我想这是在预料之中。 启动模式通过在上电期间读取自举引脚(SOP[3:0])来确定。  

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

    你好。 外部下拉 SOP 引脚。 我希望它应该作为 QSPI 引导模式工作。 软件复位有什么问题?

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

    我附上了演示项目、您可以尝试使用该项目来重现问题。

    步骤:

    1. 使用 SBL QSPI 和 QSPI 引导配置闪存、将来自偏移0x80000的外接至外部闪存
    2. 运行应用并检查输出和 RESET_ADDRESS 变量值
    3. 等到应用程序执行热复位
    4. 再次查看输出

    实际结果:
    RESET_ADDRESS 变量在软件复位后复位为0

    预期结果:
    RESET_ADDRESS 变量在每个复位周期中增加。


    e2e.ti.com/.../gpio_5F00_led_5F00_blink_5F00_am263x_2D00_lp_5F00_r5fss0_2D00_0_5F00_nortos_5F00_ti_2D00_arm_2D00_clang.zip

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

    尊敬的 Artem:

    我将用您的 LED 闪烁代码来做一个测试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我希望该接口可用作 QSPI 引导模式。 软件重置有什么问题?

    只要内核复位、ARM Cortex-R5F 处理器内核就会从复位向量地址0x00000000处开始执行。 循环通电后、位于0x00000000处的异常矢量更新为应用程序映像的复位矢量、如果异常矢量的内容未损坏(噪声、辐射等)、则 CPU 复位、SW 复位应开始代码执行。  

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

    我修改了 RTI LED 闪烁示例、并将该示例编程为通过 QSPI SBL 作为应用映像进行闪存。

    应用映像可通过上电复位、SW 复位和 nRESET 启动。

    若要启用 NRESET 引脚来控制热复位、 必须清除 WARM_RESET_CONFIG 寄存器的位字段[2:0]:

      SoC_configureWarmResetSource (0x77777770);//QJ 添加了

    下面是我的示例:

    e2e.ti.com/.../rti_5F00_led_5F00_blink.c

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

    关于所附的图片、您是否能够在每个复位周期增加 RESET_ADDRESS 变量? 请按照以下步骤重现并参考本主题的主要问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否能够在每个复位周期增加 reset_address 变量?

     RESET_ADDRESS 不增加。 这是另一个问题。

    我的测试显示应用程序映像可以通过 PORRST、nRESET 和 SW 复位开始执行。

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

    ROM 代码仅在初始上电(POR)或上电复位时执行。 后续(热)复位时、复位向量 基址将指向运行时加载的代码(SBL)。

    示例 OSPI SBL 初始化 TCMA/B 和 L2OSRAM 存储体2和存储体3。

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

    我的测试显示热复位本身会清除 SRAM 的内容。

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

    尊敬的 Artem:

    第一个1MB OCSRAM (bank0和 bank1)由 ROM 代码初始化。 第2个1MB 区域(bank2和 bank3)由 OSPI SBL 初始化。 我将检查我们是否可以使用未使用的外设 RAM (例如 MCAN RAM)来保留热复位期间初始化的变量。  

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

    与 TMS570器件不同、AM263x 外设 RAM 也会在软件热复位后进行初始化。

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

    尊敬的 Artem:

    我的建议是将"reset_address"写入闪存、而不是 SRAM。  

    您可以修改 SBL 以仅初始化一个 OCSRAM 组(例如组2或组3)、然后将"set_address"存储到 OCSRAM 的未初始化组中。

    从功能安全角度而言、我倾向于将变量存储到闪存中、以避免因器件复位而进行清理。

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

    您好!

    由于设计限制、我们无法在闪存中存储任何内容。
    由于复位地址是从异常环境中捕获的、比如 Hard_FAULT 处理程序、因此将其存储在 RAM 或任何在复位时不被清除的系统寄存器中的唯一方法。

    有几个问题需要您澄清:

    是否无法 在 SBL 中初始化 OCSRAM 区域、或为什么需要将其初始化?

    为什么在软件复位后清除断点?

    我们是否应该通过应用复位处理程序覆盖矢量表、以防止在复位时执行 SBL?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否可能无法 在 SBL 中初始化 OCSRAM 区域,或为什么需要将其初始化?

    SBL 初始化 TCMA、TCMB、以及 OCSRAM 的组2和组3。 无法初始化 OCSRAM 的存储体(2或3)或存储体(2和3)(在热复位后)。

    硬件初始化的目的是根据它们的错误检测方案–ECC、将具有错误检测能力的存储器阵列设定为一个已知状态。 例如、上电复位后 OCSRAM 的内容未知。 可启动硬件自动初始化、这样就不会出现 ECC 错误。

    为什么断点在软件重置后被清除?

    如 TRM 中所述、所有 IO 配置都会在热复位置位期间复位、并且在复位取消置位后、器件将启动、应用程序将重新加载到 OCSRAM、并且不应保留断点。

    我们是否应该通过应用程序复位处理程序覆盖向量表,以防止在复位时执行 SBL?

    在引导期间、应用程序映像的异常向量或复位向量由 SBL 复制到0x00000000。