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.

[参考译文] 关于:PROCESSOR-SDK-AM62X:如何编写混合 C 和汇编 PRU 代码

Guru**** 2460850 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1462522/re-processor-sdk-am62x-how-to-write-mixed-c-and-assembly-pru-code

这是在 https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1442234/processor-sdk-am62x-am62x-pruss-core 上继续进行的讨论 

您好、Nick。

谢谢。 我用 C 语言完成了所有这些。 但现在我正在尝试在 PRU 内联汇编中写入相同的 C 代码、并不断出现语法错误。 我正在使用本指南: https://www.ti.com/lit/ug/spruij2/spruij2.pdf?ts = 1736874481764&ref_url=https%253A%252F%252Fwww.google.com%252F  看起来很旧。 它是写它是从2018年,我不知道它是否兼容 am62x。 它是否是 am62x 的真正来源? 如果情况不是这样、您可以为我提供完成该任务所需的正确资源。 提前感谢...

此致

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

    您好、Sevki、

    是的、该指南也适用于 AM62x。

    您是否了解 PRU 入门实验室中的混合 C 语言和汇编语言示例? 您可以在此处找到这些资源:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/10_00_07_04/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab2.html

    我们将在未来几个月内更新这些实验练习、因此如果您有任何反馈、我很乐意倾听。

    如果您仍遇到问题、请附加导致错误的代码片段、以及构建命令和错误输出。

    此致、

    Nick

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

    您好、Nick。

    谢谢。 我的代码太长了、我没有复制这里的所有内容、浪费了您的时间。 我在控制台中得到的是:

    ****构建项目测试的配置调试****

    "C:\\ti\\ccs1280\\ccs\\utils\\bin\gmake"-k -j 20 all -O
     
    构建文件:"../main.c"
    调用:PRU 编译器
    "C:/ti/ccs1280/ccs/tools/compiler/ti-cgt-pru_2.3.3/bin/clpru --include_path="C:/Users/sevkierdem/workspace_v12/Test --include_path="C:data"--include_path="C:/ti/pru-software-support-package-6.4.0/include/am62x /ti/ccs1280/ccs/tools/compiler/ti-cgt-pru_2.3.3/include --include_path="C:/ti/ccs1280/ccs/tools/compiler/ti-cgt-pru_2.3.3/include --include_path="C:/ti/pru_cgt/include --include_path="C:page"-g --diag_warning=225 --diag_wrap=off --display_error_number --endian=little -pd_predependency="proc/pre_d" 。
     
    >>编译失败
    subdir_rules.mk:9:目标"main.obj"的配方失败
    "../main.c"、第468行:错误#18:预期 a ")"
    "../main.c"、第478行:警告#12-D:解析在出现先前的语法错误后重新启动
    编译"../main.c"时检测到1个错误。
    gmake:***[main.obj]错误1.
    gmake:由于错误、未重制目标"all"。

    ****构建完成****

    这是我遇到问题的内联汇编代码:

     _asm volatile (
                  "MOV    R5、%[nHostCommand"\n"                             
                  "MOV    R6、%[数据]                                    \n"
                  "MOV    r7、%[CLK]                                     \n"
                  "MOV    R8、%[nTXData]                                 \n"
                  "MOV    R12、%[DIRECTION_OUT]                          \n"
                  "MOV    R13、%[DIRECTION_IN]                           \n"
                  "MOV    R15、%[__R30]                                  \n"
                  "MOV    R16、%[__R31]                                  \n"

      nHostCommand 和 nTXData 是二进制文件、如在 C 中声明的0b01010100101010、它们是 C int 变量、我想以内联汇编方式使用它、并首先将它们分配给一些寄存器、DATA 和 CLK 也是 C int 变量、它们等于 板上的某些引脚。 DIRECTION_OUT 和 DIRECTION_IN 也是 C int 变量。 我将它们用作 C 函数中名为  void configure_gpio_direction (int direction)的参数。 这是代码的第一部分。 中间有一些循环和条件语句、我没有问题、但在某些时候、我调用 configure_gpio_direction 函数来使其可写或可读、这就是它的代码:

    "MOV    R4、R12                                        \n" // R4参数指针
    "BL    CONFIG_GPIO_DIRECTION                        \n"

    无法找到有关如何从内联汇编中调用 C 函数的任何信息。 也可能为 false

    最后一部分是我收到错误消息的位置:

                    :
                    :[DIRECTION_OUT]"r"(DIRECTION_OUT)、
                      [DIRECTION_IN] "r"(DIRECTION_IN)、
                      [nHostCommand]"r"(nHostCommand)、
                      [__R30]"r" (__R30)、
                      [数据]"r"(数据)、
                      [CLK]"r" (CLK)、
                      [_R31]"r"(__R31)、
                      [nTXData] "r"(nTXData)
                    :"R4"、"R5"、"R6"、"r7"、"R8"、 "R12"、"R13"、"R15"、"R16"
                );

    错误来自第一行、警告来自最后一行。 提前感谢。

    此致

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

    您好!

    嗯。 我不确定是否允许在单个__asm()语句中放置多对引号。

    您肯定可以将多个汇编指令放入单个_asm ("汇编\n\t 指令\n\t 请\n\t 在此\n\t");如入门实验中所示:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/10_00_07_04/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab 2_mixedCandAssembly.html#write-the-inline-function-in-assembly

     https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/labs/Getting_Started_Labs /c_and_inline_assembly/solution/am62x/main.c

    汇编代码只是机器语言的单行代码。 汇编语言中没有 C 函数这样的东西。

    如果想要将特定变量传递到汇编代码中、则可以通过定义外部汇编函数、然后根据 C 代码将变量传递到函数中来实现。 就像这样:

    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/10_00_07_04/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab 2_mixedCandAssembly.html#write-the-main-function-in-c

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

    此致、

    Nick

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

    您好、Nick。

    谢谢。 我还有一个问题:如何从 A53内核到达位于10000h 的32kB PRUSS 共享存储器? 提前感谢。

    此致

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

    您好、Sevki、

    对于此处的延迟响应、我们深表歉意。

    A53内核将使用处理器范围的存储器映射来访问它。

    因此在技术参考手册(TRM)的存储器映射一章中、我们看到 PRU 存储器(在存储器映射中称为 ICSSM)从0x3004_0000开始

    如前所述、TRM 章节"PRUSS 全局存储器映射"将共享 RAM 置于0x1_0000的偏移处。

    因此、A53内核将读取或写入0x305_0000以访问 SRAM。

    您可以在 PRU 入门实验室的"调试"实验中找到一些执行该数学运算的示例:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM62X/10_01_10_04/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab5.html

    此致、

    Nick