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.

[参考译文] TMS570LC4357:在 RAM 中运行代码时数据中止

Guru**** 2481885 points
Other Parts Discussed in Thread: TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/691882/tms570lc4357-data-abort-when-run-code-in-ram

器件型号:TMS570LC4357

您好!

在我的项目中,我使用 binit 表将大量代码从闪存复制到 RAM 中,我将 MPU 设置为允许从 RAM 执行代码,但在通过 RAM 执行几条指令后会发生数据中止异常。

为了检查这个问题、我尝试制作一个由 Halcodgen 生成的更简单的项目 来生成数据异常、在这种情况下、从闪存加载到 RAM 的代码是 FEE 驱动器。

为了测试代码、我将 Launchpad XL2与具有"TI v18.1.0.LTS"编译器的 TMS570LC4357搭配使用

main 函 数仅尝试启动 TI_FEE API、但会在 TI_FEE u32BlockEraseCount = 0xFFFFFFU 指令上生成数据中止。

这是测试项目:

e2e.ti.com/.../4555.TMS_5F00_570LC4357_5F00_test.zip

您能告诉我哪一个是我的错误、还是为我的问题找到解决方案?

仅供参考、我仅在将大量代码从闪存复制到 RAM 时才会看到这种行为、否则一切正常

此致、谢谢、

Giovanni

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

    您可以从闪存擦除 EEPROM 并对其进行编程、而不会导致任何问题。 您不必从 RAM 执行 EEPROM 相关代码。

    您需要编写代码以将数据从闪存复制到 RAM、但我在您的项目中看不到代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回复、我的目标是从 RAM 运行 一段大小大于0x4000字节的代码、但在我的测试中、代码在几条 RAM 指令后生成数据中止异常。

    我无法发布我的真实项目、 因此我尝试复制我在 RAM 中执行问题 FEE 文本部分(其大小类似于我要在 RAM 中运行的代码)、行为相同、 在 TI_FEE 函数的 RAM 中执行几条指令后、代码会进入数据中止执行。

    代码将在_TI_auto_init()中从闪存复制到 RAM 中,链接器文件指示使用 binit 表(fee_text_section   :>FLASH0 | FLASH1 palign (32),运行> RAM table (BINIT))。

    如果我将链接器行从"fee_text_section   :>FLASH0 | FLASH1 palign (32)"更改为"fee_text_section   :>FLASH0 | FLASH1 palign (32)"、则 TI_fee_Init 函数会执行 corrpty。

    在这2种情况下(RAM 中的代码和 闪存中的代码)、查看 TI_FEE 函数的反汇编代码、可以看到生成的汇编指令不同、明天我将尝试捕获2个屏幕截图来更好地解释我的想法。

    谢谢、

    Giovanni

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

    在这里的2个屏幕截图中、

    第一个是在闪存中执行的代码、第二个是在 RAM 中执行的代码、这两个项目之间唯一的变化是链接器文件(项目设置中没有优化)。

    "TI_FEE _u32BlockEraseCount = 0xFFFFFFU;"的反汇编和下一条指令是不同的。

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

    您好!

    这个问题已经存在、我找不到解决方案、从 RAM 运行大量代码将导致数据中止。
    我的项目正在运行、如果没有解决方案、我们需要更改此器件。
    我只需要知道所提交代码的行为是否正确、这是从 TMS570的 RAM 运行代码的正确方法(以及我的代码中的 poblem 是什么、 我知道无需从 RAM 运行 TI_FEE、但为什么它不起作用?) 。
    谢谢、此致

    Giovanni

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

    代码不会复制到 RAM。
    1.将 TI_fee_Init()放置在闪存的一个部分中
    例如:
    在 CMD 文件存储器中:
    FEE API (RX):origin=0x00000020 length=0x000014E0

    在 CMD 文件的段中:
    feeAPI:

    TI_fee_Init.obj (.text)
    }load = fee、run = SRAM、load_start (api_load)、load_end (api_end)、run_start (api_run)、 大小(API_SIZE)

    2.将整个部分复制到 SRAM
    将整个 TI_FEE ()从 API_START 复制到 API_END 再复制到 SRAM (从 API_RUN)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、

    谢谢、我已经按照中的指南操作  、并且我了解到 RAM 的复制格式闪存是使用链接器中的 binit 表集在_TI_auto_init 函数中完成的。 ( 如果从闪存复制到 RAM 的代码段 很小、则正常工作)

    那么、这种方法不可用? 最好创建自定义闪存至 RAM 函数?

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

    我在我的代码中创建一个副本:

    ;------------------------------------------------------------------

    ;将闪存 API 从闪存复制到 SRAM。


    .def copyAPI 2RAM_
    asmfunc

    copyAPI 2RAM_

    .ref API_load
    FLASH_LOAD .word API_LOAD
    .ref API_run
    FLASH_run .word API_run
    .ref API_size
    FLASH_SIZE .word API_SIZE

    LDR r0、FLASH_LOAD
    LDR R1、FLASH_RUN
    LDR R2、FLASH_SIZE
    添加 R2、R1、R2
    COPY_Loop1:
    LDR r3、[r0]、#4
    结构 R3、[R1]、#4
    CMP R1、R2
    BLT COPY_LOOP1
    BX LR

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

    您好!

    很抱歉、我已经尝试过您的解决方案。

    我已修改链接器、在 hl_sys_core.asm 中添加了 asm 代码、并在 _TI_auto_init()函数之后的 hl_sys_startup.c 中调用它。

    在链接器中、我只做了一些修改:

    fee_text_section   :> fee_API、run = RAM、load_start (api_load)、load_end (api_end)、run_start (api_run)、 大小(API_SIZE)

    的实例

    feeAPI:

    TI_fee_Init.obj (.text)
    }load = fee、run = SRAM、load_start (api_load)、load_end (api_end)、run_start (api_run)、 大小(API_SIZE)

    因为 FEE 代码由 pragma 加载到该段中。

    在执行 TI_FEE 函数期间、代码始终位于数据中止异常中。

    为了确认我是否从闪存运行代码、TI_FEE 函数执行正常。

    感谢您的支持、

    Giovanni

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

    您好、Giovanni、

    我尝试加载您的代码、但失败了。 我检查了映射文件、一些 FEE 驱动器被映射到 SRAM。