am335x pru

Beaglebone Black的PRU 问题总结

板卡固件版本
http://www.waveshare.net/wiki/MarsBoard_AM335X
MarsBoard-AM335X-eMMC-2GB-Debian-7.5-HDMI-2015.06.20-v1.1.img.7z
电脑端 Linux 3.2.0-29-generic

1.BB-Black之PRU-ICSS简析
http://www.elecfans.com/emb/358284.html

示例链接:
https://blog.csdn.net/wyt2013/article/details/17396555
https://blog.csdn.net/wyt2013/article/details/17429399/
https://blog.csdn.net/wyt2013/article/details/21028249

2.编译am335x_pru_package
root@beaglebone:~/tmp/am335x_pru_package/pru_sw/app_loader/interface#make CROSS_COMPILE="" #无需交叉编译
将/am335x_pru_package/pru_sw/app_loader/interface下Makefile文件的
CROSS_COMPILE?=arm-linux-gnueabi- 改成自己安装的gcc版本
编译example_apps目录中的示例时Makefile也要改成自己安装的gcc版本
然后直接make;
加载的am335x_pru_package中两个pdf有相关介绍

3.使用Beaglebone Black的PRU(二)中
按照链接gcc mytest.c -lpthread -lprussdrv -o mytest 进行编译,会提示没有-lprussdrv库文件,其实是存在的,后换成-lprussdrd库文件可以编译生成mytest,但程序运行会报错,无法打开的二进制文件,原因是此处gcc编译跳到默认的路径选择的是x86-64架构的gcc,而我们运行在板卡上用的arm架构,需要指定gcc路径交叉编译,选择自己安装的
arm-linux-gnueabi- gcc路径/usr/bin/arm-linux-gnueabi-,此时再编译-lprussdrv库文件也不会提示没有了,

正确编译
/usr/bin/arm-linux-gnueabi-gcc mytest.c -lpthread -lprussdrv -o mytest
编译完用指令 file mytest查看可看出信息是32位

运行mytest程序时, libpthread.so要拷贝到板卡usr/lib中;

4.使用Beaglebone Black的PRU(三)中
dtc -@ -O dtb -o BB-BONE-PRU-00A0.dtbo BB-BONE-PRU-00A0.dts
命令中@会提示invalid option无效的参数,将@符号去掉即可生成dtbo文件;
dtc使用参考链接
http://blog.chinaaet.com/cuter521/p/5100050348

  1. 加载uio_pruss
    板卡上/lib/modules/3.8.13/kernel/drivers/uio已有一个uio_pruss.ko文件,直接复制命令操作报错,在内核中找到uio文件夹,并编译生成了uio_pruss.ko文件,insmod到板卡成功;
    但示例中用到的是另一种加载方式modprob uio_pruss;区别是modprob是一次讲所有依赖关系的驱动全部加载到内核,此处直接加载失败,insmod成功后没有对此进行验证。

6.解决/libc.so.6: version `GLIBC_2.15’ not found问题
https://blog.csdn.net/buynow123/article/details/47421635
https://blog.csdn.net/miaodichiyou/article/details/78716384
这是在运行时报错,后查找板卡上只有2.14之前的版本,按照链接所给方式,并没有成功在板卡上安装,如链接中给出的一个参数 “configure参数非常重要”报错;
按照链接搜索的方式并没有成功对板卡上版本进行更新,
个人解决方式:在自己虚拟机环境中查找libc.so.6位置,所需要的文件就在安装的
arm-linux-gnueabi文件夹lib下,将lib压缩打包,拷贝至板卡,解压后lib文件夹里文件全部拷贝到/lib/arm-linux-gnueabi中,用指令查看版本,更新成功。

至此,运行编译好的的mytest程序或是am335x_pru_package里自带的程序都会提示
prussdrv_open open failed,原因是还要对PRU初始化;

https://e2echina.ti.com/question_answer/dsp_arm/sitara_arm/f/25/p/144944/409278
https://github.com/beagleboard/am335x_pru_package/issues/16

7.加载dtbo文件
BBB默认没有使能pruss的,所以还需要修改一下系统dtb文件,
板卡上并没找到这个文件,虚拟机中编译的335x内核中可以找dts文件夹,
am335x-boneblack.dtb拷贝到板卡,进行修改,或者直接在虚拟机中修改,之后拷贝到板卡,最终运行程序还是打印prussdrv_open open failed。
之后发现不需要做这一步,按说明生成dtbo文件拷贝至/lib/firmware 目录下;
板卡自身/lib/firmware 目录下已有BB-BONE-PRU-01-00A0.dtbo,BB-BONE-PRU-02-00A0.dtbo,BB-BONE-PRU-03-00A0.dtbo,BB-BONE-PRU-04-00A0.dtbo

echo BB-BONE-PRU-01> /sys/devices/bone_capemgr.9/slots

不再提示prussdrv_open open failed, PRU初始化完成;
运行程序提示Segmentation fault
https://blog.csdn.net/u010150046/article/details/77775114

8.用gdb调试查错误位置
http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html
参考文档:嵌入式Linux应用程序开发详解-第3 章 Linux 下的C 编程基础中gdb调试

重新编译mytes程序 gcc后面加-g参数
/usr/bin/arm-linux-gnueabi-gcc –g mytest.c -lpthread -lprussdrv -o mytest
gdb ./mytest
 l:(list)显示我们的源代码
  b 行号:在相应的行上设置断点,我在第六行设置
  r : run 运行程序至断点
  p:p(print)打印变量的值
  n:n(next)执行下一步 出现错误信息了
  c : continue 继续执行
quit : 退出gdb

设置断点,运行到第20行之后,报错:Program received signal SIGSEGV, Segmentation fault.
0x00000004 in ?? ()

此处提示的是一个触发段错误,并提示地址0x00000004,应该是在这个地址位置调用了个什么?然后是问号就没看懂什么意思了;

mytest.c程序第21行
….
20 prussdrv_exec_program (PRU_NUM, “./prucode.bin”);//Execute example o
n PRU
21 prussdrv_pru_wait_event (PRU_EVTOUT_0);//Waiting for this instructio
n: MOV r31.b0, PRU0_ARM_INTERRUPT+16
22 prussdrv_pru_clear_event (PRU_EVTOUT_0, PRU0_ARM_INTERRUPT);
….

此处有搜到部分程序不一样的示例,都是细微参数的差别,应该不是造成错误的原因,在此处,程序是将prucode.bin的汇编程序传到pru中去运行,个人猜测导致错误原因传入地址是不是不对或者是还需要调用个什么东西,问题没有解决。
http://bbs.eeworld.com.cn/thread-430663-1-1.html
http://bbs.eeworld.com.cn/thread-439747-1-1.html

其他有关PRU例子:
http://processors.wiki.ti.com/index.php/PRU_Projects?tdsourcetag=s_pcqq_aiomsg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值