本文介绍在Ubuntu 16.04上基于通用MIPS toolchain完成远程运维设备端代码移植到MIPS 32上。

准备工作

下载Toolchain

a. 假设我们在Ubuntu的/tmp/目录下通过下面的命令下载toolchain:

  1. $wget https://codescape.mips.com/components/toolchain/2018.09-03/Codescape.GNU.Tools.Package.2018.09-03.for.MIPS.IMG.Linux.CentOS-6.x86_64.tar.gz

下载过程如下:

image.png

b. 将工具链解压到/tmp目录:

  1. $tar zxvf Codescape.GNU.Tools.Package.2018.09-03.for.MIPS.IMG.Linux.CentOS-6.x86_64.tar.gz

image.png

c. 测试gcc可用:

image.png

下载设备端代码

a. 假设我们在Ubuntu的/tmp/目录下通过下面的命令下载最新代码包:

  1. git clone https://github.com/alibaba/iot_remote_access.git

注意: 如果您的Ubuntu上并未安装git,请使用以下命令首先安装git: sudo apt-get install -y git

image.png

新增第三方库编译脚本

参考一键编译手册的流程,我们拷贝support_armv7.sh到script目录,重命名为support_mips32.sh .

  • 修改support_mips32.sh里的相关变量,依据规则如下:

    1. _ToolChainRootDirectory: 指的是ToolChain解压的根目录,一般情况下,ToolChain的根目录包含include/bin/lib等目录
    2. _CrossPrefix: 指的所采用的Gcc的前缀,一般在ToolChain的根目录bin下,有*-gcc,比如arm-linux-gnueabi-gcc等。
    3. _Host: 指的是交叉编译器所运行的OS信息,一般情况下,可以通过*-gcc -v获取其中的--host值。
    4. _Target: 指的是交叉编译器所运行的Target信息,一般情况下,可以通过*-gcc -v获取其中的--target值。
    5. _TargetBit: 值的是交叉编译的目标平台的bit数,一般为 32位。
    6. _NewBoardName: 新的平台的名称,最好跟脚本名称里包含的board名称一致,假如为myboard

_ToolChainRootDirectory: 在当前文档中,我们是/tmp/mips-img-linux-gnu/2018.09-03
_CrossPrefix: 当前toolchain,交叉编译的通用前缀是mips-img-linux-gnu- ,获取方法如下:

image.png

_Host: 当前toolchain,我们这个是 x86_64-pc-linux-gnu,获取方法如下:

image.png

_Target: 当前toolchain,我们这个是 mips-img-linux-gnu,获取方法如下:

image.png

_TargetBit: 就是设备是32bit的还是64bit的机器,当前文档我们使用的是MIPS32的cpu,所以是32bit的。

_NewBoardName: 假设我们重新命名为新设备为mips32,这样脚本运行后,我们会在board目录看到mips32的子目录。
至此,support_mips32.sh需要用户自行修改的内容如下:

image.png

执行第三方库编译脚本

我们在script目录下,直接运行刚才新建的脚本:

  1. /tmp/iot_remote_access/script$ ./support_mips32.sh

完整的编译日志可以到这里下载: compile_mips32.log.zip
编译完成后的输出如下:

image.png

上图中的错误,可以不必理会,那是编译nopoll的测试程序,我们实际并不需要。

此时,我们可以到board目录下,看到已经新增了一个目录mips32,并且mips32的目录内容如下:

image.png

编译可执行程序

我们在顶层目录下,执行下面的命令,完成编译:

  1. /tmp/iot_remote_access$ CC=/tmp/mips-img-linux-gnu/2018.09-03/bin/mips-img-linux-gnu-gcc make board=mips32

可以看到编译结果如下:

image.png

我们通过file命令,可以查看是否编译的产物符合预期:

image.png

如果我们需要让二进制flash占用更小些,可以strip一下:

image.png

编译生成物介绍

image.png

完整的编译框架使用指南请参考: https://www.yuque.com/yuehu/link_iot_edge_lite/xft9x9