让程序在Pluto SDR上脱机运行——基于Pluto SDR的交叉编译

本文内容直接参考这篇教程,不得不说,国内互联网对SDR的探讨太少了,希望咱们的软件无线电也可以发展起来。

目前网络上针对SDR——尤其是微型SDR,如HackRF One、Pluto SDR、LimeSDR等——的开发基本都是PC运行程序,向SDR发送数据或从SDR获取数据,在这个过程中,SDR仅仅是作为收发模块使用的,然而对于Pluto SDR,其搭载了一个单核A9,并且ADI官方还为其提供了一个基于Linux的专供固件,在这样的开发流程中,板载Linux并未发挥什么作用。

难道你就没有想过让SDR成为主机,而PC仅显示数据吗?难道你不觉得不利用起来ARM有些浪费吗?我来教你怎么通过交叉编译,让原先在PC运行的程序,运行在SDR之上。

前置条件

若你还没有配置好Pluto SDR的运行环境,请查看我的这一篇文章

最好有一台物理Linux机器,而非虚拟机,这样能最大程度发挥硬件性能,同时避免某些奇怪的问题出现。Windows和MacOS其实也可以继续本教程,不过需要些额外步骤,可以参见顶部链接文章。

你还需要确定好自己的Pluto SDR运行的固件版本,一般每次ssh会话开始时都会打印固件版本,本文以v0.38为例讲解,如果你的Pluto SDR固件是其他版本,只需将后文涉及到固件版本的数字改为自己使用的版本即可。

最后你需要Pluto SDR运行固件的系统根目录,因为你在PC上直接编译的程序是以本机环境为标准的,但Pluto SDR的板载系统可能不支持你使用的库或函数,所以编译时需要使用Pluto SDR的环境,而这个环境可以通过两种方式来获得:

本文采用第二种方法。

搭建环境

确保你的Linux主机安装有XilinxLinaro工具链,本文使用Linaro工具链,若要使用Xilinx,请参见顶部链接。
Linaro可以使用包管理器安装:

sudo apt install gcc-arm-linux-gnueabihf

也可以前往Linaro下载页面下载适合自己主机的文件,若不清楚自己的电脑平台就下载gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz,然后将其解压到/usr/local/bin/,再将可执行文件加入到环境变量:

wget https://releases.linaro.org/components/toolchain/binaries/7.3-2018.05/arm-linux-gnueabihf/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz
sudo cp gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/bin/
cd /usr/local/bin/
sudo tar -xf gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz
sudo vim ~/.bashrc
# 将这行添加到~/.bashrc文件末尾,然后ESC->:wq保存退出
export PATH=$PATH:/usr/local/bin/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin
source ~/.bashrc

上述两种方法任选其一即可,然后验证一下是否安装好了:

arm-linux-gnueabihf-gcc --version

若输出(源码安装):

arm-linux-gnueabihf-gcc (Linaro GCC 7.3-2018.05) 7.3.1 20180425 [linaro-7.3-2018.05 revision d29120a424ecfbc167ef90065c0eeb7f91977701]
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

或类似内容,则可以下一步。

本地部署板载系统根目录

对于v0.38固件,在官方Release页面下载sysroot-v0.38.tar.gz,然后解压到一个方便访问的目录,这里我解压到/home/,然后给文件夹重命名为staging或其他方便输入识别的名字。
也可以自己编译固件源码,也可以得到指定版本的sysroot,对于需要自己修改固件的情况来说最好是自己编译得到,编译教程请参考我的这篇文章
在这里插入图片描述

编写想要在SDR上运行的代码

这里使用官方提供的ad9361例程来演示:

mkdir /tmp/plutoapp
cd /tmp/plutoapp
wget https://raw.githubusercontent.com/analogdevicesinc/libiio/libiio-v0/examples/ad9361-iiostream.c

交叉编译

使用之前安装好的Linaro工具链来编译刚刚写好的代码:

arm-linux-gnueabihf-gcc -mfloat-abi=hard  --sysroot=$HOME/staging -std=gnu99 -g -o pluto_stream ad9361-iiostream.c -lpthread -liio -lm -Wall -Wextra -lrt

上述命令中的--sysroot更改为刚刚解压的系统根目录的路径,pluto_stream是编译后生成的可执行文件的文件名,其后是需要交叉编译的代码文件名。

执行后可以使用ls命令观察到当前目录多了一个pluto_stream文件,这就是马上要传输给Pluto SDR执行的文件。

$ ls
ad9361-iiostream.c  pluto_stream

文件上板并执行

通过scp命令将文件传输到Pluto SDR系统目录中:

scp pluto_stream root@192.168.2.1:/tmp/

然后ssh进入板载系统,跳转到刚刚传输的目的目录,执行文件,或键入:

ssh -t root@192.168.2.1 /tmp/pluto_stream

若输出:

root@192.168.2.1's password: analog
* Acquiring IIO context
* Acquiring AD9361 streaming devices
* Configuring AD9361 for streaming
* Acquiring AD9361 phy channel 0
* Acquiring AD9361 RX lo channel
* Acquiring AD9361 phy channel 0
* Acquiring AD9361 TX lo channel
* Initializing AD9361 IIO streaming channels
* Enabling IIO streaming channels
* Creating non-cyclic IIO buffers with 1 MiS
* Starting IO streaming (press CTRL+C to cancel)
	RX     1.05 MSmp, TX     1.05 MSmp
	RX     2.10 MSmp, TX     2.10 MSmp
	RX     3.15 MSmp, TX     3.15 MSmp
	RX     4.19 MSmp, TX     4.19 MSmp
	RX     5.24 MSmp, TX     5.24 MSmp
	RX     6.29 MSmp, TX     6.29 MSmp
	RX     7.34 MSmp, TX     7.34 MSmp
	RX     8.39 MSmp, TX     8.39 MSmp
	RX     9.44 MSmp, TX     9.44 MSmp

则交叉编译成功,你成功的将一个本在PC上运行的代码让Pluto SDR脱机运行了,这时PC仅仅是一个控制台监视器,查看Pluto SDR传回的数据。
但是Pluto SDR在重新上电后文件会丢失,如果想要交叉编译好的程序能够在设备上持久化存储,甚至做到上电就自动执行(开机自启),可以参考我的这篇文章

  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值