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:TMS570LC4357上的预取错误

Guru**** 2389570 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/1294083/tms570lc4357-prefetch-error-on-tms570lc4357

器件型号:TMS570LC4357

您好、我在使用 TMS570LC4357芯片时遇到了问题:
我们项目的背景是、TMS570LC4357通过 EMIF 总线连接到 FPGA、而 FPGA 连接到外部 SRAM。 TMS570LC4357通过 EMIF 总线操作 SRAM 以进行读取和写入。 现在已成功通过 TMS570LC4357操作 SRAM 的读取和写入函数。

现在、我想实现从 TMS570LC4357的片上闪存跳转到 SRAM 中运行的功能、但会始终发生预取中断错误。 关闭 MPU 后、再次出现 UNDEF 中断错误。

我们的具体操作程序如下:
我编写了一个照明函数、使 LED 灯闪烁。 该函数被称为 FLASHTORAM。 然后编译整个项目、生成一个十六进制文件、并使用内存浏览器工具在十六进制文件中查找 FLASHTORAM 函数的所有内容。 然后、通过 EMIF 的 CS2芯片选择将此内容写入 SRAM。 写入地址为0x6000 0000。 最后、使用函数指针指向0x6000 0000。 您希望程序跳转到该地址并运行以实现 SRAM 中的照明效果。 停止。
跳转函数为:
空跳线地址(UINT32地址)
{
UINT32传输地址= 0;
TransferAddress =地址;
((void(*)(void))TransferAddress)();

但每次运行跳转时、都会发生预取中断错误。 通过查看 cp15_instruction_fault_addrss 寄存器、我们发现错误地址为0x6000 0000。 我现在应该做些什么并解决问题?

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

      这是我们的 cmd 文件、它配置正确吗? 需要进行哪些更改? 使用 CS2片选地址、0x6000 0000、长度为0x0300 0000

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

    尊敬的胡江博:

    我已开始处理您的问题、并将尽快提供更新。

    --
    谢谢。此致、
    Jagadish。

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

    尊敬的胡江博:

    很抱歉耽误了时间、

    您能否验证以下常见问题解答:

    (+)[常见问题解答] TMS570LC4357:在 TMS570LC4357上执行内部 RAM 中函数的分步过程-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    此外、如果我的 MPU 设置不正确、我最终会获得预取中止、因此您能否根据该情况进行验证和矫正。

    --
    谢谢。此致、
    Jagadish。

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

    如果我使用片载 RAM 来运行代码、我已经成功地进行了实验。 我按照上面链接中的方法进行了操作。
    现在、我们要在外部 SRAM 中运行程序。 这还没有取得成功。 请提供帮助。
    (TMS570LC4357通过 EMIF 从外部连接到 FPGA、而 FPGA 从外部连接到 SRAM)
    现在通过 TMS570LC4357读取和写入 SRAM 已不存在问题、但如果 PC 指针指向 SRAM 的映射地址、则会发生异常错误。

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

    尊敬的 HU Jiangbo,

    (+) TMS570LS3137 HDK -通过 EMIF 将软件运行到 SDRAM 中-在第一个指令时卡在 prefetchEntry 状态-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    (+)从 TMDS570LS31HDK 上的外部 SDRAM 运行时程序执行失败-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    在上面的两个线程中、由于 MPU 设置不正确、客户最终会在从外部存储器执行代码时执行预取中止。您能验证它们并确保没有出现任何此类错误吗?

    --
    谢谢。此致、
    Jagadish。

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

    谢谢!

    我将根据您所说的方法进行尝试。

    顺便说一下、在我的项目中、 MPU 已初始化但未启用。 因此、它 可能不会导致我遇到上述问题。

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

    您好, Jagadish M ü,

    我已经 试过你说的方法,、但是 还没达到 从外部 SRAM 执行代码的目标。

    我将关于 EMIF 的 MPU 初始化为  "stronglyorded_sharable "类型,将触发预取中止; 然后我将类型更改为"normal_oinc_shared",并 在跳转到0x60000000 (映射到外部 SRAM 第一个地址的 EMIF CS2空间的第一个地址)后触发数据条目中止 。 我已经启用了 MPU。

    我想可能跟 FPGA 有关、570LC 通过 FPGA 来控制 SRAM 如下图:

    然后我将描述我的实验结果:

    (1)我写 blinky-LED ("FLASHTOSRAM"函数在 Test_Main Project.c 中)代码(0xE92D4038、0xE3A04000、0xE3540014、0xAA00000F)-
    至 SRAM、然后我确认操作成功、如以下图片所示:

     

    (__LW_AT__2 μ s)运行跳转至0x60000000的代码时、触发了数据完整性中止、如以下图片所示:

    您能帮我检查代码-项目?非常感谢。 顺便说一句, "RTI"问题并不迫切,可以在以后解决。 您能先解决这个问题吗?

    我的主题如下:

    主要是  Test_Main c 中的68到70行代码。

    e2e.ti.com/.../Test_5F00_TMS570LC_5F00_OS1129_5F00_JumpToSram.rar

    谢谢、此致

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

    尊敬的胡江博:

    很抱歉耽误了时间、我想请 QJ 帮忙解决这个问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将关于 EMIF 的 MPU 初始化为  "stronglyorded_sharable"类型,将触发预取中止; 

    无法从具有器件或严格排序存储器类型属性的区域执行指令。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    (2)当我运行跳转至0x60000000的代码时,触发了数据加密中止,如以下 pictre:

    数据中止的统计寄存器 CP15 DFSR 和 CP15 DFAR 的值是什么? 您可以在 CCS 寄存器窗口中找到它们。

    我认为它可能与 FPGA 有关,570LC 通过 FPGA[/报价]控制 SRAM

    什么是 SRAM 未直接连接到 EMIF? FPGA 的作用是什么?

    TMS570器件上的 EMIF 未进行性能优化。 数据和指令提取的数据传输时间将比内部闪存/SRAM 慢得多。 由于具有此性能、我不建议从 EMIF 执行代码。

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

      我的应用代码大小将达到比 TMS570内部闪存大16MB。   因此、应用代码将存储在外部 SRAM,中、此操作主要由 FPGA 完成。  

      外部 SRAM 直接连接到 FGPA、TMS570 通过 EMIF CS2连接到 FPGA、FPGA 设计了一个 SRAM 模块、支持 TMS570通过 EMIF 读取和写入外部 SRAM。

      在 TMS570启动后、PC 指针将跳转到外部 SRAM 以执行存储在外部 SRAM 上的程序。

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

    您只对4个字进行代码复制到 EMIF SRAM。 这4个词有什么作用?

    你能否将 while 循环代码复制到 EMIF SRAM、并检查是否出现同样的错误?

    数据中止的统计寄存器 CP15 DFSR 和 CP15 DFAR 的值是什么? 您可以在 CCS 寄存器窗口中找到它们。

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

    0xE92D4038 --》STM 将寄存器 R3、R4、R5、R10中的数据写入 R2中定义的地址

    您可以在跳转到该地址之前检查这些 MCU 寄存器的值吗?

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

    尊敬的 QJ Wang:

    为延迟道歉!

    我今天进行了一个实验,我发现代码不再进入数据条目,但总是进入预取条目。 实施条件如下

    1) 1)将 EMIF clk 设置为50MHz 和37.5MHz (之前、它是75MHz); 2)将 EMIF CS2空间设置为"normal_OIWBWA_shared"类型和"PRIV_RW_USER_RW_EXEC"权限由 config MPU 调用 init 并启用 MPU 函数,并调用_cacheEnable_();也调用函数;  3)将28个字(LED 闪烁20次的代码)写入 SRAM,然后跳转到它。

    实现结果如下

    1)跳转到 0x6000 0000之前 MCU 寄存器的值、如下图所示:

    2)代码一旦 我执行跳转操作就跳转到预取指令。 我已经进行了多次测试、结果是相同的。    如下图所示、CP15 DFSR/DFAR 和 IFSR 15 DFSR/DFAR 的值:

       IFAR = 0x5FFFEDD0,且该地址没有代码。

    3) TMS570的内存映射  如下图所示:

     地址0x5FFFEDD0保留。

    我想这是我的设计(SRAM 未直接连接到 TMS570) 理论上合理?

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

     执行跳转后 MCU 寄存器的值 如下图所示:

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

    这是 MPU 的配置文件:

    e2e.ti.com/.../hcg_5F00_file_5F00_Test_5F00_TMS570LC_5F00_OS.rar

    请检查一下,谢谢!

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

    我 在"Disassembly" 窗口中逐步调试,我发现它可以输入到地址0x6000 0000、但是当导出到地址0x6000 0020时、中止将由 excute "EBFFFB1A  BL  #0x5fff ec90"代码触发。

    我找到原因,并发现代码需要调用"gioSetBit"函数,如下图所示:

    为什么"BL   gioSetBit"更改为"BL  #0x5fff ec90"?

    到外部 SRAM 的源代码如下:

    空 FLASHTOSRAM()

    {
      INT I = 0;
      // uint32 recv = 0;

      for (I = 0;I < 20;I++)

      {
       gioSetBit (hetPORT1、11、1);
       // Emif_Wr (0x000A0000,0x0011);
       delay_ms (500);
       gioSetBit (hetPORT1、11、0);
       // recv = Emif_Rd (0x000A0000);
       delay_ms (500);
      }

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

    我是否还需要将"gioSetBit"和"delay_ms"的函数代码移动到 SRAM?

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

    将生成代码以在闪存中运行、如果是相对于 PC 的地址、则为分支地址。 如果将汇编代码直接复制到 SRAM、则根据 PC 值计算分支地址。 例如  

    EBFFFB1A  BL  #0x5fff ec90"代码。

    PC = 0x60000020 + 0x8 (提前2个字节)

    此指令的操作码为 BL

    0xFFFB1A 是有符号的二进制补码24位偏移(负数) 600

    1.二进制补码:0x0004E5+1 = 0x0004E6

    2.向左移位2位:0x0004E6<< 2 = 0x1398

    3.分支地址= 0x60000028 - 0x1398 = 0x5FFFEC90

    此地址是无效地址、因此您将获得中止。

    您不应将代码从闪存直接复制到 SRAM。 它会破坏所有分支地址。

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

    尊敬的 QJ Wang:

    为延迟道歉!

    那么,我应该怎么做才能实现我的目标?
    我的想法是:
    1)创建 圆形 LED 照明工程1、然后生成 用于 写入外部 SRAM 的 hex 文件;
    2)创建 用于将 hex 文件中的 led 照明代码写入外部 SRAM 的 project2
    3) 3) 将所有代码写入 SRAM 后、创建用于跳转到外部 SRAM 的 project3;
    但我也认为有一个问题与这个想法,请建议,谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jiangbo:

    正如我说过的、TMS570上的 EMIF 未进行性能优化。 从 EMIF 存储器中提取指令要比从内部闪存/SRAM 中提取指令慢得多。 TMS570LC43x 具有4MB 内部闪存和512KB 内部 SRAM。 这些内部存储器对于大多数应用来说已经足够大了。 因此我不建议从 EMIF 存储器运行代码。

    1.工程2和工程3存储在内部闪存中、并从内部 SRAM 执行

    Project1存储在内部闪存中、但从外部 SRAM (EMIF)执行

    您需要修改 project1的链接器 cmd 文件、该文件将从外部 SRAM 执行。

    请参阅 https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html 中 LOAD_START、RUN_START 的用法。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1. 二进制补码:0x0004E5+1 = 0x0004E6

    数据 0x0004E5是如何获得的?

    我无法理解这个步骤,感谢您的帮助!

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

    反汇编代码 EBFFFB1A 的前24位的恢复值: 0xFFFB1A。 NOT (0xFFFBIA)= 0x0004E5

    0xFFFBIA 的二进制补码:NOT (0xFFFBIA)+ 1 = 0x0004E6

    BL 指令的地址偏移量:0x4e6的2位左移

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

    条件字段:0xE --> always