zoukankan      html  css  js  c++  java
  • 构建交叉开发环境

    一、目的

    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上电的时候首先初始化的是gpugpu设置好了系统的主频以及一些外设以后,再转到arm芯片模块的初始化.而树莓派所用的那个gpu是完全不开源的。即bcm2835内部固化了自己的bootloader来进行简单的初始化,相当于一个一级bootloader,而uboot是二级bootloader,直接由一级bootloader加载在内存中运行了,一级bootloader是在rom中,开发者无法修改。

        挂载SD卡后,调用我们放在sdboot分区里面的bootcode.bin到内存运行,再调用start.elf到内存,然后再启动GPU,GPU运行start.elf的程序,开始一系列的配置。再掉用kernel.imgLinux内核到内存。然后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命令拷贝到树莓派时出现一系列问题,导致没有成功。这里我也有个疑问,树莓派为什么不用安装ftpftp连接到树莓派再执行put,感觉方向是反的,网上搜索也并没得到相关答案,这一点我也将继续搞明白。所以,目前采用的方法是在win7下使用FileZilla这款ftp工具讲编译好的程序拷贝至树莓派中。

     

    执行helloworld提示没有权限,修改权限后执行成功,结果正常,表明交叉编译链正常。

     

  • 相关阅读:
    AngularJs 键盘事件和鼠标事件
    Linux的net.ipv4.tcp_timestamps参数
    实战:tcp链接rst场景tcpdump分析
    C++ map使用总结
    C++ 11常见功能介绍:auto,decltype,nullptr,for,lambda
    BLOCK层基本概念:bio,request,request_queue
    C: 字符数组中的空去掉
    代码静态分析工具-splint的学习与使用[转]
    代码分析工具splint安装介绍
    gcc/g++ 如何支持c11/c++11标准编译
  • 原文地址:https://www.cnblogs.com/erbing/p/5518840.html
Copyright © 2011-2022 走看看