arm c语言的交叉编译环境ads代码,交叉编译环境的概念以及建立步骤_一起去吃火锅吗的博客-程序员宅基地

技术标签: arm c语言的交叉编译环境ads代码  

什么是交叉编译?

交叉编译(cross-compilation)是指,在某个主机平台上(比如PC上)用交叉编译器编译出可在其他平台上(比如ARM上)运行的代码的过程。

具体:

交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如 C代码)编译(compile)成计算机可以识别和执行的二进制代码。比如,我们在 Windows 平台上,可使用 Visual C++ 开发环境,编写程序并编译成可执行程序。这种方式下,我们使用 PC 平台上的 Windows 工具开发针对 Windows 本身的可执行程序,这种编译过程称为 native compilation,中文可理解为本机编译。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是 16 到 32 MB,而 CPU 的主频大概在 100MHz 到 500MHz 之间。这种情况下,在 ARM 平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilation tool chain)需要很大的存储空间,并需要很强的 CPU 运算能力。为了解决这个问题,交叉编译工具就应运而生了。通过交叉编译工具,我们就可以在 CPU 能力很强、存储控件足够的主机平台上(比如 PC 上)编译出针对其他平台的可执行程序。

要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:

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

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

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

另外,在业界广泛使用嵌入式 Linux 操作系统的今天,大多数交叉编译过程都是在 Linux PC 平台上完成。这时,程序员会在某个运行 Linux 操作系统的 PC 上安装交叉编译工具链,并使用 GNU 提供的开发工具方便地开发和调试嵌入式应用软件。

一步一步的制作arm-linux交叉编译环境

我们使用以下版本的文件为例子建立 arm-linux 交叉编译环境:

编译环境 redhat 7.2 或 8.0

binutils-2.14.tar.gzgcc-core-2.95.3.tar.gzgcc-g++2.95.3.tar.gzglibc-2.2.4.tar.gzglibc-linuxthreads-2.2.4.tar.gzlinux-2.4.21.tar.gzpatch-2.4.21-rmk1.gz # linux kernel patch for arm我们在 bash 下工作,先设定一些变量:

$ export VBINUTILS=2.14

$ export VGCC=2.95.3

$ export VGLIBC=2.2.4

$ export VLINUX=2.4.21

$ export VLINUX_PATCH=rmk1

$

$ export PREFIX=/armtools

$ export TARGET=arm-linux

你可以把它们加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。

否则在 bash 的命令行上输入它们并立即生效,但你 logout 再 login 时它就无效了。

我们的工作路径是:

...../ ----- ~ -- tars -------- SourceDir

............|................|---- BuildDir

............|--- armtools

$ cd ~

$ mkdir -p tars/SourceDir

$ mkdir tars/BuildDir

$ mkdir arm_tools

$ su

# mv arm_tools $PREFIX

# exit

$

tars --------------- 在这里放我们的下载来的 .tar.gz 文件

SourceDir ------ 这个临时目录放我们解压缩后的源文件

BuildDir --------- 我们在这里编译

armtools -------- 把arm-linux 交叉编译环境的安装在这里

1.安装linux 的头文件

当你为不同类型的ARM编译gcc,或编译不同版本的kernel,或交叉编译gcc 时都需要一套不同的linux头文件。

1.1解压缩,打补丁

$ cd ~/tars/SourceDir

$ tar -zxf ../linux-$VLINUX.tar.gz

$ cd linux

$ zcat ../../patch- $VLINUX-$VLINUX_PATCH.gz | patch -p1

1.2清理一下

$ make mrproper

1.3修改 Makefile

将Makefile中ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) 这一行注释掉,并加一行 ARCH=arm。修改后象这样:

ARCH=arm

# ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)

如果你的系统里的 sed 程序支持用 '\' 续行(通常都支持),你可以用这个 script 去修改 Makefile

#!/bin/sh

mv Makefile Makefile.orig

sed 's/ARCH := $(shell uname -m/ARCH=arm# ARCH := $(shell uname -m/' < Makefile.orig > Makefile

#end of script

注意:

这个 script 里的 # ARCH := 是上一行的续行,不是 shell 里的注释,它也是要输入的。

如果你从浏览器(IE, netscape, etc)上 copy-paste 这个 script 到你的 bash console,它很有可能不工作;

