找回密码
 注册
关于网站域名变更的通知
查看: 276|回复: 0
打印 上一主题 下一主题

瑞芯微RK3568开发板源码编译与交叉编译环境搭建

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-2-27 08:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

本篇,将进行OK3568-C开发板Linux系统开发需要用的软件交叉编译环境的配置。下面就介绍两种交叉编译环境的配置方法。

6 K+ I9 m' J, A+ ]/ l

01C/C++交叉编译环境编译

如果只是使用C/C++代码,则在自己的Ubuntu虚拟机中添加RK3568对应的交叉编译器(gcc/g++)即可。进行代码的交叉编译时可用使用如下方法,该配置方式简单便捷。

2 H* T: W5 f  k: H5 i* h0 n

1. 下载aarch64类型的gcc

在Linaro官网中下载GCC交叉编译工具链,飞凌嵌入式OK3568-C开发板采用的是64位的Cortex-A55内核,需要使用aarch64-linux-gnu。

地址:>>https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/

8 W) S1 D& p  ~7 i, Y

& \* d0 x; d: Z- v/ Q1 \' [+ L. R

; c; `* m/ l) W4 H; h+ _

我下载的是这个:gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz。

) X, k0 d: p9 k" J$ T( B6 n) B

然后解压:

" r9 y4 {- I7 r+ I1 Q; j" C
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar

解压结果如下:


6 b; K# h3 I5 ?6 m$ s9 u5 ~2 F$ v: A, J9 ^
+ j, E* \9 j/ G6 c( k
/ A+ U4 H) j" z, y

- q; o8 O$ x- k$ O! ?. Y

解压完成之后,可以在其下的bin目录中看到aarch64编译器:


4 B1 p, ?& d8 I5 m/ l) V# g- u* r
- C' i3 b7 R, ^. i
! S  |- e* k% \: v0 t8 E& q
1 g0 x) U  L4 a

使用这里的gcc或g++,就能交叉编译C或C++程序了。

" q8 G) [2 @9 M

2. 交叉编译C/C++程序测试

写一个简易的hello word的C++测试程序main.cpp:

' j2 j' D( c  K) h
+ W- w& A! U9 P8 O9 c2 ~2 P( v/ _

; i, A, ^. U* `$ q4 U* w1 L6 d  `, e$ H; c* L

/ D8 O+ o1 q! {
9 N. D1 i# z" c; F+ m) h3 ?! h5 m0 I3 J: N5 {
#include <stdio.h>

然后使用如下指令进行编译:


5 P0 [4 n; y8 j( y; a
* R5 t5 u' w  @: n* J1 S5 f1 texport PATH=/home/xxpcb/myTest/OK3568/gcc_aarch64/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/binPATH  ]) u4 T: w7 m- b$ @8 v

第一句是临时添加环境变量,当然也可以添加到.bashrc中实现永久添加,由于每种开发板用到的编译工具链不太一样,我一般都使用这种临时添加的方式。

( Q' t; E& m( w' Q/ H3 Y

第二句是使用aarch64-linux-gnu-g++来编译C++程序,编译结果如下,可用使用file指令查看编译出的程序的文件类型:


  D) ^- b* E" u( j
  o+ F/ w3 ^1 t
+ {0 Q! k3 u  t( d0 B9 T

# E3 E9 L, D! l, @
$ J% l1 d  x3 j. a) j5 N! k9 p

可以看到,编译出的文件是ELF 64-bit LSB的可执行文件,ARM aarch64架构的。

! i' [- y# _5 |$ g  ?: Z

然后将程序放到飞凌嵌入式OK3568-C开发板中运行,这里使用ADB拷贝程序。可以看到在下图右侧窗口中看到,在OK3568-C开发板中已成功运行hello word程序。

  v  |; N! q8 V
( B: _! {# I  D, l+ G- s4 |

$ `2 |: \% t- r: D: Y9 |( h
- k* n7 D) U  d; n) A9 f2 ?

3. 关于开发板的WiFi自动联网

想要给开发板传输文件,就需要先连上网络。在上篇《发烧友实测 | OK3568-C开发板初体验》中介绍过,OK3568-C开发板使用一个脚本来进行WiFi配网,但每次开机后都需要再配置。可以写个脚本加入到开机自启动程序中。


9 x' x: \7 F9 z$ D. z

例如,在/etc/init.d目录下,添加一个S99myinit文件,写入如下内容即可实现开机自动连网:

' h) K. U; z1 v
% ]) k8 }& K7 H' E
#!/bin/sh9 Q5 W% x: b8 ]

这里注意要替换为自己的WiFi名和密码,并且要给这个文件可执行权限。


