|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Heaven_1 于 2022-10-9 16:14 编辑 9 w) Q6 H0 F9 P- x [
7 P7 W3 l! |7 U
在工业4.0时代,人工智能和工业物联网的发展走上了快车道,越来越多的行业对实时操作系统有了更加迫切的需求。基于此,飞凌嵌入式推出了在OK3568-C开发板 飞凌嵌入式官网-ARM嵌入式核心板、开发板、工控机、单片机解决方案-专注智能设备核心平台研发与制造 - 保定飞凌嵌入式技术有限公司 上运行的实时操作系统,本文中小编将为大家介绍飞凌嵌入式在OK3568-C开发板上实现实时性的方式,以及实时内核的效果测试。
, t2 E/ ~7 k3 a6 V% u% j* w( Z T$ {: Z+ r1 R8 b
0 Q: L5 J1 T# X; e# {4 p! D
! Y9 ^* n% h: [+ E, V$ n3 F( W$ V. R" t/ Y6 }, b
" m2 V" m8 x9 Z5 H, u! f% r- n1 g; U" [/ |8 L$ e' @
9 C2 N# I3 e+ b' A' _, j![]() [backcolor=rgba(18, 18, 18, 0.5)] 7 R' ]- N: p9 X4 @' C7 H
: `2 W! a' C4 }4 i% S
7 T8 S$ F2 E1 X% {
4 ~( ~* J$ O2 K' \% E/ F
% q" Q" X" _. X& D
编辑切换为居中4 q3 K2 @7 {) Y/ g; n9 }) o
- m; y* J* X* p2 z
3 S' t8 k% R% D
& H. E5 ^# q* p; Q. k( t
L& t- d# Q `+ _" ]* D( l
+ _$ H0 N, m! j3 y2 f- X3 {
$ A! G$ S! v# r2 i* A, X
# t) b, l/ `$ \
- D. _# |- x) a+ I& R5 ]) M1 z4 O( \+ b/ [% U3 d( _
! y( C l; @" J* e: ]5 f' B8 Y
+ u/ K, c3 @6 z: D
# p. X" C. D2 f- l) W14 Q1 X3 m. a2 C2 P
+ A! k6 f8 m+ H% I$ O为什么选择实时操作系统 ?
" x& A+ l0 H- j9 c
6 i- | ~/ y2 ?- d* p! D9 A5 S3 t* G
$ e+ z0 C; ]" m3 I! D
8 C6 b- a4 V" h4 u2 N4 }& b2 U
; c0 {& s+ S4 S
8 Q/ j% K4 }2 N* B
$ @ j( r+ i8 E: `
我们都知道,操作系统可以分为实时操作系统和分时操作系统。分时操作系统其实就是将系统处理机时间与内存空间按一定的时间间隔轮流地切换给各终端用户的程序使用。目前市面上绝大多数板卡上运行的Linux系统都是分时操作系统。
2 Q- b6 i) ^, K+ H) n, {* Z* U) N) {
, ^. ?5 K) \+ n4 L+ L ~9 j
% E& y- p* }3 d5 p! [3 _
7 m3 n% T) Q: X- v6 }3 T但是随着自动驾驶、智能机器人等行业的兴起,对板载操作系统的实时性也提出了更高的要求。这时候,分时系统就无法满足某些对实时性要求较高的行业的需求了,必须对Linux系统进行改进,使其具有更好的实时性,以顺应行业的发展。
2 O( B, C- u# R; u% Y/ |8 ]$ s8 n( e- `/ G9 }1 k& G
1 N ^% A6 N9 n9 n0 d
; f9 ]& k+ {) O6 r/ T( W7 t
7 c; z: k5 k' Z4 g
: c2 p6 z& y1 `' x' y0 E2 v$ Z2 Q: [" U* i* B2 h5 w
7 y, T7 ~2 p3 Q
![]() [backcolor=rgba(18, 18, 18, 0.5)] 6 e; Y0 n/ J; E q7 h" B
2 S7 J" w/ M' t, c$ z% Y0 Y7 \( A
4 u! H2 F% l7 b4 l0 v3 m1 A
1 x: O! M. a* T: h! R8 A% h( S* P3 k- f. \% `$ e
编辑切换为居中
5 S/ n( }$ l# K& F7 Z! o. |% y% h; M7 v' g
3 Q9 B* j) o$ T' z, X& f/ t4 b4 B3 p
, |5 C2 I+ w4 s
' ?" j8 g" \" {! H" [) B
4 Q0 v/ \1 j5 W: Y& g) H
. l. h. G6 m- e1 S ?( H" ?2 u( Q/ I; p; i1 I3 e1 Q
; e* w5 J" p; c [7 n9 }* _9 S( ? A: }6 }" r5 W& Y. X s
+ k- H% g3 e& H/ R) @; c: G
2 |8 U& d2 o* a# I/ Q
7 G$ [+ E& [$ a4 A! o例如无人驾驶技术,系统需要根据复杂的路况情况及时做出分析判断,做出反应,执行刹车或变道操作;又比如车载安全气囊,在遇到突发事故时,系统必须第一时间做出反应弹出安全气囊,保护车内乘客人身安全。这些实际应用场景都离不开实时操作系统。; ^% p: I( f2 ? O
/ i" \" ]8 ]. l( B
- o# g/ p. K: O
5 L. g3 A) Q z2 m6 P) t; x. B9 A3 W+ V( [
24 E% F4 y* v0 b/ h# l2 d2 R0 Y" ^3 N
4 R7 P- J9 |- A7 |2 O$ p如何实现“实时性” ?6 O. O7 a2 B; a3 I% g* c( h
+ I; _& M, L6 E8 m* o2 g
' v1 Y0 h9 k1 ^: j: \* @6 Y; d
9 r! q* A/ D& D5 u, P/ }/ H& }2 M- j1 @% H% _+ X. R
0 d/ l( S% z4 ?0 g, `( s
, S/ t! P& n; T$ Z
7 q8 W8 R$ E6 V! C+ k4 bLinux系统可以采用打补丁的方式来实现“实时性”。RT-Linux就是在Linux的基础上加入了一个实时补丁,从而将Linux改进成实时操作系统。简单地说,“实时补丁”的主要工作就是针对Linux系统的优先级倒置、自旋锁等问题进行改进,以达到实时操作系统的要求。
0 D' T* F6 f7 }7 E% H
) Q9 S/ ]8 q$ m' f! ^% i1 d: J5 e' Y" [5 N, m) L2 J% B
& c( \1 J0 `9 x. i/ A/ r
6 L( Y% a% t& v& _' l: E基于这个思路,我们就可以通过对内核打实时补丁的方法让OK3568-C开发板上的Linux系统满足实时性的需求。4 {! [7 q; F' d, b" G g" A
7 T& `6 Z$ ?/ u; H. \
_5 c( c. d: E8 P. ~0 {! w, {9 L7 Y: a
* D4 m K" z- u$ Y8 L3 b4 W
飞凌提供了两个补丁文件:# ~8 }6 y* v! U2 o, o+ Z. M
! Y$ C5 I, g# h6 E7 `0001-patch-patch-4.19.206-rt87.patch-fix-kernel-sched-cor.patch0002-fix-kernel-sched-core.c.patch
x' A8 _ c8 N* R( c% v' \" e * `3 J/ o$ K5 a) T( W4 B" H
4 {, P o9 M2 u" U
$ V3 v( Q! K) y7 Q& g将两个补丁文件拷贝到源码/OK3568-linux-source/kernel路径下,执行以下命令:( a; k) M+ S# b' {- S
5 e* Q9 h6 E# L2 Jpatch-p1 <0001-patch-patch-4.19.206-rt87.patch-fix-kernel-sched-cor.patchpatch-p1 < 0002-fix-kernel-sched-core.c.patch
. D4 g* @& O4 M* K4 C% Q 7 p; w$ C6 B. ~2 q3 D/ \9 r1 T0 }
( Y9 E; w( v5 r/ O3 i
' D- s+ g+ v, ]6 [3 B然后,在源码执行./build.sh kernel命令,即可在/OK3568-linux-source/kernel目录下生成boot.img镜像文件。
, u$ K8 |5 ?, S8 G/ A/ K, `9 _- C% m
4 G- G6 B p+ y( L I0 K
2 J& a6 q- r9 Z* ~" x
; Q! ~2 ~+ @7 w7 y7 Q/ V3 z* R* U3 p# k. V2 B ^: f
客户也可以直接单步烧写飞凌制作完成的boot.img镜像文件。" N9 V k' g n) D
. ~5 C7 f5 X6 |! R- g7 _ I, e
- x1 T# ?$ l3 k
+ [- y4 s9 d. Y* [) J: u4 v2 C& {/ o, z8 |& X- z
使用Type-C线连接开发板和主机,按住recover键不松开,然后再按reset键系统复位,大约两秒后松开recover键。系统将提示发现一个loader设备。# U% D' l1 E# @4 `: C% Y" {# P9 ?" h# I
5 h, a1 k& {3 Z! v' u6 o ?
+ Y8 |% H0 Y: A4 r& B/ n$ A
/ t. U2 {7 ?; x" q
! f. y1 X8 Q; y
![]() [backcolor=rgba(18, 18, 18, 0.5)]
- }' t( O8 ^/ W0 w3 ?9 q$ h
) Z$ J& T) o4 q0 r6 v3 ~, r7 ?6 Q
: E, U( ]* m3 N7 S6 @( Z' |0 Z
5 M" {4 z2 p1 B
( i8 f3 ^/ t$ u6 B1 }& h' P编辑切换为居中
) c% ]- B+ D0 | x6 y5 w3 o
4 L$ Z3 N+ r5 i! V- s4 {( F7 a' r" F
3 q+ Q- q" Q! Y+ L& b; I
& c; [- O! |6 P& w& ]3 J' a添加图片注释,不超过 140 字(可选)
! G5 T# J. `- G: l A6 ^/ O1 Q7 ?
; m0 x- [) C, _% _; l+ F3 M/ t+ G0 ^; c p3 H
, C' @6 z9 A, C2 q# R) g1 n2 I
$ V. n1 c) h2 Y: J+ k3 b; \ x5 e( v9 w
9 v7 y. M& a$ d
+ c/ F' h& H% V% Z: c
点击“设备分区表”按钮,将自动读取分区地址。- @% H4 i; c4 a3 h0 b
9 L, w1 r/ E& ~. g* |9 G
# ~1 e: `! Z% G& P1 c5 T
- M) L8 |/ Y/ U& x' p7 y, N) S5 F2 s# }6 y; f( X
![]() [backcolor=rgba(18, 18, 18, 0.5)] & \5 X x( I& j% }( t6 {
& K6 u4 |9 X* U+ b * M% p, \0 N9 y C0 D9 S/ p' d$ Q+ }! q
C3 y) C1 }3 o2 ~, X% j- c9 {* D
7 j6 n7 e3 t- i1 X. T
编辑切换为居中
) g* z+ m I7 n: Z2 y' b' v& |8 G8 r7 |" g
% R& e6 ?7 o% P& ]7 e
/ l9 v0 e+ w6 J* X! t5 S
, f a6 n1 _$ A9 {5 j( e添加图片注释,不超过 140 字(可选)
# R0 d/ w+ B# c* ^4 I6 R# r! z
. j, E. F9 H8 W2 |# ?8 W) B( e9 _' i. |
( A: C( I" p0 E( M* Q5 B6 X
5 T: p7 P- @% k$ S* f- M
. i1 \; P0 q, B- |; ^0 _5 t" A6 S
' b& i; C/ Z- L& `+ J
" [( V- L& T( L+ h! V点击左侧勾选boot分区。
( D8 B. a5 ~) y. |0 j6 N
5 v( G4 c: q' ^ C8 |: Y3 K) ^
' f9 @% ]) M/ e8 J7 q2 V; p' }+ o/ e5 g. s1 Z- ~
/ X( }8 R% V' ?9 E; |* ?% s6 s$ ]
![]() [backcolor=rgba(18, 18, 18, 0.5)] v0 O1 i% R9 L M1 h# D7 J3 ]4 M! |6 B
, o9 j0 N7 C) j _2 I& L
' ?# s( X3 q5 h5 f5 a8 s
- u$ g( w8 t8 G( ~6 Y( a+ p# I+ t7 ]2 K: q
编辑切换为居中3 @0 _$ x( J2 R5 n/ L9 Y
* p! V9 z, Q1 s& N+ L7 K$ n2 k: k
2 K4 X. G0 Q! q% y! Y2 ?5 a3 i% w4 V/ |; i5 }
4 x: J" {' w! R6 u: n' ]
添加图片注释,不超过 140 字(可选)
4 Y/ |" g' s5 l# [* C8 J
5 H( y6 f/ ]) b% a$ A) Z$ @/ X3 Q! k% m( U7 a7 E
8 q, a$ p) R( f
. j7 n9 o/ c Z: }
! C& Y5 ]5 A# C2 |& @; I
/ j, n$ n) s/ x$ L% ^
, \5 w% P6 ^/ E# i最后,点击右侧选择您编译生成的boot镜像文件路径,点击“执行”按钮将自动烧写并重新启动。
! O( r# w1 {8 \( f/ x; Y5 k: R3 @+ ]; Y: \8 m' {5 {# R, v
" F' Q+ J% l( x3 R' W1 \* ?( U6 _" h; k, F% f' R4 Z' A/ B2 k& [; B Y: p
- u: c, e1 j3 I: `+ I- |
想要了解有关实时补丁的详细资料,您可以在公众号留言联系飞凌嵌入式销售工程师。. S: g; g, J/ n" @3 }' R' I. g
! J" |3 i4 `# D
; C$ O9 v: C h( j* j
4 O Y) _3 y8 j. y
0 L( J5 r1 h; H0 G" Y* ]6 b- s! s' F3, {0 D" { T# e& \7 I
4 ~8 t/ \5 |# ^! [5 R
实时内核效果测试 " w+ t8 Y( o8 P2 C# N; _
& h7 M1 m7 T+ ]9 O$ ~- a4 R* B7 T
) Y! `! h! G" N" F8 m! B9 z5 g5 w( n/ O. ?( e
4 f# _6 Z+ w% C
) X/ m( H# A) ]5 S/ r8 a
! m/ \3 X4 u: a4 ~) e; E8 l* b4 M7 K% g9 K+ h
测试实时性的关键指标便是“延时”,延时指的是不论系统运行在代码的什么位置,当事件发生时,系统响应该事件的时间。" `! J j2 a. t3 L6 Z
* m \- k' t( \( P+ J% U5 |. R9 b0 d7 Q
) v2 u$ A. s& h U* H
7 q/ h3 ]- r4 }$ L
其中中断延时指的是中断触发到中断服务函数执行完毕的时间;调度延时指的是进程在队列中等待直到获取CPU控制权被执行的时间。
$ G7 q0 G6 m7 |% y& H; c+ ^' S
3 \& H' W: h, e
5 `$ L6 Y. P' @) O
8 p: d) G; M4 d1 g+ G7 n- z/ D! Y% [3 \* t, Z+ l$ D, R1 L' ^" j
实时性,也可以表现为对这两段延时最大的容忍程度。这里通过cyclictest软件测量中断延时和调度延时时间。- k8 k0 ?8 Y, {: B8 b" I
5 z: r& O6 y( M& v: x6 R0 Z9 J" R( `4 ]" f2 R, B
9 ^3 [$ X1 R( d0 O, e( x6 [- {9 `: `* Y% l# ^9 ]" F" O8 W
由于在真实的使用环境下并不能触发最大的延时时间,因此在没有合适负载的情况下运行cyclictest所测得的延时统计数据是没有意义的。这里我们采用官方提供的hackbench工具来模拟部分类型的负载,然后在此基础上运行cyclictest软件来测试事件发生时,系统响应该事件的时间。
4 Z5 }/ r5 ?: h5 o K( B7 [
# D( }: n4 [9 v8 V/ ^! c
' `; s ]; A+ _1 I- u2 r7 b8 c5 D, o1 I: }8 @
8 k9 I9 d8 f+ u5 n) B$ |! c- p
先来看一下未打实时补丁的测试结果:
( o! z; N2 }! p+ f3 F
8 l- R) J7 s2 P( }: v& `. E3 b+ U7 A8 `/ I$ ^9 J7 i8 `5 S; y a
( b; ?( b$ F0 D
) ]9 x. y. a1 O1 E. r7 c& h) q![]() [backcolor=rgba(18, 18, 18, 0.5)]
: O7 b( q+ o" A, b1 d8 k! h" n7 f$ \+ d4 C$ @! U# h0 [$ B; m
( A( v( Y- v2 C0 }8 Z3 ~
* [: Q6 y0 |, {0 ?# G
/ m: [' k% s, @- Q! |$ U7 {* E, W编辑切换为居中
3 I3 ]! l2 b, v9 y% q4 f% _
+ Q" L' ~7 Q! J$ e7 m6 j
4 I; [! O' p- }0 U' x4 A9 \ a) @* @/ A) |
8 z$ f, K4 Y% P& k2 v0 T
添加图片注释,不超过 140 字(可选)
: X& v* W3 i% \: t: q' ~5 {' s; \ f- q3 v/ [. y7 V
8 I8 Z4 d8 f5 r! J2 Q3 W! A6 q
. N! @5 j! c& D
5 I2 }/ p X+ |! Q
; c. K5 l; E( C# Q0 k; L$ j
$ F; K% @6 U) z1 @2 I) `# p2 A* k8 N2 Z* `+ @/ F* l# ]+ A! p
再来看一下打实时补丁后的测试结果:
* u. ^: X7 h: a% x2 `# R _6 R8 l) k) q; U
. o% \* j$ v7 s; g3 C4 B& d, g8 | J
% R; j$ ?5 ] e5 ^, h. Q7 G
![]() [backcolor=rgba(18, 18, 18, 0.5)]
- T1 z( h/ o3 [1 V% N4 Z* A! {" {4 e0 ]! _, l
; f8 K8 j5 | D; C% Z# H' X
) `, a9 K$ ^' C% {$ W$ `1 a# Z+ L% g o
编辑切换为居中
/ S; b" D8 J( T% @/ d+ r9 f
2 Z9 j. _3 x5 \1 w
! f0 Q) B# a: m6 R9 Q. V/ O, M9 j% Z: D6 g' K- {7 H9 M
_# M9 g$ f& g4 z& e! L
" R9 g1 o* ^) H) T
# y* ?$ i7 o% S: S9 n+ l8 [# L
/ J3 V" b6 @7 V7 G& [- o: d7 {% O' M2 A# N8 Y. G; H
" s% A1 ]( S3 i( I% e4 x+ s( V% }& e& [
7 d' b2 B) t$ I+ [2 r6 b6 o/ f6 l6 _' i3 W2 _, W. m$ c+ o
这里我们着重比较两者Max得出的参数,因为系统的实时性能是由最大延时时间决定的。通过对打实时补丁前后测试结果进行对比,打实时补丁以后,可以明显看出延时从213μs降低到80μs以内,实时效果还是十分明显的。(不同测试条件下的延时不同,这里的测试结果仅供大家参考)
' k2 s( }! I! [6 b6 ~1 Q+ } v4 C! P& ]' l* f9 m' P( U
. Z5 N1 H" ^# ^, I: J |
|