ARM裸机-11

1、安装交叉编译工具工具

1.1、windows中装软件的特点

        windows中装软件使用安装包,安装包解压后有两种情况:一种是一个安装文件 (.exe/.msi),双击进行安装,下一步直到安装完毕。安装完毕后会在桌面上生成快捷方式,我们平时使用快捷方式来启动这些程序,另一种是所谓的绿色软件、免安装软件。这种不用安装,直接解压开里面就有exe可以直接双击执行。

1.2、linux中装软件的特点

        linux中安装软件比windows中复杂。linux中安装软件一般有以下几种方法:

        第一种:在线安装,例如ubuntu中使用apt-get install vim来安装vim软件。

        第二种,自己下载安装包来安装。这种方式的缺陷就是你不知道你下载的安装包和你的系统是否匹配。

        第三种,最装逼的一种方式,就是源代码安装。

        总结:我们安装交叉编译工具链(arm-linux-gcc)实际采用第二种安装方式

1.3、交叉编译工具链的选择

        我们选择交叉编译工具链的原则:和我们所使用的目标平台(给哪款SoC编程)尽量去匹配。例如我们开发S5PV210的程序就是用arm-2009q3这个版本,因为三星官方在开发S5PV210时就是使用这个版本的交叉编译工具链,这样可以最大限度的避免一些稀奇古怪的问题出现。

1.4、交叉编译工具链的安装

        步骤一:打开虚拟机,在/usr/loacl/创建一个arm文件夹。

        步骤二:先将安装包弄到linux中。

        步骤三:解压。tar -jxvf arm-2009q3.tar.bz2

        到此相当于程序已经安装完毕,真正的应用程序安装在/usr/local/arm/arm-2009q3/bin目录下。

        注:linux中的目录管理方法,技术角度来进,lnux中所有目录性质都是一样的,所以技术角度来进我们把软件安装到哪里都行,但是因为如果胡乱放置,将来程序可能不好找。所以久而久之大家就总结了一个文件放置的一般定义,例如说/bin目录放置一些系统自带的用户使用的应用程序,/sbin目录下存放的是系统自带的系统管理方面的应用程序。

        那我们装软件放在哪里?一般都在/usr目录下我们安装arm-linux-qcc.就在/usr/local/底下创建一个arm文件来,然后装到里面。

1.5、安装后的测试

        到真正的应用程序的安装目录(/usr/local/arm/arm-2009q3/bin)下,去执行arm-linux-gcc -v,在这里真正的执行语句是:

./arm-none-linux-gnueabi-gcc -v

        如果成功安装后会显示版本号。

1.6、环境变量

1.6.1、环境变量的意义

        环境变量就是操作系统的全局变量,每一个环境变量对操作系统来说都是唯一的,名字和所代表的意义都是唯一的。linux系统可以有很多个环境变量。其中有一部分是linux系统自带的,还有一些是我们自己来扩充的,我们这里涉及到的一个环墙变量是PATH。PATH这个环境变量是系统自带的,它的含义就是系统在查找可执行程序时会搜索的路径范围。

        使用以下命令可以打印出当前环境的路径搜索范围:

echo $PATH

1.6.2、将工具链导出到环境变量

export PATH=/usr/local/arm/arm-2009q3/bin:$PATH

        在一个终端中执行以上命令后,该终端中就可以直接使用arm-linux-gcc了,但是只要关掉这个终端再另外打开一个立马就不行了。原因是我们本次终端中执行时的操作只是针对本终端,以后再打开的终端并未被执行过这个命令所以没导出。

        解决方室是在~/.bashrc中,添加export PATH=/usr/local/arm/arm-2009q3/bin:SPATH 即可。

        注意:我们导出这个环境变量是在当前用户下,如果你登录时在其他用户下是没用的。

1.6.3、为工具链创建arm-linux-gcc连接

        进入应用程序的安装文件夹,输入以下命令:

ln arm-none-linux-gnueabi-gcc -s arm-linux-gcc

2、Makefile

2.1、为什么需要Makefile

        Makefile是用来管理工程的。

        在一个正式的软件项目中,由很多个,c和,h文件构成,此时如果直接在命令行编译,就会像这样:

gcc a.c b.c cc. d.c e.c f.c g.c -o exe

        每次编译都要输入一堆东西很麻烦,这个问题严重影响工作效率,怎么办? Makefile来解决。

2.2、一个简单的Makefile示例

        编辑一个Makefile文件

touch Makefile

        然后在该文件中编辑:

all:
    gcc a.c b.c -o exe

        Makefile是和a.c、b.c在同一个文件夹的。然后在该文件夹中进行编译:

make

2.3、Makefile中的一些基本概念

        目标:目标定格写,后面是冒号(冒号后面是依赖)。

        依赖:依赖是用来产生目标的原材料。

        命令:命令前面一定是Tab,不能是定格,也不能说多个空格。命令就是要生成那个目标需要做的动作。

