经过上一篇博客,已经安装好了am335x_pru_package,本文将用它来编写、编译一个最简单的PRU程序——闪烁BBB上的led灯。

大体来说每个PRU程序都包括两部分:

  1. 在ARM核的Linux系统中运行的C语言程序
  2. 在PRU中运行的汇编程序(编译成.bin文件)

其中c语言程序有两个作用:将汇编程序传到PRU中;与PRU程序互相传递数据和互动。

汇编程序源文件包括.p和.hp两种后缀的文件,最后编译成.bin文件被传到PRU执行。.hp文件类似于c语言的.h头文件,可以在.p文件中被include,它不是必须的,本例为了简单起见也不用.hp文件。

OK,我们开始做吧!

Step by step步骤

首先新建两个文件,内容分别如下:

//mytest.c
#include <stdio.h>
#include <prussdrv.h>
#include <pruss_intc_mapping.h>#define PRU_NUM 0int main (void)
{unsigned int ret;tpruss_intc_initdata pruss_intc_initdata = PRUSS_INTC_INITDATA;prussdrv_init ();//Initialize the PRUif (prussdrv_open(PRU_EVTOUT_0))//Open PRU Interrupt{printf("prussdrv_open open failed\n");return (-1);}prussdrv_pruintc_init(&pruss_intc_initdata);prussdrv_exec_program (PRU_NUM, "./prucode.bin");//Execute example on PRUprussdrv_pru_wait_event (PRU_EVTOUT_0);//Waiting for this instruction: MOV r31.b0, PRU0_ARM_INTERRUPT+16prussdrv_pru_clear_event (PRU_EVTOUT_0, PRU0_ARM_INTERRUPT);prussdrv_pru_disable (PRU_NUM);//Disable PRU and close memory mappingprussdrv_exit ();return(0);
}
//prucode.p
.origin 0
.entrypoint START//Refer to this mapping in the file - \prussdrv\include\pruss_intc_mapping.h
#define PRU0_ARM_INTERRUPT      19
#define CONST_PRUCFG            C4//Refer to AM335X Technical Reference Manual & BBB SRM
#define GPIO1 0x4804c000
#define GPIO_CLEARDATAOUT 0x190
#define GPIO_SETDATAOUT 0x194START:// Enable OCP master portLBCO      r0, CONST_PRUCFG, 4, 4CLR       r0, r0, 4         // Clear SYSCFG[STANDBY_INIT] to enable OCP master portSBCO      r0, CONST_PRUCFG, 4, 4MOV r1, 3 // loop 3 times
LOOP0:MOV r2, 1<<22MOV r3, GPIO1 | GPIO_SETDATAOUTSBBO r2, r3, 0, 4MOV r0, 100000000
DEL1:SUB r0, r0, 1QBNE DEL1, r0, 0MOV r2, 1<<22MOV r3, GPIO1 | GPIO_CLEARDATAOUTSBBO r2, r3, 0, 4MOV r0, 100000000
DEL2:SUB r0, r0, 1QBNE DEL2, r0, 0SUB r1, r1, 1QBNE LOOP0, r1, 0// Send notification to Host for program completionMOV       r31.b0, PRU0_ARM_INTERRUPT+16// Halt the processorHALT

然后编译它们。编译之前先从am335x_pru_package中复制一些必要文件到标准目录中,省得我们添加引用目录。

  1. 把 pru_sw/app_loader/lib目录中的 libprussdrv.a 拷贝到 /usr/lib 中;
  2. 把 pru_sw/app_loader/include 目录中的两个文件都拷贝到 /usr/include 中;
  3. 把 pru_sw/utils 目录中的 pasm 拷贝到 /usr/bin 中。

下面开始编译,执行下面两条命令。

gcc mytest.c -lpthread -lprussdrv -o mytest
pasm -b prucode.p 

(其中 -lpthread -lprussdrv 参数是指要使用 libpthread.so 和 libprussdrv.a这两个库文件。)

编译完以后就生成了要在linux中运行的mytest程序和要传到PRU中的prucode.bin文件。

注意,在运行程序前,还需要做一件事。用lsmod命令查看一下uio_pruss模块有没有加载。如果没有的话,手动加载一下。这个应该加载一次就可以了。

modprobe uio_pruss

一切就绪!下面输入 ./mytest 来执行一下程序吧!

顺利的话你会看到第二个led灯亮灭了三次,每次亮和灭的时间是1秒钟。

几点分析

在执行过程中,终端处于忙碌状态,如果在这期间你按下Crtl+C终止了程序,会发现led还在按照原来的规律继续闪烁,可见灯的亮灭,或者说PRU的程序运行并不受linux程序的影响。

PRU简介中提到AM33xx中PRUSSv2的主频是200MHz,每条汇编指令执行时间是一个时钟周期。通过这个程序也可以得到验证:

    MOV r0, 100000000
DEL1:SUB r0, r0, 1QBNE DEL1, r0, 0

在这个循环等待的部分,不断对寄存器r0执行自减1和判断是否为零这两条指令,执行了100M次,所以延时为1秒。

汇编程序START:紧接着的第一部分

    // Enable OCP master portLBCO      r0, CONST_PRUCFG, 4, 4CLR       r0, r0, 4         // Clear SYSCFG[STANDBY_INIT] to enable OCP master portSBCO      r0, CONST_PRUCFG, 4, 4

它把SYSCFG寄存器的STANDBY_INIT位置零,否则的话将无法访问任何外部memory,包括ARM的内存和IO口等。所以记得在每个程序一开始都加上这三条指令。

Second choices

