|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
嵌入式系统的定义应当是以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。% I! P% h3 l# l3 O! V2 `, H; r
比如现在ATM取款机就是一个典型RTOS,embedded os主要包括两部分,一部分是处理器,比如ARM,POWERPC,MIPC,一部分是OS,比如Linux,wince,vxworks,us/os,etc.我现在主要学习的路线是arm+linux,选择arm主要是因为arm技术已经比较成熟,选择linux是因为linux是开源的,免费的,另外如果学好了linux就算将来不搞嵌入式系统开发这块,也可以专供linux服务器这一方面。
: ~3 \# d: r5 p" `" K% m2 i; R* ~6 N! G: ]% H8 Y- A$ N; q
学习嵌入式linux,主要做的就是四点,一点就是写bootloader,并移植到到nand flash上,第二点,编译kernel,并通过bootloader下载到nand flash上,第三点,在基于nand flash上建立文件系统,第四点,把写好的应用程序下载到target上。基本流程就是这么下来的,具体到开发板上时可能就有所差别了,下边就以深圳优龙公司的fs2410为目标板具体的上述一下开发的流程,以及在开发中应注意的问题。想交流了解3306607541( c, q c8 f% t8 F& l
第一步:交叉编译环境的建立# S9 J) E, T( E! T/ n% x" [
5 [+ C# W5 q# A5 k
A: 基于linux操作系统的应用开发环境一般是由目标系统硬件(开发板)和宿主pc机所构成。目标硬件开发板用于运行操作系统和系统应用软件。而目标板所用到的操作系统的内核编译、应用程序的开发和调试则需要通过宿主pc机来完成(所以称为交叉编译)。双方之间一般通过串口,并口或以太网接口建立连接关系。安装linux os,比如redhao linux 9.0,可以采用默认安装(但要包含ftp服务),将该linux服务器接入局域网,其他的pc机可以用windows,需要的软件工具包括。3 o8 `. g& ?' }% f: g. t: Z
+ K: D& {) c7 n, _(1)ftp客户端程序/ j8 |5 c7 t6 w6 S
* ^0 [5 Q6 a" s. A0 B9 ]0 _( R
(2)telnet工具+ }# K% X" D2 b4 L9 f
s4 v: y* S5 h! f(3)移植到某一特定arm平台的linux操作系统内核源码
9 T" ?1 _. Z# w/ A6 U, T) `# \& B, W* i# j7 C) i- c- B& m) [
(4)gnu编译工具,可由相关网站下载5 p0 F1 ^0 R& [- {4 m3 e
2 K2 j4 K( S9 J G* t$ _
在某工作站pc上安装ftp客户端程序和telnet工具,linux os kernel的编译一般有一个比较固定的步骤,会根据Makefiel文件的不同而略有差异,可参考相关文档,按固定的步骤编译内核完成以后,会在相应目录生成可执行的二进制文件,通过ftp传到pc机上,热后通过串口或网络下载到开发板上。
# [3 ]( L1 _/ J! f# w0 z. g/ b+ ]3 [: R Y+ Z! v" r+ ]
B:(1) 创建编译环境,在这个过程中,将设置一些环境变量,创建安装目录,安装内核源代码和头文件等。8 r/ l* z& s4 I. S/ M
3 X6 `3 L9 b& |- e, @2 n
(2) 创建binutils.在这个过程结束后,会创建类似arm-linux-ld等工具。
8 R* k6 ^% o0 Z! F/ T+ J
6 K% Z6 c+ y4 y(3) 创建一个交叉编译版本的gcc,注意:在这个过程中,只能编译c程序,而不能编译c++程序。
6 z/ C; R6 `* k+ \4 B
" \- v0 d! V0 M' p(4) 创建一个交叉编译版本的glibc,这里最容易出问题。% F) E3 u. O$ ]$ [- c5 {
: Y! k# x1 l! F3 O% R* g' f& W
(5) 创建一个交叉编译版本的gdb。这个过程结束后,会创建arm-linux_gdb. H$ `0 O6 p+ l8 T( n6 P
* ^; V- v/ u$ K( B6 x6 y
(6) 重新创建gcc。前面创建gcc的过程没有编译c++编译器,现在glibc已经准备好了,所以这个步骤将完善gcc的交叉编译。6 X7 f' q+ x4 R5 P; V3 ^
& O4 ~6 R( n, f! b$ E, h/ V6 {
(7) 重新创建glibc.
5 O9 a2 z2 j# A" A7 B% K$ U6 n: Y1 l* S+ b
如果在交叉编译过程中出现错误,那么请检查:
/ X0 v% s. J& n3 s1 o1 M3 ^+ c
: ^( s, [8 l1 N8 h版本选择是否正确,以及是否安装了相应的补丁;
) ^) d0 t6 K' G- }0 B
+ u8 R, {& ]$ [/ r库文件路径设置是否正确;
, `. F# q% U% I( s9 P
( [" ]4 M7 l1 m2 `3 q& t' c Q系统环境变量是否设置正确。 y& W* ] v( t
8 w6 g. G# \7 h第二步:编写bootloader并移植到开发板上* `( S( y4 C/ l @8 d1 \
9 x: i9 l! X3 [4 KA:bootloader(引导加载程序)是系统加电后运行的第一段代码。嵌入式系统中的bootloader相当于pc机中的bios。大多数bootloader都包含两种不同的操作模式,一种是启动加载(bootloading)模式,在这种模式下,bootloader从目标机上的某个固态存储器设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。这种模式是bootloader的正常工作模式,另一种是下载(downloading)模式。在这种模式下,目标机上的bootloader将通过串口或网络等通信手段从开发主机(host)上下载内核映像和根文件系统映像等到RAM中。然后可以再被bootloader写到目标机上的固态存储介质上。
f1 Z0 W) {! g& k1 y) A, t& [1 l1 I* I& k5 ?
B:bootloader启动大多数都分为两个阶段+ |. l0 x5 _( L
7 d7 D6 K- f! b/ J! X(1):基本的硬件初始化(屏蔽所有的中断,关闭处理器内部指令/数据cache等)。3 Z* H9 }1 f- k& S
6 f) D. J; [4 Y6 ^: F3 a
为第二阶段准备RAM空间,如果是从某个固态存储媒质中,则复制bootlodaer的第二阶段代码到RAM。
% ^7 E( c) r. s# x
7 l. ?. i: _, X设置堆栈。/ x4 D: J: U) V8 j1 u7 A) }
# ^, h( F5 s5 f) y; W" M跳转到第二阶段的C程序入口点。' I1 I! D) n* R" F- v& |
# n' V+ k" t$ c, n u/ O(2):初始化本阶段要使用的硬件设备。) \8 ]/ r9 _$ u2 J) Q$ t
7 U# Z* C( g& O% I1 u! v" z检查系统内存映射。
3 D* G& Q5 s4 Q
2 {' G* M2 ]) j% _* x! i将内核映像和根文件系统映像从flash读到RAM。9 e2 c* ~+ t, L0 a; p# ]- a
! e& { j/ f1 {( o/ ]% X8 b+ S为内核设置启动参数调用内核。 & V4 V$ h0 T) y$ W) A4 I J# v
|
|