2.4、Makefile的基本工作原理

        其一,当我们执行 make xx 的时候,Makefile会自动执行xx这个目标下面的命令语句。

        其二,当我们make xx的时候,是否执行命令是取决于依赖的。依赖如果成立就会执行命令,否则不执行。

        其三,我们直接make和make 第一个目标,效果是一样的(第一个目标其实就是默认目标)。

2.5、裸机程序中的Makefile

        裸机程序中的Makefile (实际上真正的项目的Makefile都是这样的)是把程序的编译和链接过程分开的。 (平时我们用gcc a.c-o exe这种方式来编译时,实际上把编译和链接过程一步完成了,在内部实际上编译和链接永远是分开独立进行的,编译要使用编译器gcc,链接要使用链接器ld)。

        链接器得到led.elf其实就是我们的可执行程序,(如果是在操作系统下,这个led.elf就可以执行了)但是在嵌入式裸机中我们需要的是可以烧写的文件(可烧写的文件就叫镜像image),因此我们需要用这个led.elf为原材料来制作镜像,制作工具是交叉编译工具链中的arm-linux-obicopy。
        我们使用arm-linux-objdump工具进行反编译(反汇编),反汇编其实就是把编译后的elf格式的可执行程序给反过来得到对应的汇编程序,进而得到它的汇编源代码。现实中使用反汇编多数是用来破解,我们主要用来学习。

2.6、进一步学习Makefile的资料

        学习Makefile的思路就是:先学会基本的概念和应用,先理解Makefile的概念和使用方法、工作原理。先自已会写简单的Mkefile来管理工程。一般先学到这里就可以了,更深入的内容可以随后续需要一起来学习,到时候会再次提及并且逐步深入。

        学有余力可以看《跟我一起学Makefile》(作者:陈皓)。

3、mkv210_image.c文件

        mkv210_image.c这个程序其实最终不是在开发板上执行的,而是在主机linux(就是用来执行make对整个项目进行编译的那个机器)中执行的,因此编译这个程序用gcc而不是用arm-linux-gcc。这个.c文件编译后得到一个可执行程序mkmini210,目的是通过执行这个mkmini210程序而由led.bin得到210.bin。(210.bin是通过SD卡启动时的裸机镜像,这个镜像需要由led.bin来加工得到,加工的具体方法和原理要看mkv210_image.c)。

3.1、背景知识:S5PV210的启动过程回顾

        分析启动过程可知:210启动后先执行内部iROM中的BL0,BL0执行完后会根据OMpin的配置选择一个外部设备来启动(有很多,我们实际使用的有2个:usb启动和SD卡启动),在usb启动时内部BL0读取到BL1后不做校验,直接从BL1的实质内部0xd0020010开始执行,因此usb启动的镜像led.bin不需要头信息,因此我们从usb启动时直接将镜像下载到0xd0020010去执行即可,不管头信息了;从SD启动时,BL0会首先取sd卡得到完整的镜像(完整指的是led.bin和16字节的头),然后BL0会自己根据你的实际镜像(指led.bin)来计算一个校验和checksum,然后和你究整镜像的头部中的checksum来比对。如果对应则执行BL1,如果不对应则启动失败(会转入执行2st启动,即SD2启动。如果这里已经是2st启动了,这里校验通不过就死定了)。

3.2、mkv210_image.c的作用:为BL1添加校验头

        我们编译链接时只得到了led.bin,这个210.bin的得到和交又编译工具链是完全无关的,由ledbin得到210.bin的过程是三星的S5PV210所特有的,因此需要我们自己去完成,为此我们写了mkv210_mage.c来完成。

3.3、整个程序工作流程分析

        整个程序中首先申请一个16KB大小的buffer,然后把所有内容按照各自的位置填充进去,最终把填充好的buffer写入到一个文件(名叫210.bin)就形成了我们想要的镜像。

3.4、代码解释

3.4.1、main函数两个形参的作用

        ma1n按收两个形参::argc和argv。

        axgc是用户(通过命令行来)执行这个程序时,实际传递的参数个数,注意这个个数是包含程序执行本身的。

        argv是一个字符串数组,这个数组中存储的字符串就是一个个的传参。

        例如我们执行程序时使用./mkx210 led.bin 210.bin

        则argc = 3,argv[0]="./mkx210",argv[1]=led.bin,argv[2]=210.bin

3.4.2、glibc读写文件接口

        linux中要读取一个文件,可以使用fopen打开文件,fread读取文件,读完之后fclose关闭文件。要写文件用fwrite来写。这些函数是glibc的库函数,在linux中用man 3 可以查找。

3.4.3、校验和的计算方法

        算法:校验和其实就是需要校验的内存区域中,所有内存中的内容按照字节为单位来进行相加,最终相加的和为校验和。

        实现时要注意指针的类型为char。

你可能感兴趣的:(ARM,arm开发)