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.

[参考译文] RTOS/TM4C1294NCPDT:将嵌入式应用定位到特定地址

Guru**** 2616675 points

Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/779485/rtos-tm4c1294ncpdt-locating-embedded-application-to-specific-address

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

您好!

我正在使用 TI-RTOS v2.16在 TM4C1294NCPDT 上开发嵌入式应用。

我想将应用程序定位到特定 地址。

场景1:我有2个基于 TI-RTOS 的不同应用程序。 应用程序0 应在加电时启动并 启动/启动 应用程序1。

应用0:起始地址= 0x00000000、大小= 0x00040000

应用1:起始地址= 0x00040000、大小= 0x00040000

场景2:我有3个应用、其中2个使用 TI-RTOS。 应用0应在加电时启动、并根据 GPIO 引脚状态启动/启动应用1或应用2。

应用0:起始地址= 0x00000000大小= 0x00010000 (裸机应用)

应用1:起始地址= 0x00010000大小= 0x00020000 (TI-RTOS 应用)

应用2:起始地址= 0x00040000大小= 0x0004000 (TI-RTOS 应用)

 对于这两种情况、我需要做什么以及哪些更改来设置每个应用程序链接器文件的起始地址和大小 以及项目设置?

如何从一  个 TI-RTOS 应用程序跳转到另一 个 TI-RTOS 应用程序? 只有 TI-RTOS API BIOS_exit()和从 myExitSystem()跳转到其他应用程序(在 BIOS_exit()上调用) 是否足够 ?

谢谢你。

此致、

Harshal

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

    您好 Harshal、

    有一个示例涵盖了您需要的大部分内容:
    processors.wiki.ti.com/.../TI-RTOS_USB_DFU

    该示例涉及通过 USB 进行器件固件升级、但涵盖了引导加载程序和在 CCS 中指定应用程序边界。 您只需忽略 USB_Serial_DFU.pdf 中的 USB 部件即可。

    至于在应用程序之间跳转、您需要定义每个应用程序的 c_int00地址、并在指向这些地址之一的函数指针上使用内联分支指令或函数调用。 我希望这涵盖了你的大部分问题,如果你需要进一步澄清,请告诉我。

    谢谢、

    肖恩

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

    根据我的理解、需要在启动文件中进行修改以复制矢量表。

    是否可以更新 TI-RTOS 项目的启动文件? 或者如何控制启动文件?

    我的基本需求是成功地从一个 TI-RTOS 应用程序跳转到其他 TI-RTOS 应用程序。

    对于我的问题声明中提到的情形1、该情形有2个应用程序、并且两个都使用 TI-RTOS。

    请分享情景1的示例项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在上面的共享示例中、根据我的理解、跳转到应用程序是通过引导加载程序的裸机代码。

    在启动文件中,CallApplication()管理启动其它应用程序。 同样,对于 TI-RTOS 项目/应用程序,使用哪个启动文件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Harshal 没有问题。 根据示例文档、您的 RTOS 应用程序将被配置为将其矢量表放置在其自己的闪存空间中。 因此、无需修改它们的初始值。 如果您确实想修改 TI RTOS 应用的启动,则有一个称为启动的 XDC 运行时模块,它允许用户在启动期间在 Main()之前运行自己的代码。 有关启动(XDC->runtime -> startup)的文档,请参见 SYS/BIOS 文档:

    http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/sysbios/6_75_01_05/exports/bios_6_75_01_05/docs/cdoc/index.html

    注意:您应该转到您正在使用的 SYS BIOS 版本的文档。 此版本号应在 SDK 的清单中。

    对于您的情形#1、第一个应用程序放置在0x0处并运行、直至其跳转到下一个应用程序(假设您将其放置在0x4000处)、该应用程序随后照常运行。 要跳转到下一个应用程序、您可以执行引导加载程序对内联汇编执行的操作:

    //
    //从应用程序的矢量表加载栈指针。
    //
    #if (app_start_address!= VTABLE _start_address)
    asm (" movw r0、#(app_start_address & 0xFFFF)");
    #if (app_start_address > 0xFFFF)
    asm (" movt r0、#(app_start_address >> 16)");
    #endif
    #endif
    asm (" LDR SP、[r0]");
    
    //
    //从应用程序的矢量表加载初始 PC 并分支到
    //应用程序的入口点。
    //
    asm (" LDR r0、[r0、#4]");
    asm (" bx R0"); 

    您只需在编译时向应用程序提供下一个应用程序的地址(例如0x4000)。 由于您将配置应用程序使其矢量表位于其起始地址、因此应用程序将以正常放置的方式运行。

    谢谢、

    肖恩

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我按照建议尝试了、但它在0x0000而不是0x4000处启动相同的应用程序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用应用程序起始地址加载了 R0、它正在成功运行。

    感谢您的支持。