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.

[参考译文] RM42L432:直接从 RAM 下载并运行代码、可以#39;t 访问 main 过程

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1106742/rm42l432-download-and-run-code-direct-from-ram-can-t-reach-the-main-procedure

器件型号:RM42L432
主题中讨论的其他器件: HALCOGEN

您好!

我遇到了一个非常奇怪的 RM42L432器件问题。 我创建了一个 HALCOGEN 项目(随附了 HALCOGEN_Blinky_RAM.zip)、并将源文件复制到项目中。 此项目使 N2HET 引脚上的 LED 闪烁(现在无关紧要)。 我想直接从 RAM 下载和运行项目(无需接触闪存位置)。  我已按如下方式更改链接器命令文件(sys_link.cmd):

--retain="*(.intvecs)"

*----------------------------------------------------------------------------*/
/* Memory Map                                                                 */

MEMORY
{
    VECTORS (X)  : origin=0x08000D00 length=0x00000020
    STACKS  (RW) : origin=0x08000000 length=0x00000D00
    RAM     (RW) : origin=0x08000d20 length=0x000072E0
}

/*----------------------------------------------------------------------------*/
/* Section Configuration                                                      */

SECTIONS
{
    .intvecs : {} > VECTORS
    .text    : {} > RAM
    .const   : {} > RAM
    .cinit   : {} > RAM
    .pinit   : {} > RAM
    .bss     : {} > RAM
    .data    : {} > RAM
	.sysmem  : {} > RAM
}

成功构建项目后、我尝试对其进行调试、但无法访问 sys_main.c 中的主过程 我不知道为什么... 调试似乎正常、但未 发生任何情况。 控制台窗口"CortexR4:GEL 输出:闪存的存储器映射设置@地址0x0"中只有一个日志信息。 这是否意味着、该代码滞留在闪存开始处的地址0x0上? 为什么不去 RAM 位置?

我随附了代码项目 RM42L432_blinky_RAM.zip 供您参考。

有什么想法吗?

谢谢!

此致、

Tomas Lehotsky

