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.

[参考译文] F28M36P63C2:从RestISR跳至_c_int00不工作

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/616562/f28m36p63c2-jump-from-restisr-to-_c_int00-not-working

部件号:F28M36P63C2

(好)我的引导加载程序在我的应用程序中正确跳转到resetISR。  

(好)我可以在反汇编此位置的指令中看到到应用程序_c_int00地址的分支,这正是我想要的。

(坏)此时,它不分支到c_int00,而是转到0x1.0046万d8 (引导Rom?) 然后再次运行bootloader代码。 (不分次)

似乎一切都应该正常工作。 我们非常感谢您就检查内容提出任何建议。  

再次感谢!

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

    Regis_W,

    当PC处于0x1.0046万D8时,这意味着M3已收到HARDFAULT,这可能是由于内存管理,总线故障等原因。请检查并检查您是否在多个设备上看到问题。

    此致,

    Manoj

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    要添加Manoj提到的内容,可能是您从闪存收到ECC错误。 您是否已将ECC与代码一起编程? 您可以在闪存状态寄存器中检查ECC错误状态(错误状态寄存器-ERR_STATUS)。

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

    您可以将项目的入口点更改为resetISR (右键单击项目名称->单击属性->链接器->符号管理->将入口点更改为resetISR),然后从CCS重新加载项目。 现在,程序控制应该在resetISR处,现在您可以在main()处放置一个中断点,并查看运行时它是否命中main。

    我确定不会,因此问题可能出在ECC或CINIT部分。 但如果在连接调试器的情况下运行时确实遇到main(),那么在链接CINIT部分时就会出现问题。 检查任何CCS示例项目的基于闪存的链接器命令文件,看看是否在将CINIT/Const部分链接到RAM而不是Flash时出错?

    希望这有所帮助。

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

    Vivek:我的引导加载程序只是一个盲程序(到目前为止)。 我尚未对ECC进行编程。 我将LED闪烁5次并跳至应用程序。
    ECC是否仍是一个问题?

    Manoj:您是否可以建议任何寄存器来读取故障?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Regis,

    使用CCS加载代码时,是否已在片上闪存插件GUI中启用“AutoEccGeneration”? 默认情况下启用。 您是否禁用了它?

    如果启用了ECC,则该工具将对ECC和Flash内容进行编程。

    如果禁用ECC,则不会对其进行编程,因此您会注意到ECC错误导致重置。

    谢谢,此致,
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我确实注意到它跳到002e3070,但应用程序映射文件是"_c_int00"地址:002e3071
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    瓦姆西
    是的,在Flash GUI中启用了自动ECC生成。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在0xE000-ED2F查看了寄存器。 当我将代码设置为故障时,此寄存器将更新为0x40。
    我认为这是一个矢量表读取总线故障。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您认为问题是与下面的引导加载程序功能有关还是在应用程序端?

    静态void JumpToAddress(UINT32_t地址)

    __ASM(" mov sp, r0\n"// sp现在是*address
    " bx r0\n"); //跳转到*address
    }
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以告诉您:
    1)它是一个矢量表读取总线故障
    2)地址有效
    3)故障地址为0xE000-EDF8
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Regis,

     在逐步 执行代码时,当您确实收到此错误时。  对于M3,需要遵循以下约束,否则会生成故障。

    "每个矢量的最低有效位必须为1,表示异常处理程序是Thumb代码,请参见 Thumb state。"  

    此致,

    Vivek Singh

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

    002e0050:F003B80E 重量 #0x2e3070
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    反汇编的完整代码:

    JumpToAddress():
    002c0cac:F1AD0D08 超细 SP,SP,#8
    002c0cb0:9000 结构 R0,[sp]
    57. __ASM(" mov sp, r0\n"// sp现在是*address
    002c0cb2:4685 MOV SP,r0
    002c0cb4:4700 bx R0
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Regis,

    DO, address|=0x1;,然后调用下面的函数。 您确定R0有地址参数还是收集器有地址?

    为什么您甚至在装配体中对其进行编码? 您可以在C中执行以下操作

    地址|= 0x1;
    ((void (*)(void))address)();

    静态void JumpToAddress(UINT32_t地址)

    __ASM(" mov sp, r0\n"// sp现在是*address
    " bx r0\n");//跳转到*address
    }

    这与Vivek所说的相同。

    此致

    Santosh Athuru

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    IM不是在汇编中编码,我发布了CCS的输出,不可拆卸。 我正在使用您在上面发布的准确代码。 我将根据您的建议添加地址|=0x1。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将地址的最低有效位更改为1似乎可以解决问题。
    代码现在转到我的应用程序的_int00。 它无法运行,但这是次要问题。