zoukankan      html  css  js  c++  java
  • Linux用于嵌入式

      步骤1:Linux工具和项目布局

      每个嵌入式软件设计都从选择合适的工具开始。

      工具链是一组连接(或链接)在一起的软件开发工具,它包含诸如GNU编译器集合(GCC)、binutils(一组包括连接器、汇编器和其它用于目标文件和档案工具的开发工具)和glibc(提供系统调用和基本函数的C函数库)等组件;在某些情况下,还可能包括编译器和调试器等其它工具。

      用于嵌入式开发的工具链是一个交叉工具链,更常见的叫法是交叉编译器。

      GNUBinutils是嵌入式Linux工具链的第一个组件。GNUBinutils包含两款重要工具:

      ●“as”,汇编器,将汇编代码(GCC所生成)转换成二进制代码

      ●“ld”,连接器,将离散目标代码段连接到库或形成可执行文件

      编译器是工具链的第二个重要组成部分。在嵌入式Linux,它被称为GCC,支持许多种微控制器和处理器架构。

      接下来是C函数库。它实现Linux的传统POSIX应用编程接口(API),该API可被用来开发用户空间应用。它通过系统调用与内核对接,并提供高阶服务。

      工程师有几种C函数库选择:

      ●glibc是开源GNU项目提供的可用C函数库。该库是全功能、可移植的,它符合Linux标准。

      ●嵌入式GLIBC(EGLIBC)是一款针对嵌入式系统优化的衍生版。其代码是精简的,支持交叉编译和交叉测试,其源代码和二进制代码与GLIBC的兼容。

      ●uClibc是另一款C函数库,可在闪存空间有限、和/或内存占用必须最小的情况下使用。

      调试器通常也是工具链的一部分,因为在目标机上调试应用程序运行时,需要一个交叉调试器。在嵌入式Linux领域,GDB是常用调试器。

      上述工具是如此地不可或缺,但当它们各自为战时,会花太长时间来编译Linux源代码并将其整合成最终映像(image)。幸运的是,Buildroot(自动生成交叉编译工具的工具)会自动完成构建一个完整嵌入式系统的过程,并通过产生下述任一或所有任务,简化了交叉编译:

      ●交叉编译工具链

      ●根文件系统

      ●内核映像

      ●引导映像

      对嵌入式系统设计师来说,还可以方便地使用一种工具(utility)聚合工具,如BusyBox,这种工具将通常最需要的工具整合在一起。根据 BusyBox的信息页面介绍,“它将许多常用UNIX工具的微型版本整合成一个小的可执行文件。它提供了对大多数你通常会在GNUfileutils和 shellutils等工具中看到的工具的替代。BusyBox里的工具通常比其全功能GNU对应版本的选择少;但所包含选项所提供的预期功能和行为则与对应的GNU所提供的几无差别。对任何小或嵌入式系统来说,BusyBox提供的环境都是相当完整的。”

      最后一个重要工具是一款BSP,是为搭载了项目目标MCU或处理器的主板专门做的。

      BSP包括预先配置的工具,以及将操作系统加载到主板的引导加载程序。它还为内核和器件驱动器提供源代码(见图1)。

      步骤2:引导序列、时钟系统、存储器和串行接口

      典型的嵌入式Linux启动顺序执行如下:

      1)引导加载程序固件(示例项目里的U-Boot)运行于目标MCU内置闪存(无需外部存储器),并在上电/复位后,执行所有必需的初始化工作,包括设置串口和用于外部存储器(RAM)访问的存储器控制器。

      2)U-Boot可将Linux映像从外部Flash转移到外部RAM,并将控制交接到RAM中的内核入口点。可压缩Linux映像以节省闪存空间,代价是在启动时要付出解压缩时间。

      3)Linux进行引导并安装基于RAM的文件系统(initramfs)作为根文件系统。在项目构建时,Initramfs被填充以所需的文件和目录,然后被简单地链接到内核。

      4)在Linux内核下,执行/sbin/init。/sbin/init程序按照/etc/inittab中配置文件的描述对系统进行初始化。

      5)一旦初始化进程完成运行级执行和/sbin/init里的命令,它会启动一个登录进程。

      6)壳初始化文件/etc/profile的执行,标志着启动过程的完成。

      通过使能就地执行(ExecuteInPlace——XIP)可以显著缩短启动时间、提升整体性能,XIP是从闪存执行代码的方法。通常,Linux代码是从闪存加载到外部存储器,然后从外部存储器执行。通过从闪存执行,因不再需复制这步,从而只需较少的存储器,且只读存储器不再占程序空间。

  • 相关阅读:
    BNUOJ 12756 Social Holidaying(二分匹配)
    HDU 1114 Piggy-Bank(完全背包)
    HDU 2844 Coins (多重背包)
    HDU 2602 Bone Collector(01背包)
    HDU 1171 Big Event in HDU(01背包)
    HDU 2571 命运 (入门dp)
    HDU 1069 Monkey and Banana(最长递减子序列)
    HDU 1160 FatMouse's Speed (最长上升子序列)
    HDU 2594 KMP
    POJ 3783 Balls --扔鸡蛋问题 经典DP
  • 原文地址:https://www.cnblogs.com/linuxx/p/8065083.html
Copyright © 2011-2022 走看看