网站推广软件,163域名注册,精美网站制作公司,天津建设工程信息网 塘沽一中1、安装交叉编译工具工具
1.1、windows中装软件的特点 windows中装软件使用安装包#xff0c;安装包解压后有两种情况:一种是一个安装文件 (.exe/.msi)#xff0c;双击进行安装#xff0c;下一步直到安装完毕。安装完毕后会在桌面上生成快捷方式#xff0c;我们平时使用快…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中的BL0BL0执行完后会根据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 3argv[0]./mkx210argv[1]led.binargv[2]210.bin
3.4.2、glibc读写文件接口 linux中要读取一个文件可以使用fopen打开文件fread读取文件读完之后fclose关闭文件。要写文件用fwrite来写。这些函数是glibc的库函数在linux中用man 3 可以查找。
3.4.3、校验和的计算方法 算法校验和其实就是需要校验的内存区域中所有内存中的内容按照字节为单位来进行相加最终相加的和为校验和。 实现时要注意指针的类型为char。