精华内容
下载资源
问答
  • 交叉开发环境是嵌入式Linux开发的基础.后续的开发过程几乎都是基于此环境的。而ARM作为一种高性能、低成本的...本文内容包括基于32位ARM920T核“GEC2410”开发板的硬件结构和嵌入式Linux交叉开发环境概念和配置。
  • 第4章 交叉开发环境 本章内容包括嵌入式交叉开发环境概念和配置以及应用程序交叉开发和调试的方法交叉开发环境是嵌入式Linux开发的基础后续的开发过程几乎都是基于交叉开发环境的因此理解和掌握本章内容会大大方便...
  • 本文内容包括基于32位ARM920T核“GEC2410”开发板的硬件结构和嵌入式Linux交叉开发环境概念和配置.开发工具的使用以及交叉调试器制作的方法。利用虚拟机在Windows操作系统下,为“GEC2410”开发板搭建了一个...
  • 本文内容包括基于32位ARM920T核“GEC2410”开发板的硬件结构和嵌入式Linux交叉开发环境概念和配置.开发工具的使用以及交叉调试器制作的方法。利用虚拟机在Windows操作系统下,为“GEC2410”开发板搭建了一个...
  • 电子科技大学嵌入式软件工程中心 交叉开发环境的建立 电子科技大学嵌入式软件工程中心 目的 理解嵌入式应用程序交叉开发的概念 掌握嵌入式应用程序交叉开发环境的建 立过程 掌握宿主机与目标机之间的连接方式 掌握...
  • 在众多的嵌入式操作系统中,许多开发人员都选择Hnux,主要是因为它是源码公开而且是免费的,可以让任何人将其修改移植到自己的目标平台系统里使用。系统可以通过配置内核,动态地加载和卸载内核模块机制,可以方便地...

    目前,随着ARM技术的日益成熟和广泛应用,基于ARM核的微处理器已经成为嵌入式市场的主流。而建立面向ARM构架的嵌入式操作系统也就成为当前研究的热点问题.在众多的嵌入式操作系统中,许多开发人员都选择Hnux,主要是因为它是源码公开而且是免费的,可以让任何人将其修改移植到自己的目标平台系统里使用。系统可以通过配置内核,动态地加载和卸载内核模块机制,可以方便地在内核中添加新的组件或卸载不再需要的内核组件。

    本文介绍了如何在Windows操作系统下利用Linux虚拟机、针对32位ARM920T内核的$3C2410微处理器实现嵌入式LintLx应用软件的交叉开发环境,提出了一个比较完整的解决方案,并成功地为GEC2410开发板搭建了一个嵌入式应用软件开发环境。

    1 GECMlO开发板硬件构成

    ARM处理器是一种支持16/32位双指令集的高性能、低成本、低功耗的R ISC微处理器,目前已经占领了75%以I:的32位RISC嵌入式产品f仃场。本文所选用的ARM920T微处理器属于中端产品,应用也十分广泛。$3C2410是32位低功耗RISC宏单元,其工作频率为203 MHz,同时支持Thumbl6位精。简指令集,从而能以较小的存储空间需求,获得32位的系统性能。64M字节的SDRAM,由两片K4S561632组成,工作在32位模式下;64M字节NAND Flash,采用的是K9F1208,可以兼容16M,32M或128M字节;10M以太网接口,采用的是CS8900Q3,带传输和连接指示灯;2路UART串行口,波特率可高达115200bps,并具有RS232电乎转换电路Embedded·ICE(20脚标准JTAG)接口和并口式jTAG接口,支持ADS,SDT软件的卜.载和调试以及FLASH的烧写。

    2 嵌入式Linux开发环境的搭建及开发工具的使用

    2.1宿主机——目标机模式

    进行项目开发前,先要做的是搭建一套基于Linux操作系统的应用开发环境,一般由目标板(GEC2410开发板)和宿主机(LiUUX虚拟机)所构成。如图1所示。嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件平台上编写软件比较困难,有时候甚拿是不可能的.目前一般采用的解决办法是首先在通用计算机上编写程序,然后通过交叉编译生成目标平台七可以运行的二进制代码格式,最后再下载到目标平台上的特定位置.卜运行.用来编译这种程序的编译器就叫交叉编译器。为了不跟本地编译器混淆,交叉编泽器的名字一般都有前缀。例如:arm.1inux—gcc。交叉开发环境是指编译、链接和调试嵌入式应用软件的环境,它与运行嵌入式应用软件的环境有所不同,通常采用宿主机/目标机模式。

    交叉开发环境

    2.2 Linux服务器交叉编译环境的建立

    Linux服务器是嵌入式Linux内核编译、应用程序开发、编译等的公共平台,在一个嵌入式系统的开发过程中,有许多工作需要通过它来完成。交叉编译工具用于编译在目标系统上运行的嵌入式Linux内核及应用程序,包括编译器、连接器、调试器以及代码转换J二具等实用程序,一般以瓜缩软件包的方式提供给我们,称为开发工具链(Toolchain).目前基于ARM架构的交叉编泽工具链为:allll-liuux.gcc-2.95.3。

    1)GNU交叉工具链的下载

    从ARM官方网站F载删.arm.tinux.org.ak,可以从该站点下载2.95.3工具链:

    ftp://tip.arm.Iinux.org.uk/pub/armlinux/toolehain/cross-2.95.3.tar.bz2

    2)cross-2.95.3.tar.bz2包的安装步骤

    a.#mkdir/mr/local/arm;

    b.#cp CROSS一2.95.3.tar.bz2/usr/local/ann;

    C.#tar jxvf crog$一2.95.3.tar.bz2;

    d.添加环境变量:在文{牛/ete/bashrc文件最后添加:

    export PATH=/usr/local/arm/2.95.3/bin:$PATH:

    e.工具链安装完成。

    2.3配置NFS服务的步骤

    NFS服务就是将宿主机的一个目录通过网络可以被挂载到其他计算机上。并且作为其他计算机的一个目录,其目的就是让不同的机器、不同的操作系统之间可以彼此共享文件。

    NFS的使用分服务器端和客户端,其中服务器端提供要共享的文件,客户端通过挂载“mount”这一动作实现对共享文件的访问操作。下面主要介绍GEC24 10开发板的Linux系统与虚拟机的LintLx通过NFS实现文件共享的方法与步骤:

    1)在虚拟机linux配置nfs服务,编辑nfs配置文件/etdexports,设置共享目录如:vi/etc/exports,添加:/root/nfs—share·(rw,sync,no—root—squash)。rW表示允许下位机读写该目录,no_root_squash允许下位机以主机root用户身份挂载根文件系统。

    2)在虚拟机linux启动NFS服务:(修改配置文件后就需要蕈新启动施服务)#/etc/init.d/nfs reSTart或者用命令:#service nfs restarto.

    3)防火墙的关闭。选择系统设置一>安全级别,将安全级别改为“无防火墙”。

    4)用交叉网线连接PC机(虚拟机)与开发板,目的让两个linux处在同一个网络内。

    开发板的ip地址是:192.168.2.223,因此配置虚拟机ip为192.168.2开头的ip地址,如可用下列命令配置:#ifcONfigethO 192.168.2.23。

    5)在开发板linux系统中挂载虚拟机linux的NFS共享目录,执行下列命令:#mkdir/tmp/nfs#mount—t nfs一0 nolock192.168.2.23:/root/nfs—share/trap/nfs。

    2.4交叉调试器的制作

    2.4.1交叉调试器的结构

    程序的调试足检杏程序正确性、可靠性、稳定性的重要手段,也是应用程序开发必不可少的组成部分。嵌入式软件开发过程中的交叉调试与本地软件开发过程中的调试方式有所差别。本地软件开发调试器与被调试的程序往往运行在同一台计算机}:。而嵌入式软件开发过程中,调试时采用的是在宿主机和目标机之间进行的交叉调试。调试器运行在宿主机,但被调试的进程却是运行在目标板。调试器和被调试进程通过串口或者网络进行通信,调试器可以控制、访问被调试进程,读取被调试进程的当前状态,并能够改变被调试进程的运行状态。

    2.4.2制作交叉调试器的方法

    1)解压源码包:tar zxf gdb一6.0.tar.gz

    2)配置:cd gdb一6.0

    mkdir build..arm..1inux

    cd build..arm..1inux

    ../configure--target=arm·linux一一prefix=/usr/local/arm/2.95.3/

    3)编译:make

    4)安装:make install

    在/usr/locaL/arm/2.95.3/bin/目录下生成alTfl-linuxgdb工具

    5)编译生成针对f1.Eln处理器的gdbserver

    a.进入sdb源代码包中的gdb$erver目录

    cd sdb-6.0

    cd gdb/gdbserver

    b.配置生成gdbserver

    chmod U+X configure

    CC=arnl—linux—gcc./configure一一host=arm-linux

    c.Make,生成gdbserver、gdbreplay

    6)通过凼,将gdbserver/gdbreplay到目标板中

    7)启动目标板上的gdbserversabserver 192.168.1.88:2345 cross-teat其中192.168.1.88是目标板的IP地址。2345是任意指定的端口,也可以是其他端口。

    8)启动宿主机端arm.1inux-gdb调试器在宿主机的工作目录中有对应的程序和源文件

    #arm·hnux-柚CI'OS8一teat

    (gdb)target remote 192.168.1.88:2345

    连接远程gdbserver

    (sab)b main

    设置断点

    (Sdb)C运行

    3 结束语

    本文在分析了GEC2410开发板和Linux的特点的基础上,介绍了嵌入式Linux开发平台的搭建过程,并详细介绍了配置NFS服务和制作交叉调试器的方法和步骤。这样就可以在此基础上进行各种驱动程序和应用程序的开发。

    展开全文
  • 0 由来在我的博文 GNU ARM交叉汇编环境的搭建与测试中,详细讲解了GNU ARM汇编环境的创建与使用方法。实际开发中,直接使用汇编语言写的代码往往很少,尽在系统启动和性能要求极其苛刻的时候才会用到汇编代码。在...

    0 由来

    在我的博文 GNU ARM交叉汇编环境的搭建与测试中,详细讲解了GNU ARM汇编环境的创建与使用方法。实际开发中,直接使用汇编语言写的代码往往很少,尽在系统启动和性能要求极其苛刻的时候才会用到汇编代码。在可读性、可移植性、逻辑表达能力方面,C语言的表现要比汇编强太多,正是C语言的这种优势造就了Unix世界,造就了Linux在多种平台上顺利编译运行的活泼场面。

    所以,在嵌入式开发领域,C语言是主力语言。在使用开发ARM上运行的程序之前,必须构建一个好用的C交叉编译环境。在博文Freestanding C与交叉编译器的生成原理分析中,阐述了Freestanding C的概念和交叉编译器构建的原理。构建一个完整的Hosted C交叉编译器是一个相当复杂的过程,尤其是对于GCC来说,这个过程更是充满艰难险阻。为了避免初学者受挫,我们从简单开始,先构建一个Freestanding 的C交叉编译器,然后写一个具体的C项目来测试。

    1 Freestanding C的构建

    GCC项目主要有两大功能,一是提供C,C++,Fortran等多种语言的前端(front end)编译器,也就是负责把高级语言代码翻译成汇编代码;二是作为整个开发环境的总入口,负责调用其他汇编、链接工具,来控制整个编译–>汇编–>链接过程。可见GCC本身并不能独立工作,必须依赖于外部提供的汇编、链接等工具,而提供这些外部工具的最著名软件就是binutils。

    虽说理论上gcc和binutils的安装没有先后的必要性,但实际上gcc编译的过程中,需要运行binutils提供的工具来进行测试,并根据测试结果来动态控制自身源码编译。故binutils必须先安装,之后才能编译安装gcc。

    1.1 使用binutils构建交叉汇编环境

    binutils的编译安装详见 GNU ARM交叉汇编环境的搭建与测试,本文不再重复表述。为便于参考,只给出binutils的配置命令:

    ../binutils-2.27/configure --prefix=/home/smstong/ARM --target=arm-linux-gnueabihf

    后面配置GCC时,需要提供与之完全一致的配置参数才行。

    1.2 使用GCC构建Freestanding C交叉编译环境

    1.2.1官网下载GCC最新源码包

    GCC的官网主页是http://www.gnu.org/software/gcc,这是GCC的大本营,也是整个GNU的核心部件。
    截至今天(2016年12月13日)GCC的官方最新版本为gcc-6.2.0,下载的软件包名为gcc-6.2.0.tar.bz2。解压后得到文件夹gcc-6.2.0。
    然后,进入gcc-6.2.0文件夹,执行./contrib/download_prerequisites脚本,这个脚本会自动下载编译GCC必须的库isl,mpc,gmp,mpfr等。不知道为啥GCC供下载的源码包里不直接附带这几个软件包,还非得让用户重新下载它。

    其他的常规编译环境:本地GCC,GNU make,perl,awk,bash等等,就不在这里啰嗦了,一般的用于开发的Linux主机上都已经安装好了这些基本的开发环境。

    1.2.2 配置安装

    GCC项目也是使用GNU autotools 管理编译过程的,所以生成它第一步必须是执行configure命令。与binutils一样,gcc也建议把构建目录和源码目录分离,所以新建一个目录名为 build-gcc,然后进入这个目录进行整个构建过程。

    mkdir build-gcc
    cd build-gcc
    ../gcc-6.2.0/configure --prefix=/home/smstong/ARM         # 要与binutils配置时相同
                             --target=arm-linux-gnueabihf     # 要与binutils配置时相同
                             --enable-languages=c             # 只生成C编译器
                             --without-headers                # 不使用头文件
                             --disable-multilib               # 不生成多个库版本
    make all-gcc            # 注意此处的目标是all-gcc,也就是freestanding C
    make install-gcc        # 相应的安装的也只是GCC

    安装完成以后,会发现新生成的交叉编译器 /home/smstong/ARM/bin/arm-linux-gnueabihf-gcc,同时还有一个硬链接在/home/smstong/ARM/arm-linux-gnueabihf/bin/gcc。执行如下命令测试:

    [smstong@centos192 bin]$ ./arm-linux-gnueabihf-gcc -v
    使用内建 specs。
    COLLECT_GCC=./arm-linux-gnueabihf-gcc
    COLLECT_LTO_WRAPPER=/home/smstong/ARM/libexec/gcc/arm-linux-gnueabihf/6.2.0/lto-wrapper
    目标:arm-linux-gnueabihf
    配置为:../gcc-6.2.0/configure --prefix=/home/smstong/ARM/ --target=arm-linux-gnueabihf --enable-languages=c --without-headers --disable-multilib
    线程模型:posix
    gcc 版本 6.2.0 (GCC)
    

    2 测试环境

    目标机器环境:
    (1)硬件平台TQ2440开发板,Soc CPU为三星2440, ARM920T核心。
    (2)Norflash装有u-boot,可以通过tfgtp下载程序到指定物理内存地址并执行
    (3)Nandflash装有Linux2.6系统,带有tftp客户端工具。
    开发主机:
    (1)Centos 7 PC机器
    (2)装有tftp server,服务目录为/var/www/tftpboot/。

    3 裸机环境下C程序测试实例

    2.1 项目源码

    源码文件结构:

    .
    ├── Makefile
    ├── test.c
    ├── test.lds
    └── test.s
    

    test.c

    #define rGPBCON (*(volatile unsigned*)0x56000010)
    #define rGPBDAT (*(volatile unsigned*)0x56000014)
    #define rGPBUP  (*(volatile unsigned*)0x56000018)
    
    void init()
    {
        /* 初始化led1 */
        rGPBCON &= ~(3<<10);
        rGPBCON |= (1<<10);
        rGPBUP &= ~(1<<5);
    
        /* 熄灭led1 */
        rGPBDAT |= (1<<5);
        return;
    }
    

    test.lds

    ENTRY(init)
    SECTIONS {
        . = 0x30000000;
        .text : {
            *(.text)
            *(.rodata)
        }
        .data ALIGN(4): {
            *(.data)
        }
        .bss ALIGN(4): {
            *(.bss)
        }
    }
    

    Makefile

    CC = arm-linux-gnueabihf-gcc
    LD = arm-linux-gnueabihf-ld
    OBJCPY = arm-linux-gnueabihf-objcopy
    
    all: test.bin
        sudo cp test.bin /var/lib/tftpboot/
    test.bin: test
        $(OBJCPY) -O binary $< $@
    
    test: test.o
        $(LD) --script=test.lds -o $@ $<
    
    test.o: test.c
        $(CC) -c $<
    .PHONY: clean
    clean:
        rm -rf *.o test test.bin
    

    2.2 编译链接说明

    交叉连接器默认的入口点名称为_start,默认的代码段基地址为0x00001074,生成的可执行文件格式为elf。而我们要想让程序在裸机上运行,需要代码段基地址为0x30000000,文件格式为纯二进制镜像。这都可以通过链接脚本轻松完成。另外我们还手动指定了程序入口点为init函数。

    通过Norflash里的u-boot把生成的test.bin加载到物理内存0x30000000处并执行,会发现LED1灯被熄灭。而且执行完成后自动返回到了u-boot中。因为init()函数的最后是return语句。

    2.3 看看编译器生成的汇编代码

    使用gcc test.c -c 时,gcc会把中间产生的汇编代码文件隐藏,为了看到这个中间文件,需要通过-S选项调用gcc来生成汇编代码文件。

    arm-linux-gnueabihf-gcc -S test.c

    上述命令会生成test.s文件如下:

        .eabi_attribute 18, 4
        .file   "test.c"
        .text
        .align  2
        .global init
        .syntax unified
        .arm
        .fpu softvfp
        .type   init, %function
    init:
        @ args = 0, pretend = 0, frame = 0
        @ frame_needed = 1, uses_anonymous_args = 0
        @ link register save eliminated.
        str fp, [sp, #-4]!
        add fp, sp, #0
        ldr r2, .L2
        ldr r3, .L2
        ldr r3, [r3]
        bic r3, r3, #3072
        str r3, [r2]
        ldr r2, .L2
        ldr r3, .L2
        ldr r3, [r3]
        orr r3, r3, #1024
        str r3, [r2]
        ldr r2, .L2+4
        ldr r3, .L2+4
        ldr r3, [r3]
        bic r3, r3, #32
        str r3, [r2]
        ldr r2, .L2+8
        ldr r3, .L2+8
        ldr r3, [r3]
        orr r3, r3, #32
        str r3, [r2]
        nop
        sub sp, fp, #0
        @ sp needed
        ldr fp, [sp], #4
        bx  lr
    .L3:
        .align  2
    .L2:
        .word   1442840592
        .word   1442840600
        .word   1442840596
        .size   init, .-init
        .ident  "GCC: (GNU) 6.2.0"
        .section    .note.GNU-stack,"",%progbits
    

    通过gcc生成的汇编代码,我们也可以学习GNU ARM汇编的基本语法。

    4 Linux环境下Freestanding C程序测试实例

    由于是Freestanding C环境,所以即使在Linux系统下,仍然没有可用的标准C库。而C语言又不能直接执行软中断指令调用Linux的系统调用,这就导致操作系统提供的API完全不可用!(汇编语言反而可以直接通过swi指令来调用系统API)可见在操作系统下,如果没有C库,C语言根本无法对硬件进行操作,也就不可能操控开发板上的LED灯,甚至也不能打印简单的hello world,这是何等的悲哀!

    为了便于测试,我们不得不借助汇编的帮助,采用C语言和汇编语言混合编程的方式。其中汇编语言提供一个打印字符串的函数和一个退出进程的函数,C语言调用之。
    其实这就相当于自己用汇编语言实现了一个超级简化的POSIX系统调用C库。
    C语言和汇编进行彼此调用,就必须要遵守相应的函数调用规范,及APCS(ARM Process Call Standard),请大家自行学习之。

    4.1 项目源码

    项目文件结构图:

    .
    ├── api.h         # api 头文件说明
    ├── api.s         # api 实现
    ├── Makefile      
    ├── test.c
    └── test.lds     # 链接脚本,指示程序入口
    

    文件 api.h

    void print(int fd, char* msg, int len);
    int exit(int code);

    文件api.s

    /*
       void print(int fd, char* msg, int len);
       int exit(int code);
    
     */
    
    .text
    .global print
    .global exit
    print:
        swi #0x900004
        mov pc,lr
    
    exit:
        swi #0x900001
        mov pc,lr
    ~
    

    文件test.c

    #include "api.h"
    
    void test()
    {
        char* msg = "hello, freestanding C\n";
        int i;
        for (i = 0; i < 10; i++) {
            print(1, msg, 22);
        }
        exit(0);
    }
    

    文件test.lds

    ENTRY(test)

    文件Makefile

    CC = arm-linux-gnueabihf-gcc
    AS = arm-linux-gnueabihf-as
    LD = arm-linux-gnueabihf-ld
    OBJCPY = arm-linux-gnueabihf-objcopy
    
    all: test
        sudo cp test /var/lib/tftpboot/
    test: test.o api.o
        $(LD) --script=test.lds -o $@ $^
    
    test.o: test.c api.h
        $(CC) -c $<
    
    api.o: api.s
        $(AS) -o $@ $<
    
    .PHONY: clean
    clean:
        rm -rf *.o test
    

    4.2 编译链接说明

    交叉链接器默认生成elf格式文件,可以直接被Linux加载执行。应为是Freestanding C,需要在链接脚本中指定程序入口点。

    程序执行结果:

    [root@EmbedSky /]# tftp -g -r test 172.16.35.188
    [root@EmbedSky /]# ./test
    hello, freestanding C
    hello, freestanding C
    hello, freestanding C
    hello, freestanding C
    hello, freestanding C
    hello, freestanding C
    hello, freestanding C
    hello, freestanding C
    hello, freestanding C
    hello, freestanding C
    

    5 对Freestanding C的思考

    在裸机下,Freetanding C尚可以通过指针的方式直接操控部分硬件资源;在OS下,所有硬件资源受到操作系统的保护(通过MMU),Freestanding C根本无法独立操控任何硬件。

    所以在实际的开发中:

    • 如果是裸机项目,C库本来就不可用,Freestanding C是唯一可选C环境,而且能够完美完成任务;
    • 如果是基于OS的项目,那么Freestanding C能力不足,必须要有完整的Hosted C环境才能胜任(当然,也可以自己用汇编写一个小型C库,但是有现成的GLIBC,为啥要重复造轮子呢?)。

    6 小结

    到目前为止,博文 GNU ARM交叉汇编环境的搭建与测试完成了ARM汇编环境的搭建,本文完成了Freestanding C 编译环境的搭建,并给出了详细的步骤和应用实例。

    下一步,就是在这两个环境下多多练习,等熟练了,再开始搭建最终的Hosted C完整开发环境。

    展开全文
  • 主要内容: ...1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。 2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码

    主要内容:

       概念:在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。

    常见的交叉编译例子如下:

    1、在Windows PC上,利用ADS(ARM 开发环境),使用armcc编译器,则可编译出针对ARM CPU的可执行代码。

    2、在Linux PC上,利用arm-linux-gcc编译器,可编译出针对Linux ARM平台的可执行代码。

    3、在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,可编译出针对ARM CPU的可执行代码。

    详细内容:

         请打开连接http://www.embeddedlinux.org.cn/html/xinshourumen/200906/27-616.html

    展开全文
  • 交叉编译详解 一 概念

    万次阅读 多人点赞 2016-10-25 01:00:45
    本文总结了什么是交叉编译链,并介绍了交叉编译链的各个组成部分

    第 1 章 交叉编译简介

    1.1 什么是交叉编译

    对于没有做过嵌入式编程的人,可能不太理解交叉编译的概念,那么什么是交叉编译?它有什么作用?

    在解释什么是交叉编译之前,先要明白什么是本地编译。

    本地编译

    本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译:

    比如,我们在 x86 平台上,编写程序并编译成可执行程序。这种方式下,我们使用 x86 平台上的工具,开发针对 x86 平台本身的可执行程序,这个编译过程称为本地编译。

    交叉编译

    交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序:

    比如,我们在 x86 平台上,编写程序并编译成能运行在 ARM 平台的程序,编译得到的程序在 x86 平台上是不能运行的,必须放到 ARM 平台上才能运行。

    1.2 为什么会有交叉编译

    之所以要有交叉编译,主要原因是:

    • Speed: 目标平台的运行速度往往比主机慢得多,许多专用的嵌入式硬件被设计为低成本和低功耗,没有太高的性能
    • Capability: 整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存或磁盘空间
    • Availability: 即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得
    • Flexibility: 一个完整的Linux编译环境需要很多支持包,交叉编译使我们不需要花时间将各种支持包移植到目标板上

    1.3 为什么交叉编译比较困难

    交叉编译的困难点在于两个方面:

    不同的体系架构拥有不同的机器特性

    • Word size: 是64位还是32位系统
    • Endianness: 是大端还是小端系统
    • Alignment: 是否必修按照4字节对齐方式进行访问
    • Default signedness: 默认数据类型是有符号还是无符号
    • NOMMU: 是否支持MMU

    交叉编译时的主机环境与目标环境不同

    • Configuration issues:
    • HOSTCC vs TARGETCC:
    • Toolchain Leaks:
    • Libraries:
    • Testing:

    详细的对比可以参看这篇文章,已经写的很详细了,在这就不细说了:Introduction to cross-compiling for Linux

    第 2 章 交叉编译链

    2.1 什么是交叉编译链

    明白了什么是交叉编译,那我们来看看什么是交叉编译链。

    首先编译过程是按照不同的子功能,依照先后顺序组成的一个复杂的流程,如下图:

    编译流程

    那么编译过程包括了预处理、编译、汇编、链接等功能。既然有不同的子功能,那每个子功能都是一个单独的工具来实现,它们合在一起形成了一个完整的工具集。

    同时编译过程又是一个有先后顺序的流程,它必然牵涉到工具的使用顺序,每个工具按照先后关系串联在一起,这就形成了一个链式结构。

    因此,交叉编译链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。同时,它隐藏了预处理、编译、汇编、链接等细节,当我们指定了源文件(.c)时,它会自动按照编译流程调用不同的子工具,自动生成最终的二进制程序映像(.bin)。

    注意:严格意义上来说,交叉编译器,只是指交叉编译的gcc,但是实际上为了方便,我们常说的交叉编译器就是交叉工具链。本文对这两个概念不加以区分,都是指编译链

    2.2 交叉编译链的命名规则

    我们使用交叉编译链时,常常会看到这样的名字:

    arm-none-linux-gnueabi-gcc
    arm-cortex_a8-linux-gnueabi-gcc
    mips-malta-linux-gnu-gcc
    

    其中,对应的前缀为:

    arm-none-linux-gnueabi-
    arm-cortex_a8-linux-gnueabi-
    mips-malta-linux-gnu-
    

    这些交叉编译链的命名规则似乎是通用的,有一定的规则:

    arch-core-kernel-system
    
    • arch: 用于哪个目标平台。
    • core: 使用的是哪个CPU Core,如Cortex A8,但是这一组命名好像比较灵活,在其它厂家提供的交叉编译链中,有以厂家名称命名的,也有以开发板命名的,或者直接是none或cross的。
    • kernel: 所运行的OS,见过的有Linux,uclinux,bare(无OS)。
    • systen:交叉编译链所选择的库函数和目标映像的规范,如gnu,gnueabi等。其中gnu等价于glibc+oabi;gnueabi等价于glibc+eabi。

    注意:这个规则是一个猜测,并没有在哪份官方资料上看到过。而且有些编译链的命名确实没有按照这个规则,也不清楚这是不是历史原因造成的。如果有谁在资料上见到过此规则的详细描述,欢迎指出错误。

    第 3 章 包含的工具

    3.1 Binutils

    Binutils是GNU工具之一,它包括链接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。

    Binutils工具包含的子程序如下:

    • ld GNU连接器the GNU linker.
    • as GNU汇编器the GNU assembler.
    • addr2line 把地址转换成文件名和所在的行数
    • ar A utility for creating, modifying and extracting from archives.
    • c++filt Filter to demangle encoded C++ symbols.
    • dlltool Creates files for building and using DLLs.
    • gold A new, faster, ELF only linker, still in beta test.
    • gprof Displays profiling information.
    • nlmconv Converts object code into an NLM.
    • nm Lists symbols from object files.
    • objcopy Copys and translates object files.
    • objdump Displays information from object files.
    • ranlib Generates an index to the contents of an archive.
    • readelf Displays information from any ELF format object file.
    • size Lists the section sizes of an object or archive file.
    • strings Lists printable strings from files.
    • strip Discards symbols

    binutils介绍

    3.2 GCC

    GNU编译器套件,支持C, C++, Java, Ada, Fortran, Objective-C等众多语言。

    3.3 GLibc

    Linux上通常使用的C函数库为glibc。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。

    glibc 各个库作用介绍

    因为嵌入式环境的资源及其紧张,所以现在除了glibc外,还有uClibc和eglibc可以选择,三者的关系可以参见这两篇文章:

    uclibc eglibc glibc之间的区别和联系

    Glibc vs uClibc Differences

    3.4 GDB

    GDB用于调试程序

    第 4 章 如何得到交叉编译链

    既然明白了交叉编译链的功能,那么在针对嵌入式系统开发时,我们需要的交叉编译链从哪儿得到?

    主要有三个方式可以获取

    4.1 下载已经做好的交叉编译链

    使用其他人针对某些CPU平台已经编译好的交叉编译链。我们只需要找到合适的,下载下来使用即可。

    常见的交叉编译链下载地址:

    1. http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/ 下载已经编译好的交叉编译链
    2. http://www.denx.de/en/Software/WebHome 下载已经编译好的交叉编译链
    3. https://launchpad.net/gcc-arm-embedded下载已经编译好的交叉编译链
    4. 一些制作交叉编译链的工具中,包含了已经制作好的交叉编译链,可以直接拿来使用。如crosstool-NG
    5. 如果购买了某个芯片或开发板,一般厂商会提供对应的整套开发软件,其中就包含了交叉编译链。

    厂家提供的工具一般是经过了严格的测试,并打入了一些必要的补丁,所以这种方式往往是最可靠的工具来源。

    4.2 使用工具定制交叉编译链

    使用现存的制作工具,以简化制作交叉编译链这个事情的复杂度。我们只需要了解有哪些工具可以实现,并选个合适的工具,搞懂它的操作步骤即可。

    1. crosstool-NG
    2. Buildroot
    3. Embedded Linux Development Kit (ELDK)

    工具还有很多,各有各的优势和劣势,大家可以慢慢研究,在这就不细说了。

    4.3 从零开始构建交叉编译链

    这个是最困难也最耗时间的,毕竟制作交叉编译链这样的事情,需要对嵌入式的编译原理了解的比较透彻,至少要知道出了问题要往哪个方面去翻阅资料。而且,也是最考耐心和细心的地方,配错一个选项或是一个步骤,都可能出现以前从来没见过的问题,而且这些问题往往还无法和这个选项或步骤直接联系起来。

    当然如果搭建出来,肯定也是收获最大的,至少对于编译的流程和依赖都比较清楚了,细节上的东西可能还需要去翻看相应的协议或标准,但至少骨架会比较清楚。

    详细的搭建过程可以参看后续的文章,这里面有详细的参数和步骤:
    交叉编译详解 二 从零制作交叉编译链

    为了方便大家搭建交叉编译链,我写了一个一键生成的脚本(包括源码下载和自动编译)。如果大家自己一直搭建不成功,不妨试试这个脚本,然后对比下自己的流程是否一致,参数是否有差异,也许能帮大家迈过这个障碍:
    交叉编译详解 三 使用脚本自动生成交叉编译链

    4.4 对比三种构建方式

    项目使用已有交叉编译链自己制作交叉编译链
    安装一般提供压缩包需要自己打包
    源码版本一般使用较老的稳定版本,对于一些新的GCC特性不支持可以使用自己需要的GCC特性的版本
    补丁一般都会打上修复补丁普通开发者很难辨别需要打上哪些补丁,资深开发者可以针对自己的需求合入补丁
    源码溯源可能不清楚源码版本和补丁情况一切都可以定制
    升级一般不会升级可以随时升级
    优化一般已经针对特定CPU特性和性能进行优化一般无法做到比厂家优化的更好,除非自己设计的CPU
    技术支持可以通过FAE进行支持,可能需要收费只能通过社区支持,免费
    可靠性验证已经通过了完善的验证自己验证,肯定没有专业人士验证的齐全

    参考资料

    [1] Introduction to cross-compiling for Linux

    [2] binutils介绍

    [3] glibc 各个库作用介绍

    [4] uclibc eglibc glibc之间的区别和联系

    [5] Glibc vs uClibc Differences

    [6] 交叉编译链下载地址

    展开全文
  • 因此,编译的环境和运行的环境是不一样的,交叉的,即所谓的cross。 比如,我有一个ARM9的开发板,在进行开发时,需要在我的x86的PC上使用交叉编译器来编译我写好的程序代码,而编译出来的程序是放到ARM的CPU上运行...
  • ESP32 Ubuntu开发环境搭建

    千次阅读 2018-12-04 15:56:55
    文章目录在Ubuntu下搭建ESP32开发环境说明开发环境硬件准备ESP32(NodeMCU-32S)NodeMCU-32S 引脚图搭建步骤安装编译依赖工具下载并安装交叉编译工具链配置环境变量下载ESP-IDF源码源码目录说明主要目录说明配置工程...
  • 应用开发环境一般包括cross-toolchain,文件传输或共享的方法等。
  • CentOS 7 搭建交叉编译环境(上)

    千次阅读 2019-11-20 23:11:39
    前段时间由于工作上的需要,需要编译程序在MIPS架构的终端上运行,于是就学习了一下交叉编译相关的一些知识,并尝试自己...交叉编译:所谓的交叉(cross)是一个和本地编译相对应的概念,即在当前目标平台下编译出...
  • 交叉编译的基本概念

    千次阅读 2010-02-26 10:00:00
    在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说, 就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的...
  • codeSourcery交叉编译环境

    千次阅读 2015-07-15 05:18:53
    1.arm-none-linux-gnueabi-gcc下载 ... ...arm-none-linux-gnueabi-gcc是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM系统中所有环节的代码,包括裸机程
  • 深度剖析E680G开发一.所谓的交叉编译环境

    千次阅读 热门讨论 2006-09-12 21:59:00
    所谓的交叉编译环境草木瓜相关资源下载 http://play.younet.com/view.php?tid=1857820060906一、前言 前面文章涵盖的内容对普通人来说应该都比较容易理解和运用,然而这仅仅只能说明你会刚会用罢了,从本文开始,...
  • arm-linux-gcc交叉编译环境搭建

    千次阅读 2019-05-20 15:37:02
    arm-linux-gcc交叉编译环境搭建下载编译工具上传交叉编译工具至ubuntu中 下载编译工具 这里下载arm-linux-gnueabihf-gcc(关于区别:交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别 上传交叉编译...
  • 本文目的:掌握交叉编译概念;学会如何搭建相应的交叉编译环境。 1、交叉编译工具链(cross compilation tool chain) 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序。交叉...
  • 嵌入式学习--------交叉开发(1)

    千次阅读 2019-08-16 11:41:42
    一、交叉开发概念 交叉开发是指在通用电脑上把程序编写、编译、调试好,再下载到嵌入式产品中去运行。 1.大多数嵌入式产品只有运行环境没有开发环境 2.通用PC开发软件更加丰富,环境更加舒适、安全。 二、...
  • 交叉编译(cross-compilation)是指,在某个主机平台上(比如PC上)用交叉编译器... 交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机
  • 什么是集成开发环境 这一篇,来谈一下大数据开发平台的门面,集成开发环境。什么是集成开发环境?顾名思义,就是IDE,哪个码农不知道IDE的,有胆你站出来! 不过IDE这个词也太普通了,在那些大厂玩大数据的同学们...
  • codeSourcery 交叉编译环境搭建

    千次阅读 2018-08-22 10:21:02
    1.arm-none-linux-gnueabi-gcc下载 ...   arm-none-linux-gnueabi-gcc是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉...可用于交叉编译ARM系统中所有环节的代码,包括裸机程序、u-boot、Li...
  • 嵌入式Linux开发前,你可能需要知道这些基本概念 作者之前编写了一系列嵌入式Linux的开发文档: 关注公众号【微联智控】,并回复【嵌入式Linux资料】,可获取以上pdf文档​的下载链接。 当编写到一定程度...
  • 第5章 嵌入式Linux开发环境的搭建;嵌入式交叉编译环境的搭建;Minicom;tftp服务; DHCP服务;busybox;NFS文件系统1 ;NFS文件系统2;Linux启动过程;Bootloader的概念;Bootloader的概念;Bootloader的工作模式一;Bootloader...
  • Android Things专题3 开发环境搭建

    千次阅读 热门讨论 2017-02-27 20:48:51
    文| 谷歌开发技术专家 (GDE) 王玉成 (York Wang)物联网 (IoT) 的应用开发,离不开跟开发板打交道,我们需要配置好开发板的各种环境,...我们今天就以 Raspberry Pi 3 为例,一起来搭建 Android Things 的开发环境
  • S5PV210开发 -- 交叉编译器

    千次阅读 2017-11-07 12:22:13
    交叉编译器我们讲了不少, Hi3516A开发--安装交叉编译器 ...DM368开发 -- 环境搭建 MQTT再学习 -- 交叉编译与移植 LIVE555再学习 -- DM368/Hi3516A 交叉编译 但都未系统的总结一下。 接下来,先讲一下...
  • 交叉编译环境概念在pc平台上装上特定嵌入式开发的编译环境,对于嵌入式开发的源代码,可以用其编译环境在pc平台上编译源代码。 交叉编译时候如何配置连接库的搜索路径 交叉编译的时候不能使用本地(i686机器,即...
  • Windows下NDK开发环境的搭建

    千次阅读 2013-08-01 22:30:43
    Windows下NDK开发环境的搭建   一:什么是NDK? NDK 提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so 和java 应用一起打包成apk。这些工具对开发者的帮助是巨大的。 NDK 集成了...
  • PanGu STM32MP1开发环境搭建

    千次阅读 2019-12-04 20:38:19
    STM32MP1开发环境搭建相关文章1 - 前期准备2 - 交叉工具链2.1 - 安装qt交叉工具链2.2 - 设置环境变量3 - 了解STM32MP1启动3.1 - 启动介质:从什么存储器启动3.2 - 启动流程欢迎加群 相关文章 [PanGu STM32MP1资料...
  • 无意中发现了一个巨牛巨牛的人工智能教程,忍不住分享一下给大家。...这里有一个你可以期待你用来开发 Go 的集成开发环境有哪些特性的列表,从而替代你使用文本编辑器写代码和命令行编译与链接程序的方式。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,844
精华内容 13,137
关键字:

交叉开发环境的概念