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/DSPBIOS:重新启动 SYSBIOS 程序

Guru**** 2553450 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/607781/rtos-dspbios-restart-sysbios-program

器件型号:DSPBIOS

工具/软件:TI-RTOS

你(们)好

我有一个简单的 SYSBIOS 程序(用于 idk5718上的 A15内核),它在 main()函数中动态创建一个任务。
到目前为止、这是有效的。
在某个时候、我尝试重新启动程序。 程序在 main()处再次停止,但创建任务失败,出现“内存不足”错误。
也许调试器的复位函数只跳转到 main(),而不设置 main()之前的所有内容。
因此、我尝试直接跳转到_c_int00 (通过使用反汇编窗口)、以确保从一开始就设置了 SysBIOS。
从_c_int00运行程序会起作用、但在创建任务时、我仍然会收到"Out of memory"错误消息。
从_c_int00运行时、这是怎么可能的?
是否有其他方法可以在不终止调试会话的情况下从 CCS GUI 重新启动 SYSBIOS 程序?

IM 使用 CCS v7.1.0和 SYSBIOS V6.46.4.53。

此致、
Markus

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

    您使用的是哪种编译器?

    一些链接器可以选择在"加载时间"与"运行时间"之间初始化变量。 加载时间初始化、全局变量在加载目标时由 CCS 初始化。 运行时初始化由一些从 c_int00调用的自动初始化代码完成。

    我认为您应该查看您的链接器选项。 您可能需要运行时变量初始化。

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

    [报价用户="Markus Mueller"]在某个时候,我尝试重新启动程序。

    是否正在使用“Run->Restart (运行->重新启动)”菜单选项?

    [引用 user="Markus Mueller"]调试器的复位函数可能只跳转到 main(),而不设置 main()之前的所有内容。[/quot]

    您在这里提到了"reset"、但也提到了上面的"Restart"、因此我想知道您使用的是哪一个。

    无论如何,这两种情况都不会直接跳转到 main()。  "重新启动"应该只将 PC 放置在_c_int00、 您可能选中了 CCS 选项“Run to main”,在这种情况下,BP 将被放置在 main()上,CPU 将运行(to main(),只要您没有在 main()之前的任何其他位置放置 BP)。  如果取消选中该复选框、当您"重新启动"或"重置"时、PC 应放置在_c_int00、CPU 处于停止状态。

    要更改此行为,请在"Debug"窗口中选择(左键单击) CPU,然后选择菜单项"Tools->Debugger Options->Auto Run and Launch Options"。  这将显示一个窗口、其中包含"Auto Run Options"、其中"Run to symbol"字段设置为"main"。  在其下方、取消选中"On a program load or restart (在程序加载或重新启动时)"。  "Run to symbol"字段将不再相关、因此您可以将其设置为"main"。

    [引用 user="Markus Mueller"]是否有其他方法可以 在不终止调试会话的情况下从 CCS GUI 重新启动 SYSBIOS 程序?

    您可以执行“Run->Load->Reload Program”,如果 Karl 在之前的回复中是正确的,则重新加载将允许加载时 cinit 正确发生。

    此致、

    - Rob

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

    我想说"重启"而不是"复位"。
    使用“Run->Load->Reload Program”可以正常工作。
    我将为 AM571x 的 A15内核使用编译器版本"GNU V4.0.3 (Linaro)"、为 AM571x 的 C66内核使用"TI V8.1.3"。
    对于 TI V8.1.3、我可以找到链接器选项来选择 RAM 或 ROM 的斜体化。 但我找不到适用于 GNU 编译器的此选项。

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

    [引用 user="Markus Mueller">对于 TI V8.1.3、我可以找到链接器选项来选择 RAM 或 ROM 的斜体化。 但我找不到 GNU 编译器的此选项。

    我认为 GCC 不支持运行时初始化的概念、至少不支持直接初始化。

    在 GCC 中、初始化的数据进入.data 段、而未初始化的数据进入.bss 段。  链接器使用初始化程序值写入.data 段、并由 CCS 直接加载。  不加载.bss 段、而是通过 GCC 启动代码进行0初始化。

    使用 TI 编译器、它们都转到.bss (是的、这甚至意味着已初始化的全局变量)、具有初始化程序的全局变量会为它们生成 cinit 记录。  正是这条 TI cinit 记录在加载时由 CCS 加载程序进行处理、或在运行时由早期运行的特殊函数(例如,在 main()之前运行)进行处理并处理 cinit 记录。

    因此、我认为、对于 GCC 编译的程序、您需要始终重新加载它们、以使其初始化值存在。

    此致、

    - Rob

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

    尊敬的 Rob:

    感谢您的讲解。

    此致、
    Markus