280 likes | 405 Views
嵌入式系统设计 实验一. 搭建嵌入式开发环境. designed by 卢坤. 试验一. 目标:在开发板上运行helloworld 嵌入式开发环境 GCC编译器 Makefile bootloader. 一、嵌入式开发环境. 开发工具 交叉编译工具链的安装 gcc binutils glibc 等等 开发环境 宿主机和目标机的互联 互联手段:JTAG,RS232,网线. 二、开发工具--交叉编译环境. 编辑、编译和链接工具. 头文件. 交叉编译环境. 库文件. 帮助文档. 二、开发工具--交叉编译环境. 为什么要交叉编译环境?
E N D
嵌入式系统设计 实验一 搭建嵌入式开发环境 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(Unix)系统之间共享文件系统。 • NFS可以将远程文件系统挂载在本地文件系统下。远程的硬盘、目录和光驱都可以变成本地主机目录树中的一个子目录。挂载成功之后,就可以像使用本机文件系统一样使用远程文件。不只是方便,同时也节省了重复保存文件的空间、传输文件的时间和网络带宽。
三、NFS服务 • NFS配置步骤 • 前提:两台主机已经连接 • 以能ping到对方作为标准 • PC和开发板使用的是网线直连,所以要把他们的IP地址配置成一个网段。 • 确认网口已经启动,通过ifconfig命令 • 确认防火墙已经关闭 • 安装NFS服务(RedHat系统上默认安装) • 配置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 : prerequisites command first: hello.c gcc hello.c -o a.out clean: rm a.out
Makefile 一个稍微复杂点的例子 pc: hello.c gcc hello.c -o a.out arm: hello.c armv4l-unknown-linux-gcc hello.c clean: rm a.out 使用: make pc 编译出来的可执行文件可以再PC上执行 make arm 编译出来的可执行文件能在开发板上执行 make clean 删除a.out可执行文件。
bootloader • 在操作系统内核运行之前运行的一段小程序。 • 在嵌入式世界里,bootloader严重依赖于硬件。一个通用的bootloader不现实也没必要。 • 在试验中bootloader的名字叫vivi
bootloader原理 • 系统加电复位 • 所有CPU同行都从某个预定的地址上取指令。 • ARM7TDMI从0x00000000取第一条地址 • x86从0x7C00取第一条指令 • bootloader的第一条指令放在这个预定地址 • bootloader启动: • 初始化内存,串口,网口和其他必要的外设 • bootloader启动后才能实现和宿主机之间用串口通讯。
通过bootloader烧写内核的过程 • 启动开发板 • 进入到bootloader界面 • 从宿主机下载内核到目标板上 • 把内核烧写到目标板上的存储器中 • 第3,4步,在我们的试验指导中,实际上是一步操作完成的。