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.

[参考译文] TMS570LS3137:CAN 引导加载程序

Guru**** 2448780 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/623351/tms570ls3137-can-bootloader

器件型号:TMS570LS3137

我正在尝试将 CAN 引导加载程序嵌入到我的应用程序中。  在链接器命令文件中,我将闪存区域保留为"bootFuncs",我打算在其中放置引导加载程序函数,执行后,它将调用链接器文件中分配给0x8000的应用程序 main()。  现在、我的引导加载程序为空、只需调用 main。  这仅在我不添加 #pragma CODE_SECTION (main、"appEntry")时有效; 一旦插入我的 pragma、我的应用程序就不会引导。  

  • 闪存中是否有应避免的区域、因为链接器似乎避开了0x8000 (或因此它将从.map 文件中显示)
  • 我们不允许为 main 指定存储器位置吗?  链接器似乎希望将其放在0x11C98上。
  • 此外、对于初始化代码及其需要驻留的位置是否有限制?  如果我将其从 c_int00移出(比如说 SystemStartup()),但 c_int00调用 SystemStartup(),则我的程序不会引导。

我们非常感谢您的任何帮助、额外文档或指南。

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

    我的理解是,引导加载程序和应用程序使用不同的 cmd 文件,它们都有一个 mian()函数。 它们是两个单独的项目。

    您可以使用此方法跳转到应用起点:
    ((((void (*)(void))applicationAddress)();

    它将为应用程序项目执行 c_int00()、sys_intvecs。 放置应用程序代码没有限制。 引导加载程序应在闪存的开头进行逐行扫描。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果没有限制、请帮助我了解这会导致调用 sys_intvecs.asm 中的 dataAbort 的原因。 如果我删除 SystemStartup 函数的 pragma、则一切都正常、但是一旦包含该 pragma、我的应用程序将无法启动。 如果我将对 SystemStartup()的调用替换为:

    (((((void (*.)(void)appAddress))();

    我得到相同的结果。 下面是我的代码片段:

    #pragma CODE_STATE (_c_int00、32)
    #pragma CODE_SECTION (_c_int00、"bootFuncs");
    #pragma INTERRUPT (_c_int00、复位)
    void _c_int00 (void)

    SystemStartup()


    #pragma CODE_SECTION (系统启动、"appEntry");
    空系统启动(空)

    //初始化内核寄存器
    CoreInitRegisters_();

    //初始化堆栈指针
    CoreInitStackPointer_();

    如果(DEVICE_ID_REV = 0x802AAD05)

    //针对 Rev A 器件清除 ESM 内核比较模块(CCM-R4):
    _EsmCcmErrorsClear _();


    //启用 CPU 针对闪存访问指示的 ECC 错误的响应。
    //启用一/零上的事件失败,并在 EDACEN 中启用 SECDED
    flashWREG->FEDACCTRL1 = 0x000A060A;

    //初始化性能监控单元(PMU)
    _CoreEnableEventBusExport_();

    //针对勘误表 Cortex-R4#66进行变通
    _Errata_CORTEXR4_66_();

    //针对勘误表 Cortex-R4#57进行变通
    _Errata_CORTEXR4_57_();

    … (更多初始化内容)