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.

[参考译文] 编译器/BEAGLEBK:PRU 培训 Lab2问题

Guru**** 2595805 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/639996/compiler-beaglebk-pru-training-lab2-problem

器件型号:BEAGLEBK

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

大家好、我正在尝试使用 PRU 实验室了解 PRU。 我能够让第一个实验轻松工作、但对于第二个实验、中断似乎不工作。 我已经测试了连接到 PRU1的 LED 和独立连接到 PRU0的开关、它们工作正常。 只是中断部分不起作用。

以下是我的代码:

// button_pru0.c 
/* 开关连接到高电平有效的 P9.27 (pru0_R31_5) *使用事件16发送中断到 PRU1 */ #include #include #include #include "resource_table_empty.h" #define PRU0 易失性寄存器 uint32_t __R30; 易失性寄存器 uint32_t __R31; // * PRU0至 PRU1中断 * PRU 内核可以使用事件16-31手动生成中断 *但是这些中断映射到 R31寄存器中的位[3:0] *此外, 我们必须触发位5以选通中断 */ #define PRU0_PRU1_EVT (16) #define PRU0_PRU1_TRIGGER (__R31 =(PRU0_PRU1_EVT - 16)|(1 <<5)// 开关掩码 #define SW1 (1<5) // *配置 =(void 0x0000c =任何待处理事件/清除) //将事件16映射到通道1 //通道映射寄存器(CMRm)为每个系统事件定义通道 //每个事件有一个寄存器,因此64个事件有16 CMR //对于事件16,我们将使用 CMR4 CT_INTC.CMR4_bit.CH_MAP_16=1; //将通道1映射到主机1 //主机映射寄存器(HMRm)为每个主机事件定义通道 //每个4个通道一个寄存器,因此10个通道的3个 HMR //主机1连接到 R31位31 (对于 PRU0和 PRU1 CT_INTC.HMR0_bit.HINT_MAP_1 = 1); // 4.4.2.3.2 TRM 中的中断启用 //确保事件16被清除 //服务事件后,必须清除事件状态 //通过将 N 写入系统事件状态索引清除寄存器(SICR) CT_INTC.SICR = 16可以清除事件 N; //启用事件16 //必须启用需要传播到主机的系统事件 //可以通过在系统事件启用索引集寄存器(EISR) CT_INTC.EISR = 16中写入 N 来启用事件 N; //启用主机中断1 //通过向 HIISR 寄存器 CT_INTC.HIISR |=(1 << 0)写入 N 来完成; //全局启用主机中断 //将全局启用寄存器(GER)中的 EN 位(位0)设置为1 CT_INTC.GER = 1; } void main (void) { //将 GPI/O 配置为模式0 (直接输入) //位1-0 // 00 -直接输入模式 // 01 - 16位并行捕捉模式 // 10 - 28位移位模式 // 11 - MI_RT 模式 CT_CFG.G0 = 0x0000; //清除所有16个输出引脚 __R30和= 0xFFFFFF0000; //配置中断 configIntc(); while (1) { //等待 SW1被按下(高电平有效) if ((_R31和 SW1)=SW1) { //等待500ms 以进行去抖 __DELAY_CYLES (100000000); //中断 PRU1_PRU1_TRIGGER ; } }}

// led_pru1.c

//
* led 连接到 P8.44 (pru1_r30_3)
*/

#include 
#include 
#include 
#include "resource_table_empty.h"

易失性寄存器 uint32_t __R30;
易失性寄存器 uint32_t __R31;

#define PRU1
//主机1映射到 R31的位31
#define host1_mask(1<<31)
#define PRU0_PRU1_EVT(16)
#define PRU1_LED(toggle_LED)= 0x30_gpio_mask ^(<gpio_3_)= 0x30)<gpio_gpio_gp1



