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.

[参考译文] 编译器/AM3358:错误的TI-CGT-PRU_JAL 2.1 ........4 (和JMP 2):2.1 和JAL转发引用的标签或寄存器参数时出错

Guru**** 2530720 points
Other Parts Discussed in Thread: PROCESSOR-SDK-AM335X, AM3359

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/568879/compiler-am3358-erroneous-ti-cgt-pru_2-1-4-and-2-1-2-error-in-jmp-and-jal-to-forward-referenced-label-or-register-argument

部件号:AM3358
“线程”中讨论的其他部件:Processor-SDK-AM335X,AM3359

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

它可能关注的对象。 我似乎已经验证了,对于ti-CGT-PRU_JMP 4和ti-CGT-PRU_JMP 2.1 .2,当参数为‘前向引用标签’或“寄存器”时,2.1 指令不起作用。 该指令在反向引用的标注参数上正确运行。 但是,QBA指令与正向引用的标签参数一起工作是正确的,因此这是标签参数的解决方案,但QBA不接受寄存器参数。 对于注册参数,可以使用JAL指令(CALL)代替JMP作为变通方法。 但是,JAL的指示也被打破了! 哎呀!

同样,我的投诉也与转发参考符号有关,这也不是偶然的。 我上一篇题为“编译器/processor-SDK-AM335X:在宏调用过程中汇编器符号表中不提供前向引用的标签”的文章也描述了我认为AST解析器在第一遍中没有正确附加符号表的问题。 也许这可能会缩小对汇编程序错误源的搜索范围。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您说JMP "不起作用",JAL "已损坏"。 我不确定你的意思到底是什么。 出现问题时,您看到了哪些错误行为? 汇编程序是否拒绝该语句? 汇编程序是否错误地翻译它? 指令在运行时是否执行不正确?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    列表文件按顺序显示。

    JMP指令不跳转到:
    1.前向引用的标注参数(我还不知道汇编程序是否实际执行了指令。 我将很快测试。)
    2.注册参数

    日航指示不跳转到:
    1.前向引用的标注参数(我还不知道汇编程序是否实际执行了指令。 我将很快测试。)
    2.注册参数

    我相信我没有测试过每个角箱。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正在对两个指令执行某项操作,因为后面的指令不会立即执行。 似乎执行了跳转,但我不知道。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    JMP到向后引用标签的工作方式:

    core_loop:
    QBBS EVENT_handler,R31,30
    JMP core_loop
    事件处理程序:

    日航无法注册内容:
    (已验证分支指令已执行,但不知道跳转至何处)

    LDI R9,ISR_JMP64_TABLE
    添加 R9,R9,7
    日航 R3.R2,R9.W0
    ...某些东西在这里不会执行
    ISR_JMP64_表:

    用于注册内容的JMP不起作用:
    (已验证分支指令已执行,但不知道跳转至何处)

    LDI R9,ISR_JMP64_TABLE
    添加 R9,R9,7
    JMP R9.W0
    ...某些东西在这里不会执行
    ISR_JMP64_表:

    JMP到转发引用标签不起作用:
    (已验证分支指令已执行,但不知道跳转至何处)

    JMP ISR_JMP64_TABLE
    ...某些东西在这里不会执行
    ISR_JMP64_表:
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否能够在CCS中以单步模式跟踪JMP/JAL的执行情况?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有使用CCS。 在Windows主机上的Debian虚拟机中的Linux命令行上运行;-)哈哈
    此外,设置单步调试工具链并不完全属于此项目的范围。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我是唯一使用此编译器/汇编器的人吗? 正如您可以进行映像一样,如果没有JMP &register指令,该工具将不能用于除最基本的内联代码之外的所有代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此问题是否与不正确的链接程序命令文件有关? 只是一个想法。 我正在使用提供的AM3359_PRU.cmd文件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们在内部使用编译器/汇编器来构建和验证。 RTS文件大约有2000个"JMP REG"指令和大约3000个"JMP IMM"指令,我们实际上能够运行该代码,因此这些指令可能会出现一些错误,这有点令人惊讶。 我不太了解PRU,无法确定问题是什么,更不用说是否涉及链接程序命令文件了。 我正在尝试收集足够多的测试案例,以便进入进行分析。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否向我展示一个演示不当的JMP/JAL说明的拆卸示例? 我特别需要查看操作码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外,请准确描述您如何知道跳转指令操作不当。  您在看什么?  您到底是怎么做的?

    谢谢,此致,

    -George

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

    我花了一整天时间观察JMP和JAL两个说明的变化操作。 下面是.lst文件的一个片段,演示了这些指令的几种变体的编码。 一些初始内嵌汇编程序代码功能充分,因此我可以将数据写入PRU共享RAM并从ARM访问这些数据,然后直观地访问stdio测试套件。 我能够在分支地址验证代码执行情况。 JMP和JAL说明的任何版本都不能正确执行。 我可以使用QBA在JMP/JAL测试使用的相同标签上成功分行。 使用PASM组装时,原始汇编代码将正确执行。

        292.
        293;**************************************                                
        294                               ;调用.macro dst
        295;                                     JAL    callReg.w2,DST
        296                               ;      .endm
        297;                                
        298                               ;其中,'callReg’被定义为'r3.w2',即
        299;                                
        300                               ;#define callReg      R3
        301                               ;      %}
        302                               ;**************************************
        303.
        304       ;QBA           IET_CMR0_ISR +8.
        305                               ;--
        3.06亿 000001b80000002100BC00         JMP            0x2f0
        307                               ;--
        3.08亿bc 00000021000000!         JMP            IET_CMR0_ISR
        309                               ;--高于IET_CMR0_ISR =0x2f0
        3.1亿 000001c000000020 00000020E9万         JMP            regVal
    #                                         JMP            R9.
        311                               ;--高于regVal = 0x20c
        3.12亿c4                        致电   IET_CMR0_ISR
    100.0001万       000001c400万 00000023万C3!         日航            callReg.w2,美国夏令时
    #                                         JAL            R3.w2,IET_CMR0_ISR
    PRU汇编器Unix v 2.1 42017年1月21日21:36:25星期六

    工具版权所有(c) 2012-2015 Texas2015 Texas Instruments Incorporated
    /home/brendan/ti-CGT-PRU_ASM.4/example/PRU_hardI2C_IET_Interrupt.asm 2.1 第  13页

        313                               ;--高于IET_CMR0_ISR =0x2f0
        3.14亿c8                        呼叫   0x2f0
    100.0001万       000001c80000002300BCC3         JAL            callReG.w2,美国夏令时
    #                                         JAL            R3.w2,0x2f0
        315                                 
        3.16亿cc 0万230000C3!23万!         JAL            R3.w2,IET_CMR0_ISR
        317                               ;--高于IET_CMR0_ISR =0x2f0
        3.18亿 000001d00000002300BCC3         JAL            R3.w2,0x2f0
        319                               ;------------------

        3.29亿f0                ISR_JMP64_TABLE:
        3.3亿 000001f0万 0000002100万!         JMP            core_loop
        3.31亿 000001f400万 0000002100万!         JMP            core_loop
        3.32亿 000001f800万 0000002100万!         JMP            core_loop
        3.33亿fc 00000021000000!         JMP            core_loop
        3.34亿 0000020万 0000002100万!         JMP            core_loop
        3.35亿 000002400万 0000002100万!         JMP            core_loop
        3.36亿 000002800万 0000002100万!         JMP            core_loop
        3.37亿0c 00000021000000!         JMP            IET_CMR0_ISR   ;ISR
        3.38亿 0000021000万 0000002100万!         JMP            core_loop
        3.39亿 0000021400万 0000002100万!         JMP            core_loop

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

    广泛的验证活动表明,日航指令的标签参数中减去了0x40 (64字节)的偏移量。

    例如,说明:

    JAL   R3.w2,my_label

    实际表现为:

    JAL   R3.w2,my_label - 0x40

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

    您向我们展示的是汇编程序为可重定位目标文件输出的列表文件,而不是可执行文件。  根据PRU汇编语言工具用户指南,! 操作码末尾的重定位指示符表示未定义的外部引用,这意味着这些零字段中的某些字段将在链接时填充。  请参阅上的PRU Assembly Language Tools User's Guide (PRU汇编语言工具用户指南)

    http://processors.wiki.ti.com/index.php/TI_Compiler_Information#Compiler_Manuals

    例如,标记为ISR_JMP64_TABLE的表有一组具有完全相同操作码的指令,该操作码只是JMP IMM的操作码,没有实际目的地值。  至于列表第306行的说明,在组装时目的地是已知的,因此它出现在操作码中,并且没有重定位字符。

    单凭商品信息文件不足以深入了解此问题。 我们还需要从ofdpru提供的目标文件转储重定位表。 但是,最好是查看可执行文件的反汇编。 如果您想确定,请发送给我们:

    1. 链接程序映射文件(链接程序选项--map_file)
    2. 可执行文件(通常命名为homething.out)

    1. 链接程序映射文件(链接程序选项--map_file)
    2. ofdpru -v something.out的完整输出
    3. dispru simeting.out的完整输出

    JMP指令不应在执行过程中减去任何内容。  JMP IMM指令中有一个16位字段,该值乘以4得到实际的绝对地址。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ! 符号:我收集到它代表了一个链接时间操作。

    第306行的参数0x2f0不是一个标签,其值是由汇编程序插入的,而是由我进行硬编码,以消除标签损坏的可能性(如果存在的话):一个要处理的变量。

    我将在以后提供您请求的文件。

    我充分意识到日航的指令不应该在执行过程中从争论中减去任何东西。 我只是陈述一个事实,事实上,对于我安装的ti-CGT-PRU_TI4 2.1 工具,实际上,该指令确实映射了参数my_label ->(my_label - 0x40)。

    我很清楚16位的论据要求。 实际上,16位参数实际上被4除以.lst文件中表示的4,以便与4字节指令大小边界一致。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一些意见。 这真的很奇怪。

    对于CALL (呼叫)/RET (返回)功能,即:

    JAL R3.w2,0x123 + 0x40 (硬编码)
    ...
    0.0123万"此处有一些代码"
    ...
    Label1:"assembler is Fine with this label (使用此标签的汇编程序正常)"
    ...
    标签2:"使用此标签组装者不好,有人观察到,最初在JAL R3.w2中写入的'return address+1'似乎是伪造的。 在某些情况下,如果当汇编程序有机会替换标签参数(而不是硬编码呼叫地址)时,JMP R3.w2 (RET)指令与被调用标签(地址)偏移>=0x40字节, R3.w2中的返回地址不正确,PRU代码以lar结束。
    ...
    JMP R3.w2

    在上述情况下,在被叫地址和JMP R3.w2 (RET)指令之间的汇编源中不能存在超过'1'的标签,或者最初插入R3.w2的返回ardress+1,将我们跳到了lar,lar土地。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    让我直言不讳:我认为你在朝着错误的方向付出了很多努力。 我认为,如果PRU汇编程序和链接程序像您建议的那样经常出现编码错误,我们的测试案例都不会起作用。 但是,我们的测试案例对我们来说很好。 因此,我怀疑这一假设。 我不知道您的测试用例发生了什么导致它们无法正常工作。 我现在最猜测的是,您正在尝试执行一个不受支持的可重定位目标文件。 我建议,花时间进一步描述问题是不会有成果的;我们能够迅速实现的是一个测试案例,我们可以重现错误的行为。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    就我而言,我从未明确采取任何行动来迁移任何代码。 当使用PASM组装时,所有相关代码都能完美地工作。 TI clpru汇编器的使用在这里是唯一不同的,尝试转换的唯一原因是为了让我可以使用PRU C/C++编译器。

    这是我的clpru命令行:

    #仅装配体构建
    ./bin/clpru -ax \
    2.1 .4/example/PRU_hardI2C_IET_Interrupt.asm \
    --run_linker --verbose_diagnostics \
    --map_file=PRU_hardI2C_IET_Interrupt.map \
    -i $build_root/ti-CGT-PRU_PRU.4/lib 2.1 \
    2.1 .4/example/PRU_hardI2C_IET_Interrupt.bin \
    --library=AM335x_PRU.cmd

    这是我的链接程序.cmd文件,其中包含注释掉的部分:

    /******************************************************************************** /
    /* AM335x_PRU.cmd */
    /*版权所有(c) 2015 Texas Instruments Incorporated */
    /* */
    /*说明:此文件是链接程序命令文件,可用于*/
    /* 链接使用C编译器和构建的PRU程序 */
    /* AM335x设备上生成的.out文件。 */
    /******************************************************************************** /

    使用 C约定的-CR /*链接*/
    堆栈0x100
    堆0x100


    /*指定系统内存映射*/
    内存

    第0页:
    PRU_IMEM_0 :org = 0x0万 len = 0x0.2万 /* 8KB PRU0指令RAM */
    PRU_IMEM_1 :org = 0x0.2万 len = 0x0.2万 /* 8KB PRU1指令RAM */

    第1页:

    /* RAM */

    PRU_DMEM_0 : org = 0x0万 len = 0x0.2万 CREGISTER=24 /*8KB PRU数据RAM 0*/
    PRU_DMEM_1 :org = 0x0.2万 len = 0x0.2万 CREGISTER=25 /* 8kB PRU数据RAM 1*/

    第2页:
    PRU_SHAREDMEM : org = 0x1万 len = 0x0.3万 CREGISTER=28 /* 12KB共享RAM */

    /*
    DDR : org = 0x8000000000 len = 0x0.01万 CREGISTER=31
    L3OCMC :org = 0x4000万 len = 0x1万 CREGISTER=30
    */

    /*外围设备*/
    /*
    PRU_CFG :org = 0x2.6万 len = 0x0.0044万 CREGISTER=4
    PRU_ECAP :org = 0x3万 len = 0x0.006万 CREGISTER=3
    PRU_IEP :org = 0x0002E000 len = 0x0.0031万C CREGISTER=26
    PRU_INTC :org = 0x2万 len = 0x0.1504万 CREGISTER=0
    PRU_UART :org = 0x2.8万 len = 0x0.0038万 CREGISTER=7

    DCAN0 :org = 0x481CC000 len = 0x0.0001万E8 CREGISTER=14
    DCAN1 :org = 0x481D0000 len = 0x0.0001万E8 CREGISTER=15
    DMTIMER2 : org = 0x4804万 len = 0x0.0005万C CREGISTER=1
    PWMSS0 :org = 0x4830万 len = 0x0.0002万C4 CREGISTER=18
    PWMSS1 : org = 0x4830.2万 len = 0x0.0002万C4 CREGISTER=19
    PWMSS2 : org = 0x4830.4万 len = 0x0.0002万C4 CREGISTER=20
    gemac : org = 0x4A10万 len = 0x0.0128万C CREGISTER=9
    I2C1 :org = 0x4802A000 len = 0x0万D8 CREGISTER=2
    I2C2 :org = 0x4819C000 len = 0x0万D8 CREGISTER=17
    MBX0 :org = 0x480C8000 len = 0x0.014万 CREGISTER=22
    McASP0_DMA : org = 0x4600万 len = 0x0.01万 CREGISTER=8
    MCSPI0 :org = 0x4803万 len = 0x0.0001万A4 CREGISTER=6
    MCSPI1 :org = 0x481A0000 len = 0x0.0001万A4 CREGISTER=16
    MMCHS0 :org = 0x4806万 len = 0x0.03万 CREGISTER=5
    SPINLOCK :ORG = 0x480CA000 len = 0x0.088万 CREGISTER=23
    tPCC : org = 0x4900万 len = 0x0.1098万 CREGISTER=29
    UART1 : ORG = 0x4802.2万 len = 0x0.0088万 CREGISTER=11
    UART2 :org = 0x4802.4万 len = 0x0.0088万 CREGISTER=12

    RSVD10 :org = 0x4831.8万 len = 0x0.01万 CREGISTER=10
    RSVD13 :org = 0x4831万 len = 0x0.01万 CREGISTER=13
    RSVD21 :org = 0x3.24万 len = 0x0.01万 CREGISTER=21
    RSVD27 :org = 0x3.2万 len = 0x0.01万 CREGISTER=27
    */
    }

    /*指定分配给内存的部分*/
    部分{
    /*强制_c_int00到PRU IRAM的起点。 装载时不需要
    ELF文件,但在加载二进制文件*/时很有用
    text:_c_int00* > 0x0,第0页

    text > PRU_IMEM_0,第0页
    .stack > PRU_DMEM_0,第1页
    .bss > PRU_DMEM_0,第1页
    CIO > PRU_DMEM_0,第1页
    数据 > PRU_DMEM_0,第1页
    .switch > PRU_DMEM_0,第1页
    sysmem > PRU_DMEM_0,第1页
    .cinit > PRU_DMEM_0,第1页
    .rodata > PRU_DMEM_0,第1页
    .rofardata > PRU_DMEM_0,第1页
    .farbss > PRU_DMEM_0,第1页
    .fardata > PRU_DMEM_0,第1页

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

    就我而言,我从未明确采取任何行动来迁移任何代码。 当使用PASM组装时,所有相关代码都能完美地工作。 TI clpru汇编器的使用在这里是唯一不同的,尝试转换的唯一原因是为了让我可以使用PRU C/C++编译器。

    好吧,这是pasm和clpru之间的一个主要区别:使用clpru,您必须链接代码才能生成可执行文件。  链接执行重新安置和安置。

    clpru命令行包含--run_linker命令,因此您正在链接程序。  您正在使用--output_file选项,因此您的可执行文件名为$build_root/ti-CGT-PRU_PRU.4/example/PRU_hardI2C_IET_Interrupti.bin 2.1 ;这就是我们需要检查的文件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    至于开放源代码库,我们尚未真正将其视为战略的一部分。 我一直在努力通过一个异常操作示例减少我们的代码库的样本,但这显然需要一些时间,因为复制症状似乎取决于当前的标签位置。 我想与您合作,但对开放源代码库的整个过程存在顾虑。 当我有一些缩小的,可重现的东西时,我会告诉您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    确保您正在加载和执行可执行文件,而不是可重定位文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将输出文件指定为.bin扩展名,这就是我正在加载的内容。 我是否应该加载其他文件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    幻数0x40
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    链接器输出文件的名称不相关;更改名称不会更改输出类型。  链接程序生成一个目标文件;通常是一个绝对的,可执行的目标文件。  PRU仅支持ELF,因此幻数应为(十六进制) 7f 45 4c 46或"^?ELF"。

    请在.bin文件上运行ofdpru -v,并显示"对象文件信息"部分。  应如下所示:

    对象文件信息
    
    文件名: A.退出
    格式: ELF版本1
    文件类型: 可执行文件
    机器: TI PRU
    机器端数: 小Endian
    入口点: 0x0.5538万
    供应商: 德州仪器(TI)
    生产商: 链接器
    链接器版本: 2.2 .................0
    章节数:28
    文件长度: 24.6508万
    ELF类: 32位对象
    elf e_flags: 0x0万
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

       文件名:          PRU_hardI2C_IET_Interrupt.bin
       格式:             ELF版本1                
       文件类型:          可执行文件              
       机器:            TI PRU                       
       机器端心:     小端心                
       入口点:        0x0万                   
       供应商:             Texas Instruments,Inc.      
       Producer:           linker                       
       链接器版本:2.1     .................................4.                        
       章节数: 148                          
       文件长度:        2.0784万                        
       Elf类:          32位对象               
       elf e_flags:        0x0万          

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,这确实是可执行文件。 我的假设似乎是不正确的。
    那么我真的不知道发生了什么。 这有助于查看目标文件和映射文件。
    您使用什么程序将ELF文件加载到目标中?
    您是否对可执行文件执行任何链接后处理?
    您是否在目标上重新定位程序(可能使用引导加载程序)?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不执行开机自检处理二进制映像。

    下面是如何将映像文件加载到PRU。
    我运行的是Linux-Xenomai,让ARM执行启动加载。

    /****************************************
    *将PRU二进制映像加载并执行到PRU1
    *************** /
    rt_printf("\t->正在加载PRU1二进制文件\n");
    prussdrv_exec_program (PRU_num1,PRU1_binary);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    *****************
    PRU链接器Unix v 2.1 4.
    *****************
    >> 2017年1月24日12:35:53链接星期二

    输出文件名:2.1 </home/Brendan/ti-CGT-PRU_Interrupti.4/example/PRU_hardI2C_IET_Interrupt.bin>
    入口点符号:"_boot"地址:0万


    内存配置

    名称 原点长度 已使用 未使用的属性填充
    ---------------- ----------------- ------------------- ----------------- ----------------- --------
    第0页:
    PRU_IMEM_0 0万00 000020000万02000 000004d420亿d4 00001b2c400001b2c RWIX

    第1页:
    PRU_DMEM_0 0万00 000020000万02000 0000000020亿00 000020000万02000 RWIX0.2万 RWIX
    PRU_DMEM_1 0.002万00 000020000万02000 0000000020亿00 000020000万02000 RWIX0.2万 RWIX

    第2页:
    PRU_SHAREDMEM 0.01万00 000030000万03000 0000000030亿00 000030000万03000 RWIX0.3万 RWIX


    区段分配图

    输出 属性/
    书帖页面原点 长度 输入部分
    ----------------- -------- -------- --------
    文本 0万 0000000.0004万d4
    0.0001万 000004d4 PRU_hardI2C_IET_Interrupt.obj (.text)

    cinit 100万 0000000万 0000万 未初始化


    全局符号:按名称的字母顺序排序

    页面地址名称
    -------- ---
    0 0.0001万fc ISR_JMP64_TABLE
    ABS 0万 __PRU_CREG_base_PRU_DMEM_0
    ABS 0.2万 __PRU_CREG_base_PRU_DMEM_1
    ABS 1万 __PRU_CREG_BASE PRU_SHAREDMEM
    ABS 0.0018万 __PRU_CREG_PRU_DMEM_0
    ABS 0.0019万 __PRU_CREG_PRU_DMEM_1
    ABS 0.0001万c __PRU_CREG_PRU_SHAREDMEM
    ABS ffffffffff __binit__
    ABS ffffffff __c_args__
    0 0万 _boot
    ABS ffffffffffff活页夹


    全局符号:按符号地址排序

    页面地址名称
    -------- ---
    0 0万 _boot
    0 0.0001万fc ISR_JMP64_TABLE
    ABS 0万 __PRU_CREG_base_PRU_DMEM_0
    ABS 0.0018万 __PRU_CREG_PRU_DMEM_0
    ABS 0.0019万 __PRU_CREG_PRU_DMEM_1
    ABS 0.0001万c __PRU_CREG_PRU_SHAREDMEM
    ABS 0.2万 __PRU_CREG_base_PRU_DMEM_1
    ABS 1万 __PRU_CREG_BASE PRU_SHAREDMEM
    ABS ffffffffff __binit__
    ABS ffffffff __c_args__
    ABS ffffffffffff活页夹

    [11个符号]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以下是一个线索。 "文件偏移: 0x0.0034万"的问题?

    <2>".text"
    加载地址: 0x0万 运行地址: 0x0万
    大小: 0x134 对齐: 4.
    已加载到设备:是 地址单元大小:8位
    文件偏移量: 0x0.0034万. #关系: 0
    部分类型: SHT_PROGBITS页面: 0
    elf sh_flags: 0x0.0006万 elf sh_flag: SHH_ALLOC
    elf sh_flag: SHH_EXECINSTR TI ext_flags: 0x0
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brendan Graham 说:
    文本"File Offset: 0x0.0034万"

    的确切含义和含义是什么?

    这是可执行文件中开始.text部分内容的字节位置。  请注意,这不是PRU内存中.text的地址。  这由运行地址表示,即0。

    谢谢,此致,

    -George

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

    在.ofd文件中,不在初始.text节之前指定任何.align指令,也不等效于

    对齐0x0

    文本

    以下摘录所示,文件偏移为0x34

    <2>".text"

    加载地址:0x0万运行地址:0x0万

    大小:0x134对齐:64

    加载到设备:是地址单元大小:8位

    文件偏移:0x0.0034万 # Relocs: 0

    书帖类型:SHT_PROGBITS页面:0

    elf sh_flags:0x0.0006万 ELF sh_flag:SHF_ALLOC

    elf sh_flag:SHF_EXECINSTR TI ext_flags:0x0

    在同一汇编代码.text部分中,进行了以下陈述

    CLREN_INTS:

    0.0068万 LDI R9.W0,0x0004;地址0xec处的SBCO指令长度

    0.0006万c LDI R9.w2,0x55aa

    0.007万 JAL R3.w2,CLREN_INTR + 0x20;正在测试的分支指令

    ;@呼叫地址+“测试偏移”(0x20)

    0.0074万 SBCO &R9,C28,4*6,4;指令@呼叫地址+ 0x4

    ;“返回地址”(0x0.0074万)

    。 。 .这里有一些代码

    0万cc添加R9,R9,4

    0万d0添加r9,r9,4

    0万d4添加r9,r9,4

    0万d8添加r9,r9,4

    0万dc添加r9,r9,4;地址0x70处的分支指令跳到此处!!!

    0万e0添加r9,r9,4

    0万e4添加R9,R9,4

    0万e8添加r9,r9,4

    0万ec SBCO &R9,C28,4*7,4;R9 = 0x55aa0014写入PRU/ARM共享RAM

    ;我们将R9.W0中的字节计数称为“残留

    CLREN_INTR:

    0万f0和R24,R3,R3

    0万f4 SBCO &R3,C28,4*8,4;R3 = 0x002a0000写入PRU/ARM共享RAM

    ; r3 =“实际返回地址”=(呼叫地址+0x4)/0x4

    0万f8和R9,R24,R24

    0万fc和R9,R24,R24

    0.01万和R9,R24,R24

    0.0104万和R9,R24,R24

    0.0108万和R9,R24,R24

    0.001万c和R9,R24,R24

    0.011万和R9,R24,R24;地址0x70处的分支指令应该跳到这里!!!

    0.0114万和R9,R24,R24

    0.0118万和R9,R24,R24

    0.0011万c和R9,R24,R24

    0.012万和R9,R24,R24

    0.0124万和R9,R24,R24

    0.0128万和R9,R24,R24

    0.0012万c和R3,R24,R24

    0.013万 JMP R3.w2

    前面明显错误的示例代码的结果可以用以下参数解释。 地址0x70处的分支指令应该分支到地址0x110,而是分支到地址0xdc。 我们知道这是因为地址0xec处的SBCO指令写入字节计数0x14 (0x14/4=5指令),在地址0x70处执行分支指令后,从PC的地址开始计算。 直到标签CLREN_INTR被写入ARM共享内存并输出到stdio,寄存器R3.w2中存储的实际返回地址0x2a被写入ARM共享内存并输出到stdio。 因此,以下计算必须为真:

    文件偏移量=测试偏移量+残留物

    0x34 = 0x20 + 0x14

    例如,如果.text部分显式对齐到偏移0x40,则为

    对齐0x40

    文本

    然后验证计算结果是否也为真。

    返回地址=实际返回地址+文件偏移量

    0x2D*4 (0xb4)= 0x74 + 0x40

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

    函数"prussdrv_PRU_write_memory(PRU_ram_id,0, code, codelen)"总是从偏移'0'(即文件的开头)加载二进制可执行文件。 PASM必须写入始终不带偏移的二进制文件。 因此,问题仍然是为什么clpru不删除二进制文件中的已知偏移。 但这是链接程序的任务,它可以根据entry_symbol与二进制文件开头的偏移来正确解析符号。 因此,clpru链接器似乎有缺陷。

    github.com/.../prussdrv.c

    int prussdrv_pru_write_memory (unsigned int pru_ram_id,
    无符号int文字偏移,
    const unsigned int *memarea,
    unsigned int bytelength)

    {}

    int prussdrv_load_data(int prunum, const unsigned int *code, int codelen)
    无符号int pru_ram_id;
    如果(prunum == 0)
    PRU_RAM_id = PRUSS0_PRU0_DataRAM;
    否则,如果(prunum == 1)

    PRU_RAM_ID = PRUSS2_PRU1_DataRAM;

    否则
    返回-1;
    //确保PRU子系统首先被禁用/重置
    prussdrv_pru_disable(prunum);
    prussdrv_pru_write_memory (pru_ram_id,0,code,codelen);
    //prussdrv_pru_enable(prunum);
    返回0;

    }

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

    Brendan,

    prussdrv用户空间库(以及UIO pruss内核驱动程序)用于加载PASM工具输出的二进制格式。

    RemoteProc内核驱动程序能够加载由TI C编译器/汇编器输出的ELF二进制文件 :http://processors.wiki.ti.com/index.php/PRU-ICSS_Remoteproc_and_RPMsg#Remoteproc

    请参阅此e2e答案,了解如何将resource_table头(RemoteProc所需)添加到程序集文件:https://e2e.ti.com/support/arm/sitara_arm/f/791/p/44.704万/1608294#1608294</s>160.8294万 160.8294万

     有关如何使用RemoteProc驱动程序将固件加载到PRU的介绍,请参阅此实验操作: http://processors.wiki.ti.com/index.php/PRU_Training:_Hands-on_Labs#LAB_4:_Introduction_to_Linux_driver

    Jason Reeder

    附注:或者,也可以通过一系列步骤将ELF二进制文件(从TI编译器/汇编器/链接器)转换为prussdrv库可以使用的格式。 但是,任何对prussdrv或PASM的支持都需要来自BeagleBoard社区,网址为 :http://beagleboard.org/

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

    我使用的2.6 是Linux-3.8_Xenomai-4内核,因此截至2016年5月,当我临时存档此项目时,Remoteproc和RPMsg不可用。 但是,PRUSSDRV确实可以用来以text.bin格式加载clpru C/C++/assembly二进制文件,data.bin从hexpru工具输出。

    使用hexpru,as生成text.bin和data.bin文件

    ../bin/hexpru bin.cmd已编译_c_cpp_ASM_project.out

    在Linux-Xenomai中,执行

    #define PRU1_binary "pasm_binary.bin"

    #define PRU1_DATA_binary "data.bin"

    #define PRU1_text_binary "text.bin"

    ...

    ...

       /*仅用于PASM汇编程序.bin文件*/
       IF (prussdrv_exec_program (PRU_num1,PRU1_binary)== 0){             /*如果找到并在目录*/中加载PASM汇编的二进制文件
           rt_printf ("\t->已成功加载PRU1 %s \n",PRU1_binary);
       }其他{                                              /*否则找不到PASM汇编的二进制文件*/
           rt_printf ("\t->警告:加载PASM组装PRU1 %s失败\n",PRU1_binary);    

          /*仅用于clpru C/C++/汇编程序data.bin文件*/
          IF (prussdrv_load_datafile (PRU_num1,PRU1_DATA_binary)== 0){/*   ,然后尝试仅加载clpru C/C++/assembler data.bin文件*/
             rt_printf ("\t->已成功加载PRU1 %s \n",PRU1_DATA_binary);
          }其他{
              rt_printf ("\t->错误:加载PRU1 %s失败\n",PRU1_DATA_binary);
             返回;
          }

          /*仅用于clpru C/C++/汇编程序text.bin文件*/
          如果(prussdrv_exec_program(PRU_num1, PRU1_text_binary)==0){/*   ,则尝试加载clpru C/C++仅用于text.bin文件*/
             rt_printf ("\t->已成功加载PRU1 %s \n",PRU1_text_binary);
          }其他{
              rt_printf ("\t->错误:加载PRU1 %s失败\n",PRU1_text_binary);
             返回;
          }
       }

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

    Brendan,

    这是否纠正了您的日航时差问题? 或者问题是否仍然存在?

    Jason Reeder

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jason,
    上述解决方案提供了一个简单的问题解决方案。 感谢你的帮助。

    此致,
    Brendan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    没问题。 感谢您再次光临并确认修复!

    Jason