但你在 bash console 里手工输入就可以工作。

因为有时 copy 过来后,是 'ARCH=arm\r\n',而能工作的是 'ARCH=arm\n'。

1.4建立连接

1.4.1如果是LART板子

$ make lart_config

$ yes "" | make oldconfig

$ make include/linux/version.h

或:

$ make lart_config

$ make menuconfig 选择

网上有的文章用的是:

$ make symlinks include/linux/version.h

那是不完全的。make symlinks 的作用相当于:

$ cd include/asm-arm

$ rm -f arch proc

$ ln -s arch-sa1100 arch

$ ln -s proc-armv proc

$ cd ../../

它并没有产生一个很重要的文件 include/linux/autoconf.h。

而 yes "" | make oldconfig 不仅是 make symlinks,

还产生了 include/linux/autoconf.h。但它也没有产生

include/linux/version.h。

1.4.2如果是clps711x的CPU

连接应该为:

$ cd include/asm-arm

$ rm -f arch proc

$ ln -s arch-clps711x arch

$ ln -s proc-armv proc

$ cd ../../

为你自己的系统定制:

$ make menuconfig

在这里你只需要选你使用的 CPU 或选则有你使用的 CPU 的板子即可,

当然进行更详细的配置更好。

注:

include/asm-arm/proc-armo 是26位ARM

include/asm-arm/proc-armv 是32位ARM

注:背景知识

在ARM1中实现26位地址空间,但没有被商用。

在ARM2,2a 中还有26位地址空间,现在已经废弃。

在ARM3中扩展到32位地址空间,但是还反向兼容26位。

在ARM4中是32位地址空间,停止兼容26位地址空间。在 T 系列中加入 Thumb 指令。

在ARM5中是32位地址空间,在所有系列中均支持 16 位的 Thumb 指令。

1.5拷贝头文件

$ mkdir -p $PREFIX/$TARGET/include

$ cp -dR include/linux $PREFIX/$TARGET/include

$ cp -dR include/asm-arm $PREFIX/$TARGET/include/asm

1.6为 gcc 建立一个 linux kernel 头文件的连接

编译gcc时,它需要 linux kernel 的头文件,你可以用 --with-headers=$PREFIX/$TARGET/include 来指定头文件的位置,gcc 把它拷贝到 $PREFIX/$TARGET/sys-include。我们可以建立个 sys-include 连接,就不用 --with-headers 了。

$ cd $PREFIX/$TARGET

$ ln -s include sys-include

2编译安装binutils

这里用不到前面准备的 linux 头文件

2.1解压缩

$ cd ~/tars/SourceDir

$ tar -zxf ../binutils-$VBINUTILS.tar.gz

2.2编译

$ cd ~/tars/BuildDir

$ mkdir binutils

$ cd binutils

$ ../../SourceDir/binutils-$VBINUTILS/configure --target=$TARGET --prefix=$PREFIX

$ make all install

2.3输出 binutils 的路径到环境变量中

你可以把它加到 .bashrc 中。如果你这么做了,你需要 logout 再 login 才能生效。

否则在 bash 的命令行上输入它并立即生效,但你 logout 再 login 时它就无效了。

export PATH=$PREFIX/bin:$PATH

3.编译安装gcc 的c 编译器

3.1解压缩

$ cd ~/tars/SourceDir

$ tar -zxf ../gcc-core-$VGCC.tar.gz

注意:为什么不用 all-in-one 的 gcc-$VGCC.tar.gz 呢?

all-in-one 的 gcc 包里面有 chill, fortran, java 等语言的编译器,虽然在下面 configure 时指定 -enable-languages=c,但编译时还是把所有的都编译一便,这不是我们需要的,而且它也总会有错误。因此我们只编译 C 语言的编译器。后面第二次编译的时候也是这个问题,我们只编译 C 和 C++ 的编译器。

3.2修改 gcc 的 t-linux 文件

在 t-linux 文件中的 TARGET_LIBGCC2_CFLAGS 上加上 __gthr_posix_h 和 inhibit_libc

$ cd gcc-$VGCC/gcc/config/arm

$ mv t-linux t-linux-orig