(= 0xgpio_gp1)<gpio_gp1 (=


//清除所有输出引脚
__R30 && 0xFFFFFF0000;

while (1)
{
//等待主机1被检测
到(__R31 & host1_mask)
{
toggle_LED;
//清除中断事件
CT_INTC.SICR = 16;

//延迟以确保事件在 INTC
__DELAY_CYCLES (5)中清除;}超周期数}



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

-CR/*使用 C 约定的链接*/

/*指定系统内存映射*/
内存
{
页0:
PRU_IMEM:org = 0x00000000 len = 0x00002000 // 8kB PRU0指令 RAM *

第1页:

/* RAM */

PRU_DMEM_0_1:org = 0x00000000 len = 0x00002000 CREGISTER=24 /* 8KB PRU 数据 RAM 0_1 */
PRU_DMEM_1_0:org = 0x00002000 len = 0x00002000CREGISTER=25 /* 8KB PRU 数据 RAM 0_0

:org = 0x00002000 len = 0x00002000 CREGISTER=25 /*
PRU RAM_0:1:* PRU RAM_EAREM_0:1:* PREM_REM_0org = 0x00010000 len = 0x00003000 CREGISTER=28 // 12KB 共享 RAM */

DDR:org = 0x80000000 len = 0x00000100CREGISTER=31
L3OCMC:org = 0x40000000 len = 0x00010000CREGISTER=30


//外围设备*/

PRU_CFG:org = 0x00026000 CREGISTER=0x44CREGISTER=4
PRU_ECAP:org = 0x000300ETER=0x000ECCEP=0x000EEGISE=0x000CL000

ORG = 0x00020000 len = 0x00001504CREGISTER=0
PRU_UART:ORG = 0x00028000 len = 0x00000038CREGISTER=7

DCAN0:ORG = 0x481CC000 len = 0x000001E8CREGISTER=14
DCAN1:ORG = 0x481D0000 len = 0x000001E8 DMTR=0x400CREGISTER
= 0x40015
:CREGCREMP=14 DCAN1 = 0x4000 DMTRENO org = 0x48300000 len = 0x000002C4CREGISTER=18
PWMSS1:org = 0x48302000 len = 0x000002C4CREGISTER=19
PWMSS2:org = 0x48304000 len = 0x000002C4CREGISD8=20
GEMAC:org = 0x4A100000 len = 0x128C CREGISTER=0x00002C=0x00002

:ORG CREGISC=0x00002 org = 0x4819C000 len = 0x000000D8CREGISTER=17
MBX0:org = 0x480C8000 len = 0x00000140CREGISTER=22
McASP0_DMA:org = 0x46000000 len = 0x00000100CREGISORG=8
MCSPI0:org = 0x48030000 len = 0x000001CRETER=0x48000001 CREMCISPI0

:0:org=0x480ECC0001A4 = 0x000001 CREMC0001 = 0x00001 org = 0x48060000 len = 0x00000300CREGISTER=5
SPINLOCK:org = 0x480CA000 len = 0x00000880CREGISTER=23
TPCC:org = 0x49000000 len = 0x00001098CREGISORG=29
UART1:org = 0x48022000 len = 0x000088CREGISTER=11
UART12:0x488 CREGISTER=12:ORGISTER=0x488

org = 0x48318000 len = 0x00000100CREGISTER=10
RSVD13:org = 0x48310000 len = 0x00000100CREGISTER=13
RSVD21:org = 0x00032400 len = 0x00000100CREGISTER=21
RSVD27: org = 0x00032000 len = 0x00000100CREGISTER=27

}

//指定段分配到内存中*/
段{
//强制_c_int00到 PRU IRAM 的开头。 在加载
ELF 文件时不需要、但在加载二进制文件时很有用*。
text:_c_int00*> 0x0、page 0

.text> PRU_IMEM、page 0
.stack> PRU_DMEM_0_1、page 1
.bss> PRU_DMEM_0_1、page 1
.CIO> PRU_DMEM_1、page

1 .1_1、PRU_1数据交换> PRU_1、.CIO 1 第1页
.sysmem> PRU_DMEM_0_1、第1页
.cinit> PRU_DMEM_0_1、第1页
.rodata> PRU_DMEM_0_1、第1页
.rofardata> PRU_DMEM_0_1、第1页
.farbss> PRU_DMEM_0_1、



第1页 DMU_1页.fardata > PRU_1页、PRU_DMEM_1页.fardata 1页> PRU_1页.farem_1页、PRU_1页.farem_1页、PRU_DMEM_1页、PRU_DMEM_1页.
/*
版权所有(C) 2015德州仪器(TI)公司- http://www.ti.com/
*

*
*只要
满足以下条件*、就允许以源代码和二进制形式重新分发和使用*进行修改或不进行修改:
*
***源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*
发行版随附的*文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者
*按原样"提供、

且不承认任何明示或暗示的保证、包括但不限于*特定用途*的适销性和适用性的暗示保证。 在任何情况下、版权
*所有者或贡献者都不对任何直接、间接、偶然、
*特殊、模范、 或相应的损害(包括但不
限于*采购替代产品或服务;丧失使用、
*数据或利润; 或业务中断)、但出于
任何*责任理论、无论是合同、严格责任还是侵权
行为*(包括疏忽或其他原因)、即使
被告知可能会造成此类损坏、也是出于此类责任理论。
//

/*
=== resource_table_empty.h ===========
*
*定义所有 PRU 内核的资源表条目。 这
将*整合到相应的基本映像中、
并由主机端的 remoteproc *用于分配/保留资源。 注意 Remoteproc
*驱动程序要求使用资源表构建所有 PRU 固件。
*
*此文件包含空的资源表。 它可以用作
:*
* 1) 1)模板、或
* 2) 2)按原样、如果 PRU 应用程序不需要配置 PRU_INTC
* 或与 rpmsg 驱动程序交互
*
/

#ifndef _RSC_Table_PRU_H_
#define _RSC_Table_PRU_H_

#include 
#include 

struct my_resource_table{
struct resource_table base;

uint32_t offset[1];//实际定义中应匹配'num'*
};

#pragma DATA_SECTION (PRU_remoteproc_ResourceTable、".resource_table")
#pragma retain (PRU_remoteproc_ResourceTable)
struct my_resource_table PRU_remoteproc_ResourceTable ={
1、//我们是实现此*/
0的第一个版本,*必须
保留表中的条目数*、



* 0、* 0、** 0、**** 0、*** 0、*** 0、****/**** 0、* 0 ****

所有内容均已正确编译。 我还注意到、如果我不包括资源表、因为在实验中、PRU 单元不会重新启动。  

如果您发现问题、请告诉我

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    软件团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    鲁曼、

    很抱歉耽误你的时间、过去两周我都离开了办公桌。

    我当前的做法是、您的器件上的引脚复用可能未按照实验4中的说明进行正确配置、网址 为:processors.wiki.ti.com/.../PRU_Training:_Hands-on_Labs

    我能够使用~/pru-software-support-package/labs/lab_2/solution 文件夹中的实验练习2解决方案、并确认演示在我桌面上的设置工作正常。 除了器件树修改之外、我唯一要做的更改是将"resource_table_empty.h"文件复制到两个解决方案目录(button_led_0和 button_led_1)中的每个目录、然后将 include 行添加到每个.c 文件的顶部(#include "resource_table_empty.h")

    请告诉我、在您的情况下修改器件树是否有用、或者上述任何一项没有意义。

    Jason Reeder

    电源 在编写实验1至3时、假设用户将使用 JTAG 和 Code Composer Studio 加载 PRU。 在这种情况下、引脚多路复用将由 CCS GEL 脚本配置。 由于 Linux 驱动程序不负责加载固件、这也解释了为什么在实验4之前不会出现资源表头文件。

    如果您想使用 Linux 运行前三个实验中的任何一个、则需要按照以下步骤更新器件树文件以更新 PRU Cape 引脚复用、并向示例添加资源表。