一、目的
1.1 充分了解开发板软硬件环境,为进一步的软件开发打下坚实的基础
1.2 能够建立主机与目标机(板)之间的传递数据的基本方法
1.3 能够烧写并运行启动代码(bootloader)
1.4 能够下载安装Linux内核到开发板
1.5 能够下载安装根文件夹系统到开发板
1.6 学会使用交叉平台编译器编译自己的程序并能够下载到目标版运行
二、内容
2.1 针对所选择的目标平台,简要介绍其
- 平台简介(主要功能)
Raspberry Pi(中文名为“树莓派”,简写为RPi,(或者RasPi / RPI)是为学 生计算机编程教育而设计,只有信用卡大小的卡片式电脑,其系统基于Linux。随着Windows 10 IoT的发布,我们也将可以用上运行Windows的树莓派。自问世以来,受众多计算机发烧友和创客的追捧,曾经一“派”难求。别看其外表“娇小”,内“心”却很强大,视频、音频等功能通通皆有,可谓是“麻雀虽小,五脏俱全”。
- 执行环境(硬件环境)
Win7系统笔记本电脑,vmware中安装ubuntu,树莓派
- 运行环境(软件环境)
Ubuntu安装交叉编译链,ftp服务器,树莓派安装raspbian系统
2.2 建立host-target连接
2.3 烧写bootloader到目标系统(SD卡)
2.4 下载安装Linux内核到开发板
2.5 构建并测试开发板交叉编译器
三、过程
3.1 树莓派bootloader详解
树莓派的系统启动流程不同于一般的arm cpu,一般的arm芯片都有一个内固的小程序在上电的时候加载bootloader,但是树莓派的BCM2836不同,BCM2836上电的时候首先初始化的是gpu,gpu设置好了系统的主频以及一些外设以后,再转到arm芯片模块的初始化.而树莓派所用的那个gpu是完全不开源的。即bcm2835内部固化了自己的bootloader来进行简单的初始化,相当于一个一级bootloader,而uboot是二级bootloader,直接由一级bootloader加载在内存中运行了,一级bootloader是在rom中,开发者无法修改。
挂载SD卡后,调用我们放在sd卡boot分区里面的bootcode.bin到内存运行,再调用start.elf到内存,然后再启动GPU,GPU运行start.elf的程序,开始一系列的配置。再掉用kernel.img即Linux内核到内存。然后GPU再让这个arm11开始运行,也就是内核启动。
3.2 实验过程
Ubuntu安装git。
建立raspberrypi文件夹。下载交叉编译工具链。
由于笔记本连无线网,两次尝试都在中间连接失败,导致无法下载完全,所以我直接从github下载好tools-master.zip,拷贝至Ubuntu解压安装(后来使用另一台式机使用git clone命令成功下载完tools)。
修改配置文件,将编译器所在地址加入环境变量中。
使用arm-linux-gnueabihf-gcc -v命令测试是否安装成功或配置成功。
使用source .bashrc命令来让配置立即生效。
由于树莓派本身固化了一级bootloader,我在网上未找到树莓派的单独的文件系统,加上烧写树莓牌bootloader资料偏少且本周部门去外地开年会个人时间较少,在这里直接将raspbian系统镜像烧至sd卡中。
系统启动之后,通过ssh来连接树莓派,成功。
编写一个简单的C程序,打印helloworld并测试浮点数功能。
交叉编译helloworld.c并连接到树莓派。
Ubuntu下安装ftp服务器,常用的是vsftpd。在这里搭建好ftp后,put命令拷贝到树莓派时出现一系列问题,导致没有成功。这里我也有个疑问,树莓派为什么不用安装ftp?ftp连接到树莓派再执行put,感觉方向是反的,网上搜索也并没得到相关答案,这一点我也将继续搞明白。所以,目前采用的方法是在win7下使用FileZilla这款ftp工具讲编译好的程序拷贝至树莓派中。
执行helloworld提示没有权限,修改权限后执行成功,结果正常,表明交叉编译链正常。