$ sed 's/TARGET_LIBGCC2_CFLAGS =/TARGET_LIBGCC2_CFLAGS = -D__gthr_posix_h -Dinhibit_libc/' < t-linux-orig > t-linux-core

$ cp ./t-linux-core ./t-linux

3.4编译

$ cd ~/tars/BuildDir

$ mkdir gcc-core

$ cd gcc-core

$ ../../SourceDir/gcc-$VGCC/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c --disable-shared --disable-threads

$ make all install

4.编译安装 glibc

4.1解压缩

$ cd ~/tars/SourceDir

$ tar -zxf ../glibc-$VGLIBC.tar.gz

$ cd glibc-$VGLIBC

$ tar -zxf ../../glibc-linuxthreads-$VGLIBC.tar.gz

4.2编译

$ cd ~/tars/BuildDir

$ mkdir glibc

$ cd glibc

$ CC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib ../../SourceDir/glibc-$VGLIBC/configure $TARGET --prefix=$PREFIX/$TARGET --enable-add-ons

$ make all install

5.编译安装gcc 的c, c++ 编译器

5.1恢复t-linux 文件

$ cd ~/tars/SourceDir/gcc-$VGCC/gcc/config/arm/

$ cp t-linux-orig t-linux

5.2解压缩 c++ 编译器

$ cd ~/tars/SourceDir/

$ tar -zxf ../gcc-g++-$VGCC.tar.gz

$

$ cd ~/tars/BuildDir

$ mkdir gcc

$ cd gcc

5.3编译

$ ../../SourceDir/gcc-$VGCC/configure \

--target=$TARGET \

--prefix=$PREFIX \

--enable-languages=c,c++ \

--with-included-gettext

$ make all

$ make install

注:

如果你下载的是 filename.tar.bz2,你可以用如下命令之一解压缩,第三种方式在任何系统中都好使。

$ tar -jxf filename.tar.bz2

$ tar -Ixf filename.tar.bz2

$ bzip2 -dc filename.tar.bz2 | tar xf -

如果你是第一次制作 arm-linux 交叉编译环境,强烈建议你用本文所使用的各个程序的版本。如果用其它版 本,按照本文的方法可能会在编译的时候出问题,因为我没有时间去测试各个版本的组合。这里是源程序:  crossarm.sh,它使用的是:

linux-2.4.21.tar.bz2

patch-2.4.21.bz2

binutils-2.14.tar.gz

gcc-core-2.95.3.tar.gz

gcc-g++-2.95.3.tar.gz

glibc-2.2.4.tar.gz

生成的 toolchain 大于 150 兆,用如下方法压缩:

$ cd ~

$ tar -cf armtools.tar /armtools

$ bzip2 -z armtools.tar

压缩后生成的 armtools.tar.bz2 大概有 30 几兆。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_32065293/article/details/117126748

智能推荐

docker php7 mysql分开_docker-compose编排Nginx+PHP7&5+MySQL+Redis+Memcached_吃什么研究室的博客-程序员宅基地

目录结构整体目录结构如下, github 项目地址:docker-lnmp.├── data│ ├── mysql│ └── redis├── docker-compose.yml├── logs│ ├── nginx│ ├── php56│ └── php74├── services│ ├── memcached│ ├── mysql│ │ ├── Docke...

监控工具nmon的安装与使用_竹杖芒鞋轻胜马,一蓑烟雨任平生的博客-程序员宅基地