( e. W0 m1 _: X0 g8 [1 P

02RK3568 Linux源码编译

刚才介绍了只进行C/C++程序开发时进行交叉编译环境配置的方法。

* W  M0 W" Q9 O. ^  L$ s

如果还要进行Qt开发,可以通过编译RK3568 Linux源码的方式,得到Qt的交叉编译工具链。由于我这里已经安装过了VirtualBox虚拟机和Ubuntu18系统,那就在自己的开发环境中进行RK3568的开发吧。

+ A$ z2 \$ S# Q  Q) e/ @* Q

1. 基础环境配置

在进行RK3568的源码编译之前,需要先进行对自己的虚拟机进行一些依赖包的安装,如下。首先是安装一些必要的库:


* `2 t% D: ?0 X. g( s; c& B4 C5 u  k
* i7 p- E' g+ C; C- a; E* d2 U) n& P$ x5 S: _4 Q6 g. R

! q+ [/ t' s$ H( \$ k' Psudo apt-get update sudo apt-get install build-essential ( a5 q0 W+ v0 i* P, U* P  i) F: c9 Q6 n

然后还有安装一些编译OK3568 Linux源码所需的库:


* t6 e+ X6 x8 K+ t. {
$ ?) K; L4 o" D+ [3 E0 p: y# t8 v$ ]5 L
sudo apt-get update( ?' A% ^* _# P/ b

此外,为了便于Qt开发,可选择安装Linux版的Qt Creator到自己的虚拟机中,安装过程也比较简单,并且我之前已经安装过了,这里就不过多介绍了。当然,不安装Qt Creator也是可以进行Qt程序的编译的,只要有Qt交叉编译环境即可。


* ~0 n& Z1 s# B

2. 准备RK3568源码

复制RK3568源码到Ubuntu虚拟机中,准备编译:

" c: k2 E4 t' [0 j9 p8 R  [# F

4 ?& ^& r; `7 U6 {# q) a/ ~cat OK3568-linux-source.tar.bz2.a* > OK3568-linux-source.tar.bz2

第一句是把.aa和.ab两个压缩包合并为一个压缩包,有个两个文件都差不多4G大小,这个合并的过程需要一点时间(大概2、3分钟左右),并且合并过程没有信息打印,命令行为不可输入状态,等变为可输入状态,即合并完成,并且在虚拟机上可看到合并后的压缩包。

* {& n" I! p8 u; U8 k8 ?; ^

第二句是把合并后的压缩包进行解压,这个解压过程也要一点时间(大概20分钟左右),解压过程会有信息打印。


( ]0 N% T5 m! R" U. V; h( n' _
( z( L) a9 y1 _  m
) R( N2 A+ N* k; G5 V

1 [) C0 A' `: H0 u
4 b& U9 @$ |+ r. o& [/ i" I8 p

解压完成后,可以看到OK3568-Linux的源码文件夹:


* W+ q; W$ ?* X) }2 v3 u6 P/ O7 \. o4 M, ?( r% n2 m
. {; I1 `1 b6 s1 p

' i0 K, S8 Z5 l! z+ y- |/ h' ^- p5 A$ c/ {

3. 编译RK3568源码

在编译之前,需要确保自己的虚拟机有足够的磁盘空间和内存空间,我的虚拟机配置如下,我的笔记本一共12G内存,我给了虚拟机10G。


1 ]8 w. N3 l0 I7 `5 u+ f0 }; B7 J3 a+ e4 v
5 o' _7 o! R7 c- o9 l7 {1 \4 I
6 q2 T6 S0 `, L% y( s8 O

注意上图中的硬盘空间,只是这个虚拟机的最大空间,需要在ubuntu中使用df指令确认下实际的大小,如果不够大,可以使用GParted等软件调整自己的虚拟机硬盘空间。

% ?' z1 J. X# ]2 V

如下图所示,我的ubuntu的硬盘现在总共是276G,这个截图是我编译完源码后截的图,感觉整个编译源码操作,耗费了有几十个G的空间,现在还剩余80G的空间可用。

( ]/ E% T( z* u
* r2 W1 {* n& ~0 h1 d( v/ {

6 i: ~! Y9 G2 t  p7 f
& [, |% K! B9 ^  T" L. |

3.1 全编译测试

进入到刚才解压后的RK3568源码目录,通过运行.build.sh脚本即可编译,在编译之前,可以先来看下脚本中的内容:


8 D4 C3 S: X: R

这里编译脚本比较长,截取部分图如下:

: f4 q2 e% H/ i) G& T3 s( K

  L0 s% |) p0 e; b' I/ I% o8 D# m3 C) U: ?: t' o2 E5 U. d

$ W% q: N  s% G

执行脚本后会先出现一个选项需要选择,选择1,即使用OK3568的配置。


6 K  u- f+ o" ~4 G, p
, [3 a* m; Q) U2 l+ m3 ?# q, g/ G" A  k- F' M& |  g
, ^% R- H3 O: ?) `! e9 X/ @

编译一段时间后(大概10分钟)会弹出下图界面,需要选择,提取图中信息:

VCCIO4 和 VCCIO6 选择 1800000其余的选择 3300000

9 a% h- ?+ Y/ Z* W
2 N, t8 [# S+ N$ a, }

使用上下方向按键选择选项,按回车确认选择即可。

" @: j, C: ?: s  E* p# \2 h

' O6 V/ m. w* t, Q4 o! g6 k  d, y" R$ k

6 T/ M- h/ H' s

编译的过程中,会十分耗费内存资源,我的电脑显示在编译过程中,内存基本占满了,再使用其它软件都会特别的卡,所以在编译的时候,就不用进行其它操作了,让它独自编译好了。

) [* t, l$ @1 o% p% q# E8 s
8 M* E) a+ z6 d- M% J
# l4 ]3 K1 K/ E3 U
8 ^! ^+ T: n5 o4 H; c' ]5 |  L9 Y

整个编译时间较长,我的电脑用了7、8个小时才编译完,从凌晨编译到天亮,还好没报错。编译成功后的截图如下,注意大片的红色部分不是错误信息,只是在提醒电源域的配置是否正确。

6 ], u  X  }! n7 W6 Z% c8 W
5 B6 r; }) C6 ]% A" v# c$ \
0 s8 P2 C4 n% H; m

