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