最后,如果你不想用官方工具,这里有second choice:http://www.element14.com/community/community/knode/single-board_computers/next-gen_beaglebone/blog/2013/06/16/bbb--getting-ace-working

如果你想用java脚本与PRU里的程序互动,可以参考这里:https://npmjs.org/package/pru

上面这两个东西我都没仔细看过,仅列出来供参考。

本文大量参考了这篇文章 http://www.element14.com/community/community/knode/single-board_computers/next-gen_beaglebone/blog/2013/05/22/bbb--working-with-the-pru-icssprussv2。在此感谢原作者的劳动成果。

使用Beaglebone Black的PRU(二)——Hello World!相关推荐

  1. 使用Beaglebone Black的PRU(一)

    AM335x的PRUSSv2简介 PRUSSv2 = Programmable Real-time Unit Sub-System = PRU-ICSS= PRU Industrial Communi ...

  2. 聊聊Beaglebone Black的cape和device tree overlay和dtc命令【转】

    本文转载自:https://blog.csdn.net/wyt2013/article/details/16846171 本文是我早期写的,语言略混乱.请直接看我最新整理的,适用于初学者的文章< ...

  3. ApacheCN 安卓译文集 20211225 更新

    Kotlin 安卓开发 零.前言 一.开始你的 Kotlin 冒险 二.基础 三.玩转函数 四.类和对象 五.作为一等公民的函数 六.泛型是你的朋友 七.扩展函数和属性 八.委托 九.制作您的漫威画廊 ...

  4. BeagleBone 可编程实时单元(PRU)控制 GPIO 和 UART

    概述 BeagleBone(及其底层 TI Sitara SoC)最独特的功能是其 PRU,它们是与 ARM 内核完美集成的实时微控制器.您有两个选项可以对 PRU 进行编程: 基础用法 要将编译后的 ...

  5. AI 边缘计算平台 - BeagleBone AI 64 简介

    BeagleBone AI 64 简介 Beagleboard 组织 2022 年 6 月份发布了BeagleBone® AI-64平台的B1版本,由seeedstudio开发,是一款用于开发人工智能 ...

  6. BeagleBone Black使用(一):狗板简介

    前言 BeagleBone 与 Arduino 和 Raspberry Pi(树莓派)可以说是目前应用最广泛的三大嵌入式开源平台.而 BeagleBone 在一定程度上可视为融合了 Arduino 与 ...

  7. Beaglebone Back学习三(开发环境搭建)

    开发环境搭建 1 Ubuntu环境搭建 2 Window环境搭建 3 开发板环境搭建 1 Ubuntu环境搭建 (1)安装必要的网络工具 samba nfs tftp vmware-tools sam ...

  8. Android 驱动(10)----设备树(二)linux内核顶层am335x-evm.dts

    设备树(二)linux内核顶层am335x-evm.dts 摘自:http://blog.csdn.net/xiaojiezuo123/article/details/49890507 了解基本的dt ...

  9. BeagleBone Black 板第三课:Debian7.5系统安装和远程控制BBB板

    BBB板第三课:Debian7.5系统安装和远程控制BBB板 由于BBB板系统是Debian 7.4.据说使用Debian系统能够实现非常多BBB板的无缝连接.能够更好的学习和控制BBB板,所以就决定 ...

最新文章

  1. Web Service 安全性解决方案(SOAP篇)
  2. 通过学习生物范式,寻找解决AI识别噪音的新方法
  3. Science | 谷岩/王朗团队揭示大脑中的免疫细胞竟是记忆遗忘的“主谋”
  4. IP地址,子网掩码、默认网关,DNS理论解释
  5. CodeSmith实用技巧(十四):使用Progress对象
  6. RedHat 6配置DNS服务实现主从同步与正反向解析
  7. rabbitmq一:基本概念
  8. 套接字没有连接并且没有提供地址_网络是怎样连接的 -- web服务器接到请求后将会做什么...
  9. C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板
  10. Hadoop Mapreduce分区、分组、二次排序过程详解
  11. [记录] --- safari浏览器对于yyyy-MM的坑
  12. C语言图书管理系统(链表、文件功能齐全)
  13. 基于灰度世界、完美反射、动态阈值等图像自动白平衡算法的原理
  14. 分布式电商项目十七:商品服务-三级分类和查询
  15. 「秘」那些管UI小姐姐要来的网站
  16. 机器人心灵感应:允许人类远程操作和训练机器人手
  17. 华为储存空间管理器可以删除吗_Cx File Explorer 免费清爽无广告的安卓手机文件管理器 (支持局域网共享/FTP/WebDAV)...
  18. NIKE ZOOM ASTORIA SKY HI ACG (MUSTARD/TAN)
  19. 微信小程序之 获取input框输入值
  20. Python图像识别-Opencv02 二值图像、灰度图像以及彩色图像

热门文章

  1. Flash进度条ProgressBar
  2. 【编译原理核心知识点总结】第三章、正则文法、NFA、DFA
  3. 升级电子狗显示无法连接到服务器,什么是云电子狗?电子狗云升级是什么
  4. 无法检测到信息服务器v6,仅 IPv6 不可用,请检查。 IPv6 状态(如何开启)Fail (尝试修复)...
  5. 14、TheFatRat木马生成工具-创建后门或payload
  6. idea实现svn拉分支和合并分支的教程
  7. 工作中收集的一些捷径网站
  8. maven 开发 ejb ear
  9. SQL server 2000服务MSSQLSERVER无法启动解决办法
  10. 桂电 数电实验 期末考试 试卷+解析(74LS192 + 74LS153 + 74LS139 + 74LS00 / 74LS20)