Upload
montego-vazquez
View
103
Download
0
Embed Size (px)
DESCRIPTION
嵌入式系统设计 实验一. 搭建嵌入式开发环境. designed by 卢坤. 试验一. 目标:在开发板上运行helloworld 嵌入式开发环境 GCC编译器 Makefile bootloader. 一、嵌入式开发环境. 开发工具 交叉编译工具链的安装 gcc binutils glibc 等等 开发环境 宿主机和目标机的互联 互联手段:JTAG,RS232,网线. 二、开发工具--交叉编译环境. 编辑、编译和链接工具. 头文件. 交叉编译环境. 库文件. 帮助文档. 二、开发工具--交叉编译环境. 为什么要交叉编译环境? - PowerPoint PPT Presentation
Citation preview
嵌入式系统设计 实验一
designed by 卢坤
搭建嵌入式开发环境
试验一
目标:在开发板上运行 helloworld
一.嵌入式开发环境二.GCC编译器三.Makefile
四.bootloader
一、嵌入式开发环境
开发工具交叉编译工具链的安装
gcc binutils glibc等等
开发环境宿主机和目标机的互联互联手段: JTAG, RS232,网线
二、开发工具 -- 交叉编译环境
交叉编译环境
编辑、编译和链接工具
头文件
库文件
帮助文档
二、开发工具 -- 交叉编译环境 为什么要交叉编译环境?
指令集( ARM,X86)
交叉编译工具链的安装
开发工具的安装脚本已经写好,只需要执行。./install.sh该命令会自动创建一个名为
/opt/host/armv4l的目录
交叉编译工具链
PATH 环境变量 PATH环境变量
PATH中保存的是一些目录信息,这些目录中的命令 (可执行文件 )可以直接使用,不需要输入全路径。
查看 PATH环境变量 echo $PATH
PATH环境变量的格式
PATH的作用 使用户使用 linux命令更方便
PATH 环境变量 -- 实例
在 /bin下面,有名为 ls的可执行文件。这就是我们平时所用的 ls命令。
为什么平时使用时不需要使用 /bin/ls这样的全路径? 执行 ls命令时,现在 PATH环境变量中指定的目录中的可执行程序,都是可以直接使用的。
一、嵌入式开发环境
开发工具交叉编译工具链的安装
gcc binutils glibc等等
开发环境宿主机和目标机的互联互联手段: JTAG, RS232,网线
两种互联方式
网络拓扑很简单,连接手段的区别
两种连接方式 JTAG
开发板中没有 bootloader时使用 一般情况下可以用来调试程序。 工具:厂家带的 JTAG工具
RS232 开发板中 bootloader可用,或者 开发版中 linux内核是好的,但是网络还没不能用。 工具: minicom(linux)或超级终端 (windows)
网线
串口线
其他的连接方式 NFS
C/S模型 一般情况下
宿主机:服务器 目标机:客户端
FTP C/S模型 一般情况下
宿主机:服务器 目标机:客户端
等等 本质上,只要能传输文件即可。
三、 NFS 服务 NFS服务可以使网络上的 Linux( Uni
x)系统之间共享文件系统。 NFS可以将远程文件系统挂载在本地文件系统下。远程的硬盘、目录和光驱都可以变成本地主机目录树中的一个子目录。挂载成功之后,就可以像使用本机文件系统一样使用远程文件。不只是方便,同时也节省了重复保存文件的空间、传输文件的时间和网络带宽。
三、 NFS 服务 NFS配置步骤
I. 前提:两台主机已经连接以能 ping到对方作为标准 PC和开发板使用的是网线直连,所以要把他们的 IP地址配置成一个网段。
确认网口已经启动,通过 ifconfig命令确认防火墙已经关闭
II.安装 NFS服务 (RedHat系统上默认安装 )III.配置 NFS服务
redhat提供了图形界面
三、 NFS 原理 linux目录树
在 linux启动之初,整个目录树中只有根文件系统,启动的后期会加载一些其他的文件系统 (devfs,sysfs,nfs等等 )
只有在目录树中的文件或目录才是能够访问的。 所以要通过 mount命令把光盘, U盘等 mount到目录树中。 NFS也是一种文件系统 (网络文件系统 network file system)
配置 NFS 服务 主菜单
系统设置服务器设置
NFS服务器 参数含义
目录:指定共享目录主机 IP:选择能访问本地的 IP地址范围读写权限
GCC 介绍 -- 一个小例子
文件名: hello.c
#include <stdio.h>
int main()
{
printf("hello world\n");
}
编译:gcc hello.c
运行:./a.out
GCC 介绍 -- 交叉编译
文件名: hello.c
#include <stdio.h>
int main()
{
printf("hello world\n");
}
编译:armv4l-unknown-linux-gcc hello.c
拷贝 a.out到开发板然后运行:./a.out
动态链接的概念 printf库函数由谁提供?
共享库 编译时是否把 printf的机器码编译到可执行文件中? 动态编译时:否 静态编译时:是
gcc默认是动态编译
进一步理解 hello.c
文件名: hello.c
#include <stdio.h>
int main()
{
printf("hello world\n");
}
std标准库:1.printf是库函数,那么编译时使用的库函数,和运行时使用的库函数是同一个吗?
Makefile
一个自动化编译工具 Makefile规则
一个简单的例子:
target : prerequisitescommand
first: hello.cgcc hello.c -o a.out
clean:rm a.out
Makefile 一个稍微复杂点的例子
pc: hello.cgcc hello.c -o a.out
arm: hello.carmv4l-unknown-linux-gcc hello.c
clean:rm a.out
使用:make pc 编译出来的可执行文件可以再 PC上执行make arm 编译出来的可执行文件能在开发板上执行make clean 删除 a.out可执行文件。
bootloader
在操作系统内核运行之前运行的一段小程序。
在嵌入式世界里, bootloader 严重依赖于硬件。一个通用的 bootloader不现实也没必要。
在试验中 bootloader的名字叫 vivi
bootloader 原理
I. 系统加电复位所有 CPU同行都从某个预定的地址上取指令。
ARM7TDMI 从 0x00000000 取第一条地址 x86 从 0x7C00 取第一条指令
bootloader的第一条指令放在这个预定地址II. bootloader启动:
初始化内存,串口,网口和其他必要的外设 bootloader启动后才能实现和宿主机之间用串口通讯。
通过 bootloader 烧写内核的过程
1.启动开发板2. 进入到 bootloader界面3. 从宿主机下载内核到目标板上4.把内核烧写到目标板上的存储器中
第 3,4步,在我们的试验指导中,实际上是一步操作完成的。
Thank You