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.

[参考译文] PRU-CGT:用于 PRU 的 C 编译器不会初始化栈指针。

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1498921/pru-cgt-c-compiler-for-pru-does-not-initialize-stack-pointer

器件型号:PRU-CGT
Thread 中讨论的其他器件:SysConfigTMDSCNCD263P

工具/软件:

我有一个使用 R5 内核初始化 PRU 内核的小型工程。  为 PRU 内核生成的代码是通过用 C 代码编写的 CCS 工程创建的。 当这个生成的代码从 R5 发送到 PRU 时、它将无法正常运行。 妨碍正常运行的问题是、为 PRU 生成的代码绝不会初始化在 R2 保存的栈指针。  

依赖:

  • TI-CGT-PRU_2.3.3
  • TI-CGT-armllvm_4.0.0.LTS
  • MCU_PLUS_SDK_am263px_10_01_00_31
  • SYSCONFIG_1.22.0
  • TMDSCNCD263P - Sitara AM263Px 控制卡

基本编译流程:系统级工程(包括 R5 和 PRU 内核)可从附加的工程文件构建。 首先构建 PRU 内核、它会根据 C 代码创建一个头文件、其中包含构建工件的十六进制版本。 还会保存一个汇编文件以供参考。 创建的头文件包含在 R5 构建中(作为工程配置的一部分)。 R5 内核运行时、它会初始化 PRU 内核、然后传输头文件中包含的指令。

尽管文件中包含调试配置以及有关如何在硬件上复制问题的说明、但并不要求能够调试程序。 可以看到的是这一点 通过 PRU 内核构建创建的 main.asm 文件没有用于初始化栈指针值的指令 、应在 R2 中保存。 生成的第一条指令是递减栈指针(进入 main 函数时的标准操作)。

请注意、我还有 2 篇与此相关的其他 E2E 文章、目前的补救措施是在主循环开始时添加内联汇编命令以强制 R2 为正确的值。 这是一种脆弱的临时解决办法。 生成的代码应在进入 main 函数之前初始化 R2 的值、但没有发生这种情况。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1493084/am263p4-pru-stack-pointer-initialization-when-using-c-code

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1466734/am263p4-pru-register-init-when-compiling-from-c-code