e2e.ti.com/.../RM42L432_5F00_blinky_5F00_RAM.zipe2e.ti.com/.../HALCOGEN_5F00_Blinky_5F00_RAM.zip

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

    您好、Tomas、

    默认情况下、主闪存指令存储器从0x00000000开始寻址。 这也是复位 矢量位置–只要 内核复位、ARM Cortex-Rx 处理器内核就从0x00000000的复位矢量地址开始执行。

    默认情况下、CPU 数据 RAM 从0x08000000开始寻址。  


    该器件还支持交换 CPU 指令存储器(闪存)和数据存储器(RAM)。  这可以通过配置总线矩阵模块控制寄存器1 (BMMCR1)的 MEM 交换字段来实现。  交换后、数据 RAM 从0x00000000开始访问、RAM ECC 位置从0x00400000开始访问。 现在从0x08000000开始访问闪存。

    您可以通过 从 CCS 顶部菜单栏中选择"scripts"、然后选择将 RAM 放置在地址0x0的选项来启用此功能。 然后、您可以正常加载代码。 此方法仅用于调试目的。  

    为了通过将 RAM 重新映射到地址0x0来使其工作、您还需要对启动代码进行一些更改。 我建议从您的启动代码中删除所有 PBIST 和 SRAM 初始化函数。  

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

    如果您希望从 SRAM 运行一部分代码、则需要定义两个代码段:保存代码的闪存加载地址和执行代码的 RAM 中的运行地址。 在执行之前、您需要将操作码从加载地址复制到运行地址。

    请参阅引导加载程序示例的链接器 cmd 文件。

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

    您好、QJ Wang、

    我以前一直在与 RM44、RM48等 Hercules 系列成员合作、但我没有遇到这样的问题。 将代码放置到 RAM 位置(如我附加的 cmd 文件中)足以从 RAM 运行它。 cmd 文件中没有用于从一个位置加载并从第二个位置运行的特殊段。
    我已附加完整的项目、您是否能够更具体地说明在我的项目中更改/禁用所需的内容(需要更改启动代码中的 copnis浆)?

    谢谢!

    此致、

    Tomas Lehotsky

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

    您好、Tom、

    正如我说过的、CPU  从0x00000000的复位矢量地址开始执行 。 如果复位矢量没有问题、CPU 将无法正常启动。

    因此、.intvec 必须写入从0x00000000开始的闪存。

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

    您好 QJ、

    我仍然不明白。 为什么.intvec 应该写入位于0x0位置的闪存中? 我想将代码直接加载到 RAM 并从 RAM 运行。 不是从闪存中,如果我的引导程序位置在 cmd 文件中被声明为类似 以下引导程序(X) :origin=0x08000D00 length=0x00000020,和 .intvecs :{}>引导程序,为什么它不到达 RAM 而是进入0x0闪存位置?  

    此外、我要附加映射文件、或许这有助于查看问题的位置?

    此致、

    Tomas

    e2e.ti.com/.../rm42l432_5F00_map.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="45190" URL"~μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum1106742/rm42l432-download-and-run-code-direct-from-ram-ca-t-ree-t-the -main-procedures/4102902#2902]如果问题不是重置矢量、则不是报价[]

    很抱歉、对于拼写错误、应该是"如果复位矢量未编程..."

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="246413" URL"/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum1106742/rm42l432-download-and-run-code-direct-from-ram-ca-t-ree-t-the -main-procedures/4105410134]0x5ec .int0#.intec 闪存位置应写入闪存? [/报价]

    对于 ARM Cortex-R 器件、异常向量或中断向量必须放置在0x00000000或为 HIVECS 指定的位置(通常位于0xFFFFFF0000)。 Hercules 器件不支持高异常向量(HIVECS)。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="246413" URL"/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1106742/rm42l432-download-and-run-code-direct-from-ram-ca-t-ree-t-the -main-procedures/4105410134]RAM 为何不能到达闪存位置?  [/报价]

    复位后、处理器从0x00000000 (复位中断地址)而不是0x08000000中提取第1条指令。

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

    您好、Tom、

    您可以尝试"MEM swap"功能将代码加载到0x08000000、并从0x08000000执行代码。

    使用此功能时、应更改链接器 cmd 文件中的内容:

    部分

    .intvecs:{}>向量
    .text:{}> FLASH0
    .const:{}>FLASH0
    .cinit:{}> FLASH0
    .pinit:{}> FLASH0
    .bss:{}> FLASH0       //RAM
    .data :{}> FLASH0       //RAM
    .sysmem:{}> FLASH0//RAM   

    /*用户代码开始(4)*/
    /*用户代码结束*/

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

    您好 QJ、

    与 我在开头发布的链接器命令文件相比、有什么区别? 我将其称为 RAM、您将其称为存储器 FLASH0。  n´t 定义"FLASH0"存储器、它没有任何意义... 那么、您的 FLASH0的"存储器"定义是什么?   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="246413" URL"~μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1106742/rm42l432-download-and-run-code-direct-from-ram-ca-t-ree-t-the -main-procedures/FL7741017#FL7741017"无需定义任何内存即可n´t 那么、您的 FLASH0的"存储器"定义是什么?   [/报价]

    我认为 QJ 的链接器 cmd 文件使用 RM42L432中的"MEM swap"功能。 来自  RM42x 16/32位 RISC 闪存微控制器技术参考手册(修订版 C) :

    CCS rm42l432.gel 脚本提供了菜单选项、可用于交换存储器映射。

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

    您好!

    可以关闭此帖子-我找到了我的问题的解决方案-我更改了 HLACOGEN 项目并将主过程定义为 ramfunc 部分。 现在一切都正常。

    此致、

    Tomas