s3c2440硬件学习笔记----嵌入式Linux基础知识和开发环境的构建

2019-07-13 04:13发布

注:所有内容基于友善之臂Mini2440开发板 一、嵌入式Linux开发环境的构建 嵌入式开发一般分为三个步骤: 1、编译bootloader,烧到开发板 2、编译嵌入式Linux内核,烧到开发板 3、编译各类应用程序,烧入开发板 软件环境构建
采用主机windows,虚拟机CentOS上作为开发环境,虚拟机的安装和Linux安装就不说了。 安装好后Linux应该配置samba服务,挂载windows下的代码共享目录 安装交叉编译工具链 对于嵌入式Linux,程序都是下到开发板上运行,开发板和cpu相关的体系架构与x86系列的都不一样,所以不能用常规的gcc来编译,必须用专门的交叉编译工具 对于Mini2440,采用的是arm9处理器,使用友善之臂官方提供的编译工具在光盘中有提供,下载地址: http://www.linuxidc.com/Linux/2011-09/43527.htm 下载以后解压到根目录 # tar xvf arm-linux-gcc-4.3.2.tgz -C / 也可以自行编译交叉工具链,但是过程繁琐,容易出错,我们还是把重点放在开发上。 二、嵌入式编程基础知识 一般的c/c++文件要变成可执行文件需要经过预处理、编译、汇编、和连接等4个步骤 1)预处理 以#开头的为预处理命令,如包含命令#include、宏定义#define、条件编译#if #ifdef,预处理的目的是将所有include文件插入到源文件中、将宏定义展开、条件编译成立的选择使用的代码,最后将所有代码输入到.i文件中等待处理,预处理需要用到arm-linux-cpp工具 c编译预处理:1)宏定义2)文件包含3)条件编译 2)编译 把所有c/c++代码(上面的.i文件)翻译成汇编代码,用到工具为ccl 3)汇编 将前面的汇编代码翻译成一定格式的机器码,Linux上一般为ELF目标文件,用到工具为arm-linux-as 4)连接 连接就是将上面生成的obj文件和系统库的obj文件、库文件连接起来,最终生成在平台上可执行文件,用到工具为arm-linux-ld arm-linux-gcc选项 1)-c 预处理、编译和汇编源文件,不做连接,编译器生成obj文件,gcc通过.o替换.c .i .s等 2)-S 编译后即停止,不进行汇编,gcc用.s替换.c .i等 3)-E 预处理后停止,不进行编译,预处理代码到标准输出 4)-o file 指定输出file文件 5)-v 显示gcc版本,编译细节 6)-Wall 打开警告选项 7)-g 打开调试选项,可用gdb调试 8)-llibrary 连接名为library的库文件,真正名字为liblibrary.a 9)-static 静态编译 10)-shared 生成共享obj文件 11)-Idir 指定dir为头文件搜索目录 12)-Ldir. 指定dir为库文件搜索目录 arm-linux-ld选项 1)-T 指定代码段(-Ttext),数据段(-Tdate),bss段(-Tbss)的起始地址 使用连接脚本(-Txxx.lds) 例: SECTIONS { . = 0x30000000; .text : { *(.text)} .rodata ALIGN(4) : { *(.rodate) } .data ALIGN(4) : { *(.data) } .bss ALIGN(4) : { *(.bss) *(COMMON) } } 第二行表示当前运行地址为0x30000000,第三行定义了.text段,内容为*(.text),表示所有输入文件的代码段,起始运行地址为0x30000000 第四行定义了.rodata段,代码紧挨.text,ALIGN(4)表示起始地址4字节对齐如果.text为0x30000000-0x300003f1,则.rodata地址为0x300003f4 arm-linux-objcopy选项 此命令用来复制一个目标文件内容到另一个文件中,可进行格式转换 例:将ELF格式转换成二进制文件 arm-linux-objcopy -O binary -S elf_file bin_file arm-linux-objdump选项 常用来查看反汇编代码 ELF转反汇编 arm-linux-objdump -D elf_file > dis_file 二进制转反汇编 arm-linux-objdump -D -b binary -m arm bin_file > dis_file Makefile介绍 1)格式: 目标 : 依赖 命令 例: hello: hello.c gcc -o hello hello.c clean: rm -f hello 2)赋值方法 延时变量:使用时才展开 var = value var ?= value(变量未定义才有效,即定义第一次出现的延时变量) 只有当var 变量还没有被定义的时候,才会将value的值赋给val 立即变量:定义时值就确定 var := value 对于 var += value 右边变量如果前面使用:=定义为立即变量,则它是立即变量,否则为延时变量 3)Makefile常用函数 略,太多了,用到时再介绍
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2011-09/43526.htm