e2e.ti.com/.../System_5F00_Project.zip

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

    TI 的某人能否回复此问题?

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

    您好 Nathan、

    对此类延迟回复表示歉意。  还需要一些其他信息、然后我们才能再次讨论。

    我就这方面与我们的编译器团队进行了跟进-  

    请搜索 PRU 编译器手册、查找标题为系统初始化的子章节。  它解释了编译器随附的 RTS 库中的启动代码如何初始化 SP。  请注意、它发生在 main 启动之前。  最可能的解释是、当集成到更大的 SOC 构建中时、该启动代码被排除在外。  与编译器无关。  

    从 R5F 加载代码时、一些初始化段没有正确加载、

    我们不支持 elf 加载、因此用户应用程序需要处理此操作。 我们已将此视为备货请求、目前建议不要对 PRU 使用基于 C 的编译器、而是使用没有此依赖项的汇编编译器。

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

    遗憾的是、我们将不会更改为对 PRU 使用汇编代码。

    我想了解有关如何正确构建该 SOC 工程的建议、更有可能是 R5FSS0 中用于初始化 PRU 的正确命令。

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

    您好 Nathan、

    我们将为 elf 加载器进行修复。 一旦我有了一些进展、我将向你们介绍最新情况。

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

    您好、Nathan、

    我 不确定这是否有帮助。 但我在其他 PRU 处理器上有一些示例、在这些示例中、我们强制 C 启动例程对指令 RAM 的 0x0 进行寻址、如下所示:

    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/labs/Getting_Started_Labs linker_cmd/AM335x_pru.cmd

    /* Specify the sections allocation into memory */
    SECTIONS {
    	/* Forces _c_int00 to the start of PRU IRAM. Not necessary when loading
    	   an ELF file, but useful when loading a binary */
    	.text:_c_int00*	>  0x0, PAGE 0

    将这些行添加到 linker.cmd 文件是否会导致正确进行初始化?

    此致、

    Nick

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

    您还可以通过检查生成的.map 文件来验证 c_int00 的位置。 如果 c_int00 已经出现在 IRAM 0x0 处、则我不会期望这行代码有所不同。

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

    谢谢你的答复尼克。  

    我已经验证链接器文件中是否存在这些行、这些都很好。 但这无法解决我的问题、那就是从 R5 内核加载 PRU 时、PRU 程序栈指针的值永远不会被初始化。 生成的 PRU 指令中没有执行此操作的指令、我无法找到任何方法来初始化用作 R5 内核堆栈指针的寄存器。

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

    您的 PRU 构建参数是什么? 我想看看 —  disable_auto_rts 是否是构建选项之一 — 如果是,我们可以在删除该参数的情况下重试。

    您似乎参考了 PRU 入门实验、我写道:
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/labs/Getting_Started_Labs

    遗憾的是、我主要是 Linux 开发人员、因此我主要是根据 Linux 和 CCS 加载来验证这些代码、而不是 MCU+驱动程序。

    此致、

    Nick

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

    我已经通过了关于这方面的入门实验室,在几个场合。 中没有 R5 内核加载 C 编译的 PRU 程序的示例。  

    对于 PRU 构建选项:


    编译器:

    -O2 --INCLUDE_PATH=“C:/Software/50019F-HCS/50019F-COD001_System_Project /../50019F-COD001_System/GlobalIncludes PRU/50019F-COD005_PRU_0_Project“--INCLUDE_PATH=“C:/ti/ti-cgt-pru_2.3.3/include --INCLUDE_PATH=“C:/ti/mcu_plus_sdk_am263px_10_01_00_31/source Current_Servo_--INCLUDE Current_Servo Current_Servo_ Current_Servo_ Shared_Includes Current_Servo_ Current_Servo_ Observer_Parameters Observer_Parameters_ Current_Servo_ Resistance_Observer Resistance_Observer_ Current_Servo_ Dither_Average Dither_Average_ Current_Servo_ Hysteresis_Compensation Hysteresis_Compensation_

    链接器:
    -z -m“PRU0.Debug.map"--stack_size=0x1000“--stack_size=0x1000 -i“C:/ti/ti-cgt-pru_2.3.3/lib -i“C:/ti/ti-cgt-pru_2.3.3/include --reread_libs --diag_suppress=10063-D --diag_swrap=off --display_error_number --warn_sections --ram_link_info=“50019F-COD005_PRU_linkmodel="-linkInfo.xml"-linkInfo_info.xml“-linkInfo_info.xml</s>“

    十六进制实用程序:
    -linkerfill --diag_swrap=off --array --array:name_prefix=PRU_0_image

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

    您好、Nathan、

    感谢您的分享。

    我正在尝试这方面的几项工作、以了解是否可以从 AM64x 上的 R5F 加载 C 代码。

    我能否让您与我分享您的内联汇编权变措施的一段? 我 很好奇,看看你是否做了一些不同于 Nilabh 的屏幕截图这里: https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1493084/am263p4-pru-stack-pointer-initialization-when-using-c-code/5757265#5757265 

    我看到您正在使用--keep_asm 编译器设置 (-k)。 我过去曾使用它为汇编代码生成一个起点。 不确定这个生成的输出是否包括生成的 C 初始化函数? 如果是、可能有一种方法可以按照您想要的方式编辑该汇编代码、然后从中间汇编代码完成 C 项目构建? (只是把想法抛出来,此时还没有时间进行评估)。

    此致、

    Nick

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

    下面是我们当前用作此问题补丁的内联汇编的屏幕截图:

    这是有效的、但需要我们 推导 main 函数的栈大小、以便确定栈指针的正确初始值。

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

    是否有人能够进一步研究这一点?

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

    Nathan、感谢您登记入住。

    背景 — 我们现在在做什么?

    该团队目前正致力于发布我们的许多 PRU 项目、并创建培训来展示如何对 PRU 进行编程 (PRU Academy、您将在 AM26x Academy 中看到它: https://dev.ti.com/tirex/explore/node?node=A__AEIJm0rwIeU.2P1OBWwlaA__AM26X-ACADEMY__t0CaxbG__LATEST )

    对于未来的读者、我们还将为 AM243x、AM62x 和 AM64x 创建 PRU Academy。 所有代码都将在此处的 OpenPRU 存储库中:
    https://github.com/TexasInstruments/open-pru

    学院的第一步是将 PRU 入门实验室移植到 AM26x、并添加有关将 PRU 与 MCU+内核配合使用的文档。 然后、我们将扩展到有关所有其他 PRU 特性的培训实验室、如 GPI/GPO、INTC 等

    这与您的问题有何关系?  

    我一直在学习 RTOS 方面的内容、以便可以编写相关文档。 我确实花了几个小时深入研究堆栈指针问题、但进展缓慢。 对于学院的第一个版本、我们漂移到了仅使用 MCU+内核记录汇编代码。 我希望 下个月某个时候回到“如何从 MCU+内核正确加载 C 代码“的问题、但我们会看到。

    此时、我不确定最简单的“悬挂水果“是否找到修改或加载十六进制数组或在 MCU+驱动程序中获取 elf 支持的特殊方法。 我认为没有一个用于评估添加 ELF 支持的固定时间框架。

    请随时通过 ping 获取更新。

    此致、

    Nick