1、简介nmon 工具可以帮助在一个 屏幕上显示所有重要的 性能优化信息,并动态地对其进行更新。这个高效的工具可以工作于任何哑 屏幕、telnet会话、甚至拨号线路。另外,它并不会消耗大量的 CPU 周期,通常低于百分之二。在更新的计算机上,其 CPU 使用率将低于百分之一。nmon工具还可以将相同的数据捕获到一个文本文件,便于以后对报告进行分析和绘制图形。输出文件采用 电子表格的格式 (.c...

json模块的两个常见的byte解析用法_New_Monkey_In的博客-程序员宅基地_json中byte

最近学习网络通信中无意间接触了json这个模块,其两个常见的用法:就是json.dumps()和json.loads()。其主要

V神要退位?这10件假期发生的重大新闻,你错过了吗?_区块链大本营的博客-程序员宅基地

小伙伴儿们,国庆假期是不是玩得太嗨,忘记关注期间发生的重大新闻了。面对即将到来的上班,是不是又感觉心里一阵恐慌?不用担心,小编已经给你准备好了国庆七天所发生的十件重大新闻...

微信公众平台卡券功能_weixin_34255793的博客-程序员宅基地

卡券功能,是公众平台向有投放卡券需求的公众号提供的推广、经营分析的整套解决方案,是“微信卡包”的重要组成部分,是连接商户与消费者的新渠道。 通过资质审核的商户,拥有卡券制作、管理、投放和数据分析的整套能力。目前支持的卡券类型有代金券、折扣券、礼品券、团购券、优惠券。一、功能特性1.卡券收纳 微信卡包帮助用户收纳各类卡券,提升卡券被使用的...

php 物联网协议,物联网网络层协议_小蛮腰课代表的博客-程序员宅基地

网络层分为两个子层:处理从源到目的地的数据包传输的路由层,以及形成数据包的封装层。RPL协议RPL代表低功耗和有损网络的路由协议。它是一种距离矢量协议,支持各种数据链路协议。RPL构建了一个面向目标的有向无环图(DODAG),它只有一个从每个叶节点到根节点的路由。此DODAG中的所有流量都通过根路由。最初,每个节点发送一个DODAG信息对象(DIO),声明它们是自己的根。这些信息在网络中传播,逐渐...

随便推点

【机器学习手册】【4】特征矩阵操作——数据缩放公式_苏念心的博客-程序员宅基地_机器学习 特征矩阵

前言特征缩放、归一化观察值、生成多项式、转换特征、异常值、特征离散化、聚类分组特征矩阵的缩放import numpy as npfrom sklearn import preprocessing as prepfeature_matrix = np.array( [ [-200], [-100], [0], [100], [200], ])print("origin feature matrix

RTC定时开机闹钟_weixin_33901843的博客-程序员宅基地

  RTC是Real Time Clock的简称,它在硬件电路上单独供电,当系统关机时,CPU和其他外部硬件设备全部掉电,但是RTC仍然继续工作.  HWCR (Hibernate Wakeup Control Register)是一个控制休眠唤醒的寄存器,如果我们要使用休眠状态下RTC唤醒的功能,我们需要打开它的第0位ELAM(RTC Alarm Wakeup enable),当ELAM置1...

xp改mac地址linux,局域网络必备-mac地址修改_weixin_39542850的博客-程序员宅基地

1.windows xp 的mac 地址修改①.点选 --》 --》 --》 --》 --》 ---》 ---》 ---》 即可!②.在运行中使用 “cmd” 调出dos 界面。在dos界面中使用 “ipconfig /all”查看网卡的配置信息2.linux(redhat 5.4)①.编辑网卡的信息文件[[email protected] ~]# vim /etc/sysconfig/network-scrip...

编辑类控件_开发的博客-程序员宅基地

以窗口类名"EDIT"创建的编辑类控件是一个可以用来接受用户键盘字符输入的矩形区域,可以在其内进行编辑操作。该控件是程序接受用户字符输入的一种主要手段,输入的内容存放在其父窗口容量有限的(32KB)局部堆中。  MFC的CEdit类提供了有关编辑类控件的功能函数。编辑控件既可以在对话框模板上创建也可以通过代码来直接创建,这两种方式均要通过CEdit的构造函数来构造一个CEdit对象。CEd

aws延迟测试_aws放大ci cd code lint端到端测试_weixin_26706093的博客-程序员宅基地

aws延迟测试After my first approach to AWS Amplify, I want to deal with the implementation of source code linters and end-to-end tests with Cypress, obviously automated in the AWS Amplify CI/CD pipeline. L...

sublime text3 python input_解决sublime text3中无法运行python中input,_黑科技玩机的博客-程序员宅基地

解决sublime text3中无法运行python中input()的问题解决了python中的input()无法在高级文本3中运行的问题,栏目,教程,sublime,将介绍python中的input()无法在崇高text3中运行的解决方案,希望对有需要的朋友有所帮助!方法引用自网络,此处仅为记录。1.Ctrl shift P,进入安装包控制;在弹出的输入框中;2.按住Ctrl键,输入/选择软...