2 R, L3 J5 h# [: ?7 z0 @

编译成功后,会在IMAGE文件夹下生成对应编译工程结果文件,这些文件中,update.img为打包好用于OTG或TF卡全烧写使用,其它的编译文件用于分步烧写时使用。


9 [/ n, ?6 M! x! A7 q$ V& N: [& V5 [3 R$ O7 U& l: H# w- R

) x0 I) K% [" b; c% y% K9 ~: p
# }5 e/ ]* }( u4 p3 m

3.2 内核单独编译测试

整个编译程序,十分的耗时,有时如果只是修改了内核代码,可以单独编译内核,编译方法是,在执行脚本时,指定一个kernel参数即可:

& k  j  {! u& k4 {
./build.sh kernel
% e  s* Q0 d9 _1 n3 i) N" o; e

03Qt程序交叉编译测试

1. Qt程序交叉编译

RK3568 Linux源码编译完成后,可以到output目录下的bin目录中查看编译出的交叉编译工具,对应Qt开发,需要注意是qmake这个工具,bin目录中的所有编译工具如下:


4 `; \9 m: ^6 d0 ~2 T: J3 i7 D* O4 k4 V, ^
" `& g% R/ k0 M) \  P
/ b3 P* R1 h8 N4 c- ]

使用资料中的Qt程序进行交叉编译测试,我使用的是qcamera这里例程,将程序源码复制到Ubuntu中,然后使用如下指令进行Qt程序的交叉编译:

6 L& q6 s; t3 @

) {1 ?) G+ k# v4 e& j- A$ Q! j3 ^# Y) O5 }' z
export PATH=/home/xxpcb/myTest/OK3568/sourcecode/OK3568-linux-source/buildroot/output/OK3568/host/binPATH

第一句是临时添加环境变量;

第二句是使用RK3568源码编译结果中的qmak来生成Makefile;

第三句是使用make来编译;

编译结果如下,同样可以使用fie指令来确认编译出的可执行文件的文件类型。


' W+ d, @1 p. k1 E1 }
$ _$ H3 R2 D) m  [& F
" q0 K0 Q  G  p* @3 v% P1 n

* F3 d% h% P) h) L8 E

可以看到,编译出的fltest_qt_qcamera文件也是ELF 64-bit LSB的可执行文件,ARM aarch64架构的。

% |, h6 d6 Y( C" ]: i5 _) F

2. Qt程序运行测试

同样使用ADB的方式,将可执行程序拷贝到板子中,然后运行,运行结果如下,注意我在qt程序中稍微修改了一下,给Exit字符串加了一个中括号,以确认板子中运行的就是我自己编译出的Qt程序。


. C4 n: a  `3 T" x
1 v; q3 ]7 S8 E
7 ~1 @0 W4 L3 O2 ]. l! H; {$ A

$ u" z- k5 ]- F; }. P% p

至此,Qt的交叉编译环境已验证可正常使用。

: i4 `& @' s" v# W& b
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-1 03:14 , Processed in 0.125000 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表