本帖最后由 andeyqi 于 2019-1-5 19:45 编辑 D( }$ P6 U8 Y4 h- O+ A RTEMS * C5 D! Y. j) m5 J. N6 j& Y) m o6 _! T, u8 P$ w! F0 ], f/ ~ RTEMS(多处理系统实时可执行体)是一个为嵌入式系统而设计的自由的开源实时操作系统。 ' z! Q! x6 \8 V在缩写词RTEMS取其现在的含义之前,初始时代表导弹系统实时可执行体,然后变成了军用系统实时可执行体。 # S2 n1 S: w- v& o: e1 ]# oRTEMS曾被移殖到多个以不同类型的中央处理器(CPU)为基础的计算机系统上。这些计算机系统所采用的CPU,计有:ARM、i386、m68k、MIPS、PowerPC、SH等多种不同的处理器。RTEMS被设计为支持多种开放的API如POSIX和uITRON。FreeBSD和TCP/IP栈还有多种文件系统也被支持。OAR公司当前在维护和管理RTEMS项目。RTEMS也被一些EPICS站点所使用。 0 s+ n9 U4 D8 |/ D5 b3 f1 URTEMS是在GPL授权条款下分发,但它允许将RTEMS的目标文件链接至其它文件而不需将整个文件以GPL授权覆盖,这方面有点像LGPL。8 z3 c( Y k6 p: ^; t5 E RTEMS的源代码下已经支持了stm32f4系列,用户只要配置编译即可运行在f4系列的设备,本实验基于STM32F446 Nucleo开发板,编译成功后会生成如下的开发工具包。 ( _" g3 c. I+ M d8 h$ V2 E7 t2 ~ _* M% v9 `1 T" D3 ?rtems-4.11.3/c/src/lib/libbsp/arm/stm32f4/ 3 J2 `6 o, y* I5 i├── aclocal.m4 1 B' B% p$ g. a├── autom4te.cache& h( X2 O/ M q. G- G! I1 u │ ├── output.0# g, V" n2 @- Q+ f2 |* @2 u │ ├── output.1 ( T: N* l) u& w& W0 A│ ├── requests ! S- h" ~- {% X8 g/ g0 w# v│ ├── traces.05 S8 ~% o9 z: k t4 ?1 U9 G" J$ Y │ └── traces.1 - n0 g" s* y( `0 }0 Z6 z# t% I├── bsp_specs' T Q: _; w0 a" A ├── configure 5 U1 k" i( Z: Y- ~* N+ h! }+ \├── configure.ac* D% C6 K) J- ^& J" d ├── console 4 y! F; j5 x* G: [7 K│ ├── console-config.c/ n9 l6 ^/ ], V: g% ?9 H │ └── usart.c- \/ o& Q6 H7 ?$ e( M5 J8 ~1 m ├── i2c5 ?2 ^6 l; _) m3 v5 M. r0 ~ │ ├── i2c.c ; } v- S, p: [* @5 p0 N│ └── i2c-config.c ) o1 d$ c% S Y3 Z( D" n7 _5 T$ p├── include5 F+ b+ Y8 i# a% c0 G1 y* H │ ├── bsp.h* Y+ C: i9 o4 M9 m │ ├── bspopts.h.in 9 W& S6 P1 w' i* z& o/ f│ ├── i2c.h1 O& j& }1 X' U# K- X8 H │ ├── io.h M H; e% Z: J; X8 [, O │ ├── irq.h7 o2 _' _/ K# D% J: s+ C │ ├── rcc.h 0 c# |( M6 }% U$ F, }│ ├── stm32f10xxx_exti.h / B9 U: i9 R7 P│ ├── stm32f10xxx_gpio.h6 m" u5 a: g: o4 m6 h# h1 H; ~) ] │ ├── stm32f10xxx_rcc.h . s$ Q: @! `2 C6 t│ ├── stm32f4.h ' i/ x! a% ~ @/ |│ ├── stm32f4xxxx_adc.h6 S& N G- m/ C( Y │ ├── stm32f4xxxx_exti.h % M5 q) ^. h, G6 N│ ├── stm32f4xxxx_flash.h 5 F' G5 e' x2 P8 T5 a# O, t7 W│ ├── stm32f4xxxx_gpio.h 8 H. d! s1 ?5 {& c" p│ ├── stm32f4xxxx_otgfs.h+ ]" z. f. l, \# P' F+ ] │ ├── stm32f4xxxx_pwr.h& q! }1 l6 D5 `/ r. N2 q( F │ ├── stm32f4xxxx_rcc.h ) j! D. R8 X* a& e( M│ ├── stm32f4xxxx_syscfg.h: x' z5 | m2 k0 ~0 u │ ├── stm32f4xxxx_tim.h 0 y* E# e# u' C8 f3 J& T0 R│ ├── stm32_i2c.h! f. G# A- A' I1 j6 Z. @5 x9 x' b │ ├── stm32_usart.h - \% _8 p; m2 v5 H│ └── usart.h' T7 ?# A' x# {) S, Y0 r ├── make " l. D! C1 ^+ }( b5 ]0 n* i; x│ └── custom 8 }3 g# P/ F: I6 @$ S8 _│ ├── stm32f105rc.cfg' l2 T+ O/ n! U │ ├── stm32f105rc-testsuite.tcfg 1 ] o% C0 t( V& ]. m& a+ H│ ├── stm32f4.cfg' Z6 S2 a& z1 L# R │ └── stm32f4-testsuite.tcfg / U( X6 O1 V4 _0 q, [( A2 G├── Makefile.am & K7 f5 ^0 p& U├── Makefile.in \# {( T0 U/ i& \4 k├── preinstall.am ! T' V5 i$ i% T3 F. T├── README * B& a; C; z! ^7 U4 D5 {+ A0 j└── startup & f3 P/ n/ P# S ├── bspreset.c! y: u) D; Q/ G! e2 H% `% A. K! _: T ├── bspstart.c6 d5 N. e& D3 o: @ Y2 [4 E ├── bspstarthook.c % T1 [2 q" W( U2 C" U5 M8 r$ B9 ` ├── io.c 2 Z, |5 `- t( y: y6 q) v ├── linkcmds.stm32f105rc& `1 i7 ], @/ K6 X ├── linkcmds.stm32f4- E0 l3 z O2 u ├── rcc.c ! G0 i" j2 \$ \4 @ L └── start-config-io.c" `! u3 |1 t6 T" U3 f/ T6 Y ! v$ t! m5 U& Q* @5 @0 x# v7 directories, 51 files / N/ @& h3 ]% S O0 ^* M复制代码+ w. E- {* S5 j- @) b2 J$ V , Y4 C) e5 C6 W* ]0 ?4 H2 K/ t3 D8 h3 K# ^# @ 一,编译工具链的编译配置。 ①下载rtems-source-builder-4.11.3 编译工具,下载链接如下:+ N& D- C" U/ B. A# R# \' m/ U( ^ C http://ftp.rtems.org/pub/rtems/releases/4.11/4.11.3/rtems-source-builder-4.11.3.tar.xz" N! O- g: D, {5 f, j2 _ ②编译配置,ubantu16.04下安装依赖工具包:+ E$ ]; p B* Q. h" T7 _2 I8 ^ -------------------------------------------------------------. m/ |- a- d$ r. L $ sudo apt-get build-dep binutils gcc g++ gdb unzip git python2.7-dev" [/ q3 q/ I. \9 l$ h -------------------------------------------------------------复制代码检测编译主机(Ubantu 16.04)环境: - t. d! q& R% r. \# U% N$ cd rtems-source-builder4 Z* d! h( B1 s $ source-builder/sb-check复制代码Checking 成功后,编译交叉工具链: * O3 ^9 w* h1 j; L% G' S$ cd rtems* E6 X8 p, k H' `( A% v4 D : v+ z0 M }4 }8 \; W8 n" T6 M3 x$ sudo ../source-builder/sb-set-builder --log=l-arm.txt --prefix=/opt/sdk/rtems4.11.3 4.11/rtems-arm.bset . P. E# a% j9 B复制代码5 B: C% A' Y7 {; ]- P 编译过程会持续2小时左右,编译成功后会在--prefix=/opt/sdk/rtems4.11.3 路径下安装交叉工具链 9 e; S- ]" }4 T/opt/sdk/rtems4.11.3/bin/& g& H& A" I; z0 K ├── aclocal2 q) x N7 G! \: }1 a ├── aclocal-1.12 - x- W. l. w1 \: J├── arm-rtems4.11-addr2line w D, e3 O; n+ K+ R& w: L# e1 v ├── arm-rtems4.11-ar ) x) [( | p) \" @" Q8 _: n├── arm-rtems4.11-as - q" B3 Z: o# i8 b+ I [0 B├── arm-rtems4.11-c++* g! n+ x, r9 k$ h ├── arm-rtems4.11-c++filt. ]3 w$ @4 ]- O! J$ C. A ├── arm-rtems4.11-cpp% e; b6 J0 a! M" M. v$ B4 S# }) \0 d ├── arm-rtems4.11-elfedit + a5 z% e7 ~0 i$ R* Y; J: g. E" z" J% @├── arm-rtems4.11-g++; ?. j$ L# J! J- o, W ├── arm-rtems4.11-gcc$ {: n$ ^7 O# U# P6 U' Y4 L { ├── arm-rtems4.11-gcc-4.9.3 2 d, j1 v* ^7 Y7 v7 ]6 z/ e├── arm-rtems4.11-gcc-ar 6 F% _* t7 b( |& F" _ P├── arm-rtems4.11-gcc-nm7 _, e7 \1 E; J+ k$ Z ├── arm-rtems4.11-gcc-ranlib ( ?; P" X1 l2 v" l$ l1 w├── arm-rtems4.11-gcov( C+ y0 `/ ^# i5 n ├── arm-rtems4.11-gdb 7 ^$ J9 L/ U% U& G; L/ v* V├── arm-rtems4.11-gprof: I! ?, c! f1 O9 t [ ├── arm-rtems4.11-ld% T+ r- O( E, P/ H# X. M* q" J ├── arm-rtems4.11-ld.bfd ) N* r; c, \" k& B, B' j5 a$ V├── arm-rtems4.11-nm2 \5 C6 i% l1 k( H D ├── arm-rtems4.11-objcopy & c+ }' `3 k3 P1 H4 T├── arm-rtems4.11-objdump ( [9 b- b' o. T# z. H% K" c, i3 B├── arm-rtems4.11-ranlib }2 p0 v1 v) d2 V) B5 z( ?1 c├── arm-rtems4.11-readelf0 G0 ~# `0 v: R ├── arm-rtems4.11-run ' v, o) U1 _. l6 Z! ?9 Q├── arm-rtems4.11-size$ h `& g' y6 q: v ├── arm-rtems4.11-strings. u' C- ?* g% C5 i* ? ├── arm-rtems4.11-strip - K, R1 V9 H- p) K├── autoconf 5 K) Q# P5 O9 u2 D8 l├── autoheader6 A: B. Q2 q$ Z4 ^" @# y( Z" k ├── autom4te 4 B: X7 ?+ u9 `% x6 X' |3 g├── automake! t+ B6 \7 M6 u' L# z$ } ├── automake-1.12 ' m* l3 {' @% b4 ~) c├── autoreconf / i" A O7 P J! ]8 n├── autoscan7 S6 x. U3 o8 q+ k ├── autoupdate- P$ x, f$ [" r+ i/ k ├── covoar- B2 @! m8 k1 \( N9 w/ G ├── ifnames3 p8 l" l5 \7 B- s6 `# ^4 S0 X ├── rtems-ld8 _: x3 N, \, L* o, ^; N ├── rtems-ra7 J/ A/ D5 M9 D; X1 e6 { ├── rtems-rap # f7 z& B; u1 x8 g( p* a├── rtems-syms+ w0 q! A0 B5 S8 ?" J) e0 i$ M ├── rtems-test % s( o' O2 H1 Z2 g a' B2 d├── rtems-tld ) _$ P' |) I7 Q1 D5 [+ r4 O├── trace-converter * a4 y1 S% V- H |! F└── xmlwf7 |( y& C6 R' n% s& z$ T 复制代码测试 arm-rtems4.11-gcc 版本如下: ; k, N- B, z5 Q8 K& {" candey@ubuntu:/opt/sdk/rtems4.11.3$ /opt/sdk/rtems4.11.3/bin/arm-rtems4.11-gcc -v 5 }' @( y) g* s1 E+ C& W6 ?, VUsing built-in specs. 7 ?1 n. C2 R6 G2 U( d6 u* j) FCOLLECT_GCC=/opt/sdk/rtems4.11.3/bin/arm-rtems4.11-gcc 4 M+ W+ j d UCOLLECT_LTO_WRAPPER=/opt/sdk/rtems4.11.3/libexec/gcc/arm-rtems4.11/4.9.3/lto-wrapper 1 J* o) n6 t6 i- d; _Target: arm-rtems4.11# U( G% P5 m: @( b Configured with: ../gcc-4.9.3/configure --prefix=/opt/sdk/rtems4.11.3 --bindir=/opt/sdk/rtems4.11.3/bin --exec_prefix=/opt/sdk/rtems4.11.3 --includedir=/opt/sdk/rtems4.11.3/include --libdir=/opt/sdk/rtems4.11.3/lib --libexecdir=/opt/sdk/rtems4.11.3/libexec --mandir=/opt/sdk/rtems4.11.3/share/man --infodir=/opt/sdk/rtems4.11.3/share/info --datadir=/opt/sdk/rtems4.11.3/share --build=i686-linux-gnu --host=i686-linux-gnu --target=arm-rtems4.11 --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --verbose --with-newlib --with-system-zlib --disable-nls --without-included-gettext --disable-win32-registry --enable-version-specific-runtime-libs --disable-lto --enable-newlib-io-c99-formats --enable-newlib-iconv --enable-newlib-iconv-encodings=big5,cp775,cp850,cp852,cp855,cp866,euc_jp,euc_kr,euc_tw,iso_8859_1,iso_8859_10,iso_8859_11,iso_8859_13,iso_8859_14,iso_8859_15,iso_8859_2,iso_8859_3,iso_8859_4,iso_8859_5,iso_8859_6,iso_8859_7,iso_8859_8,iso_8859_9,iso_ir_111,koi8_r,koi8_ru,koi8_u,koi8_uni,ucs_2,ucs_2_internal,ucs_2be,ucs_2le,ucs_4,ucs_4_internal,ucs_4be,ucs_4le,us_ascii,utf_16,utf_16be,utf_16le,utf_8,win_1250,win_1251,win_1252,win_1253,win_1254,win_1255,win_1256,win_1257,win_1258 --enable-threads --disable-plugin --enable-obsolete --enable-libgomp --enable-languages=c,c+++ p' r$ a! }& b" m! e Thread model: rtems ; k* ?! j7 L$ N9 W0 ?+ vgcc version 4.9.3 20150626 (RTEMS 4.11.3, RSB no-repo, Newlib 2.2.0.20150423) (GCC); Q. P5 Y- d' F; P. A7 v# U8 e 复制代码 4 r% P" J# [; c [ q. ~ 7 s# k) A, }9 O% z$ E) I n/ C二 编译开发SDK: 1 s, M' L: |% H2 q. J+ Y 下载rtems源码,链接如下:http://ftp.rtems.org/pub/rtems/releases/4.11/4.11.3/rtems-4.11.3.tar.xz使用自带的bootstrap 工具配置工程,使用方法如下:9 h8 `0 C( X: F7 z usage() 4 P0 C( K7 C/ f4 X! d3 Z8 h: z7 E% X{- C5 }4 ~6 L' |/ e9 I0 g* g0 @4 O echo }7 i8 G7 S: a) b( Q* X. J! c echo "usage: ${progname} [-c|-p|-h] [-q][-v]"( Q) }, h& ]1 c# o/ L1 @3 U echo, M# j5 I& {% i& m: Q echo "options:" % ^: c! T' b. {7 H0 e2 m0 Q8 `/ I- g echo " -c .. clean, remove all aclocal/autoconf/automake generated files" 9 m- H: B D9 u echo " -h .. display this message and exit"6 L+ Z) X* n9 |, q7 a* v echo " -p .. regenerate preinstall.am files", U/ i/ {1 h X3 | echo " -q .. quiet, don't display directories" & R8 K+ {! o, G/ w echo " -v .. verbose, pass -v to autotools"$ Z0 j9 B- A9 x2 n8 W echo8 }- a7 F7 G2 q) V: h exit 1 " r' i: ^ t% b& ]7 y4 O}复制代码rtems源码根目录下清除配置文件:复制代码配置成功后,编译SDK: ../rtems-4.11.3/configure --target=arm-rtems4.11 --disable-itron --disable-cxx --disable-networking --enable-rtemsbsp="stm32f4" --prefix=/home/andey/Download/RTEMS4.11.3/stm32f4 # u M# u: c2 e9 s" {7 k8 Q: s make( M: V/ w1 `* @" x* Q z make install $ Y7 K+ P' U( |9 `+ j8 P复制代码编译成功会在安装目录下生成编译好的测试程序:以下烧写hello测试程序5 q* Z4 Z8 Y# t$ C6 ]6 D b8 F | stm32f4/arm-rtems4.11/c/stm32f4/testsuites/samples/hello复制代码生成bin文件:arm-rtems4.11-objcopy -O binary hello.exe hello.bin复制代码烧写测试程序运行效果如下:7 f$ u7 l- i; `3 Y# o 7 Y% m+ [! U! F2 d (, 下载次数: 2) 上传 点击文件名下载附件 ) \+ I+ n# C+ Z$ w (, 下载次数: 6) 上传 点击文件名下载附件 : R! v8 j, P* T, |. ~% f r' Q9 j) g (, 下载次数: 8) 上传 点击文件名下载附件 (, 下载次数: 9) 上传 点击文件名下载附件 N8 \2 y+ x. ^3 u5 N0 N 1 d4 v8 L/ E! d. e7 X( t ' a1 U& L9 M+ D$ s' j- X3 I 8 V% n/ [. J) l" e! O ' }# w' v' Z/ c% i" x; X9 ~. j% X 9 p2 z8 ^8 ?' \+ Z: G- } Q6 C + H2 }; l) ]$ b1 V! ] % C& V/ n9 p1 p6 c. F9 g $ l* T0 q: P8 T, ]5 F8 G( G2 c " [/ @* X/ R3 H p! I2 h2 ]3 ?- T. p) Y) v* {1 k" `7 K, d& B1 V