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:BL 指令中的标签

Guru**** 2390160 points
Other Parts Discussed in Thread: HALCOGEN, TMDX570LC43HDK
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/700189/compiler-tms570lc4357-label-in-bl-instruction

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGENTMDX570LC43HDK

工具/软件:TI C/C++编译器

您好!

   我已将 Halcogen 生成的源代码拆分为多个库。 (主要是 FreeRTOS intto FreeRTOS 库)。 现在、CPU 忽略汇编器指令"BL vTaskStartScheduler"存在问题。

1) 1)调用 vTaskStartScheduler 的主函数

2) 2) 我希望在执行步骤进入后、我会在地址0xFEC 的函数 vTaskStartScheduler 中结束、但会发生以下情况:

我已经将断点放置到错误中断中、以查看是否生成了一些错误、而不是生成了一些错误。

3) 3) vTaskStartScheduler 存在于地址0xFEC 中

您能给我解释一下发生了什么情况、并建议问题在哪里?

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

    "asdf"函数是否为汇编例程? 您能否检查这个"asdf"函数来查看它是否操纵 R14寄存器的内容? 通常、函数会将链接寄存器(R14)推入栈、然后弹出该值、以便在函数调用 asdf 后继续在代码行执行。 您可以单步执行 asdf 函数以查看用于返回到 main()例程的机制。

    此致、
    Sunil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    否 它仅用于检查调试器步入功能是否正常。

    功能主体:
    //待办事项
    void asdf()

    volatile int i = 5;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您单步执行代码、是否能够访问 vTaskStartScheduler 例程? 堆栈设置是否正确? 您是否看到连接寄存器(LR)作为进入和退出 asdf 函数的一部分从堆栈中被压入和弹出?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >如果您单步执行代码、是否能够访问 vTaskStartScheduler 例程?

    否 这是我发布的问题。  ("我希望在执行步骤进入后、我会在地址0xFEC 处的函数 vTaskStartScheduler 中结束、但会发生以下情况")。 为了更加精确、我将使用汇编步骤进入。

    >堆栈设置是否正确?

    代码是由 HALCoGen 生成的、我猜是这样。 (它在.map 文件中可见、SP 寄存器点在.map 文件中定义的范围内、Othervise 我不知道要检查什么)。

    >您是否看到链路寄存器(LR)从堆栈中被推入并弹出...

    否 我认为不应将其压入堆栈。 LR 包含返回地址、如果函数不进行任何调用、则将其保存在堆栈上将无效。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我有其他信息
    -即使没有使用库,也会出现问题。 我已将所有源代码移入项目中
    -如果我将函数 vTaskStartScheduler 重命名为 vTaskStartScheduler2,问题就会消失。 (链接器在重新设计后重新生成函数地址)

    子选项:我能找到汇编器标签的值("bl vTaskStartScheduler"-我想检查'vTaskStartScheduler'的值)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Lukas

    所有命名函数的地址都包含在由链接器生成的.map 文件中。

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

    地址正确:00000fec vTaskStartScheduler。 (从映射文件)

    CPU 不执行 BL 指令时是否存在任何条件?  

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

    我已经为开发套件 TMDX570LC43HDK 准备了示例项目。

    在项目指令"BL     vTaskStartScheduler"从 main 函数中的 vTaskStartScheduler()调用生成,不会产生任何效果。

    源文件'hl_sys_vim.c'中有两行标记为//注意注释。 :

                |(uint32)((uint32)((HW_Cnfg_AttrsObj.ISRs[9]。enable)? 1:0)<<8U)//注意注释此行以跳转到'vTaskStartScheduler'

    //             |(uint32)(((uint32) 0U << 8U)注意取消注释此行以跳转到'vTaskStartScheduler'

    如果您注释第一行并取消注释对 vTaskStartScheduler() stars 工作的第二行调用。

    e2e.ti.com/.../6232.test_5F00_move2d.zip

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

    FreeRTOS 对其内核使用一些 RTI 中断。 这些中断由 FreeRTOS 在内部管理、不得在 FreeRTOS 之外启用或禁用。

    请参阅此相关文章 :e2e.ti.com/.../368633

    此致、
    Sunil
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到该线程与我的问题的关系、说明 BL 在某些情况下不起作用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我注意到 vTaskStartScheduler 未被 MPU_vTaskStartScheduler 包装、OS_TASKS.c 中的其他函数也是如此 然后、我更改了命令文件以将所有代码放置在第一个32KB 之后(所有包装程序函数被放置在这个区域中)。 这种情况很有帮助、系统似乎可以正常工作。

    这将创建多个以下 questin:

    • 即使是前32KB 也具有 HALCoGen 中的执行权限。 这是否意味着其他事情?
    • 在 main 函数中调用 vTaskStartScheduler()之前,是否应该提高访问权限?
    • 为什么它在源代码轻微变化时具有这种不稳定的行为? 我希望调用 vTaskStartScheduler()不会受到闪存存储器中的轻微放置变化的影响。