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:PRU 汇编器问题

Guru**** 2925550 points

Other Parts Discussed in Thread: TIDA-01555

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/665338/am3358-pru-assembler-issue

器件型号:AM3358
主题中讨论的其他器件:TIDA-01555

您好!

我感谢您提前为这个问题提供的帮助。 在 BeagleBone Black Rev C 上进行 PRU 编程时(我是汇编编编语言编程的新手)、我一直在努力对其中一个端口进行轮询、以确定传入数字信号的频率。 我不清楚、因为出于某种原因、我无法生成.bin 文件生成 "pasm -b filename.p"(我使用此命令生成.bin 文件)  

-它确实会为我尝试过的其他汇编器程序生成.bin 文件。

-在运行 pasm -b 命令后,程序中没有错误,因为它显示0错误

我将获得以下输出-

 

通过2:0错误,0警告

写入27个字的代码图像

错误:无法打开输出文件:SIGNAL.bin

//signal.p.是我的成员程序文件

我已编写以下程序-

.origin 0 //在 PRU 存储器中启动程序
.entrypoint start //程序入口点(用于调试器)

#define delay 49994
#define init 0 //选择延迟值以适应所需的频率
// 1提供20MHz 时钟信号,从此处增加
开始:
MOV r0、初始化
MOV R1、延迟
MOV R2、INIT
MOV R3、INIT
MOV R4、INIT
MOV R5、INIT
MOV R6、INIT //将延迟值加载到 R1中

MAINLOOP:
MOV R6、r30
MOV r0、R1 //R6由 r30或 P9_27上的输入分配
QBNE COUNTER1、r6、0 //将 R6值与0进行比较,如果事实证明有误,则跳转到 COUNTER1
QBNE COUNTER0、r6、1 //将 R6值与1进行比较、如果事实证明存在错误、则跳转到 COUNTER0

COUNTER1:
subr0、r0、1 //将计数器减1并循环(下一行)
QBNE COUNTER1、r0、0 //循环、直到延迟过期(等于0)
MOV r2、0 //R2是0时间周期的计数器、设置为0
添加了 R3、R3、R4 //R4是0时间计数器循环的本地计数器
添加了 R5、r5、1 //R5是1个时间计数器循环的本地计数器
MOV r4、0 //为了平衡执行周期,增加了一个额外的命令
将数据传输到主转换器变量 R3后、MOV r4、0 //R4设置为0
Qba MAINLOOP

COUNTER0:
subr0、r0、1 //将计数器减1并循环(下一行)
QBNE COUNTER0、r0、0 //循环、直到延迟过期(等于0)
MOV r3、0 //R3是计数器1、设置为0
添加 R2、R2、R5 //本地计数器1的最终值被转换为 global 计数器1
添加 R4、r4、1
MOV r5、0
Qba MAINLOOP //此操作用于将指针发送回 MAINLOOP,这使得程序是无限的

结束:
停止//结束未实现的 PRU 程序

感谢你的帮助

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

    Hithesh 您好!

    TI 不再支持 PASM。

    CLPRU 项目最简单的框架是

    ;remoteproc Linux 驱动程序所需的资源表
    .global|| pru_remoteproc_ResourceTable||
    .sect".resource_table:retain"、rw
    .retain
    .align 1
    .elfsym|| pru_remoteproc_ResourceTable||、sym_size (20)
    
    ||、pru_remote_ResourceTable|:
    .32@
    
    
    
    位;保留.32 @位;.pru_remote_remote_proc .32 @位;.32位;.32位:.pru_remote_remote_remote_remote_remote_remote_pru.32位;.32位;.32位;.text 0.text 0.text 0.pru.pru.text 0.text 0.text 0.r.text @pru_remoteproc_ResourceTable.offset[0]@ 128
    
    .sect".text:main"
    .clink
    .global||main||||||main||
    
    :
    
    ;代码在此处
    
    停止 

    此致、  

    Nick

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回答。 我确实使用 TI 成员代码修改了代码中的许多错误来确定它、现在它可以正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    那些寻求构建相同功能的人。 我已经修改了以下代码、通过重复轮询输入来测量离散输入的频率。 如上所述、TI 不支持与内核3.8和 PASM 相关的以下代码。 但是、如果您希望继续、请使用以下代码生成以下输出文件(二进制文件)、方法是加载 PRU 并加载程序(基本上将 PRU 汇编器生成的二进制文件推送到 PRU)。 代码如下所示:

    origin 0
    
    #define PRU0_ARM_INTERRUPT 19
    
    #define CONST_PRUCFG C4
    #define CONST_PRUSHAREDRAM C28
    
    #define PRU0_CTRL 0x22000
    #define PRU1_CTRL 0x24000
    
    #define CTPPR0 0x28
    
    #define ONE_RAM 0x000
    #define OTHER RAM_RAM 0x020
    #SHARED_RAM 0x100 #define 2
    
    个周期
    / define
    
    2个周期/ define 2个周期20个周期/ define 2个周期20个周期
    lbco r0、const_PRUCFG、4、4 //启用 OCP 主端口
    CLR r0、r0、4
    sbco r0、const_PRUCFG、4、 4
    
    mov r0、shared_RAM //将 C28设置为指向共享 RAM
    mov R1、PRU0_CTRL + CTPPR0
    sbbo r0、R1、0、4
    
    mov R2.W0、DELAY & 0xFFFF
    mov R2.w2、DELAY >> 16
    
    WAITLO:
    qbbc WAITLO、R31.T15
    
    忽略: //等待50个连续读数(1
    add r0、r0、2)//每个循环3个周期
    qbgt ignore, r0、R2
    
    WAIT1://在输入仍然为1
    时继续计数添加 r0、r0、2
    qbbs WAIT1、R31.T15
    
    WAIT2: //在输入为0时继续计数
    添加 r0、r0、2
    qbbc WAIT2、r31.t15 //输入变为1
    
    sbco r0时结束计数、const_PRUSHAREDRAM、0、4 //将计数写入 RAM
    MOV R31.b0、PRU0_ARM_INTERRUPT+16 //发送通知
    
    以忽略0主机 


    注意:以下代码仅在 P8_15设置为"pruin"时才起作用、此代码通过共享 RAM 共享数据、应由加载程序获取、以便在 ARM 端或操作系统端显示该数据 如果您中的任何人在完成加载程序文件时需要帮助、请继续此讨论。 和平