class="markdown_views prism-tomorrow-night">
使用芯片手册的时候,会时常的看到芯片中有的位填写的数字有保留,那是为了以后芯片升级和扩展使用的,现在是不使用。如GPF4占用的[9:8] 00 = Input,01 = Output, 10 = EINT, 11 = Reserved 保留位是为了以后进行扩展使用,现在使用不上。
使用虚拟机VMware有4种网络连接方式:网桥网络(Bridged)、网络地址翻译网络(NAT)、仅为主机网络(Host-only)和客户网络。常用的网络连接方式是前两种。
网桥网络需要连上网线才可以使用,当主机与目标板之间需要进行网络通讯的时候使用这种方式,它相当于三台处于同一网段的计算机,没有使用网线的时候使用NAT网络在主操作系统Windows与客户操作系统Linux间进行通讯。
UBUNTU中使用软件维护工具:qpt-get安装没有安装的软件
何为mount
mount是Linux下的一个命令,它可以将分区挂接到Linux的一个文件夹下,从而将分区和该目录联系起来,因此我们只要访问这个文件夹,就相当于访问该分区了。 目前mount已经不仅仅局限于Linux了。在Windows系统下的应用也越来越广了,多用在虚拟光驱类软件上
在刚学习嵌入式linux时候,尽量使用已经制作好的工具链接
我使用的是韦东山制作好的嵌入式P40页
在程序编译器之前加上“-c”,只会进行预处理、编译和汇编源文件,但是不作连接。GCC会忽略-c选项之后任何无法识别的输入文件。
-S
编译之后立即停止,不进行汇编。GCC忽略任何不需要汇编的输入文件
-E
预处理之后即停止,不进行编译,忽略任何不需要预处理的输入文件。
-o file
指定输出文件为file,无论是预处理、编译、汇编还是连接,这个选项都可以使用。
-v
显示制作GCC工具时的自身配置命令;同时显示编译器驱动程序、预处理器、编译器的版本号。
调试选项
-g以操作系统的本地格式(stabs、COFF、XCOFF、或DWARF)、产生调试信息,GDB能够使用这些调试信息。
优化选项
-O或-O1, 不使用 - -O或-O1的时候只有声明了register的变量才能分配使用寄存器。
-O2多优化一些。除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作,例如不进行循环展开(loop unrolling)和函数内嵌(inling)。和-O相比增加了代码的编译时间,也提高了生成代码的运行效果。
-O3优化的更多。除了打开-O2所做的一切还打开了,“-finline-functions”选项
-O0如果指定了多个”-O”选项,不管带不带数字都是最后一个生效
连接器选项
-llibrary 即使不明显的使用-llibrarya选项,一些默认的库也被连接进去,可以使用”-v”选项看到这点
gcc -v -o test main.o sub .o
-nostartfiles 不连接系统标准启动文件,而标准库文件任然正常使用
gcc -v -nostartfiles -o test main.o sub .o
-nostdlib 不连接系统标准启动文件和标准文件,只把指定的文件传递给连接器,这个选项常用语编译内核、bootloader等程序,它们不需要启动文件、标准库文件。
gcc -v -nostdlib -o test main.o sub .o
-static 在支持动态链接的系统上阻止链接共享库。使用和不使用”-static”选项编译出来的可执行程序的大小相差很大
gcc -c -o main.o main.c
gcc -c -o sub .o sub .c
gcc -o test_static main.o sub .o -static
gcc -o test main.o sub .o
ls -l test test_static
-rwxrwxr-x 1 book book 8664 7 月 4 14 :54 test
-rwxrwxr-x 1 book book 912728 7 月 4 14 :53 test_static
book@www.100 ask.org :~/work/test$
当不使用-static进行编译文件时,程序执行前还需要使用共享文件库文件,所以还需要将共享文件库放入文件系统中。
-shared
生成一个共享OBJ文件,他可以和其他OBJ文件连接产生可执行文件,只有部分系统支持该选项,当不想以源代码发布程序的时候可以使用”-shared”选项生成库文件,比如对于options程序可以如下制作成库文件
gcc -c -o sub .o sub .c
gcc -shared -o sub .a sub .o
以后要使用sub.c中的函数sub_fun时,再连接程序的时候,将sub.a加入即可,比如:
gcc -o test main.o ./sub .a
可以将多个文件制作成一个库文件,比如:
gcc -shared -o sub .o sub2.o sub3.o
目录选项
下列选项指定搜索路径,用于查找头文件、库文件或编译器的某些成员。
-Idir
在头文件的搜索路径中添加dir目录。头文件搜索的方法为:如果以”#include <>”包含头文件,则在标准的头文件目录开始搜索(包含使用-Idir选项定义的目录),如果以”#include ” ” “包含的文件,则先从用户的工作目录开始搜索,在搜索标准库目录。
-I-
任何在”-I-“前面使用的”-I”选项指定的搜索路径只适用于”#include “file” “这种情况,
arm-linux-ld 选项
arm-linux-ld 用于将多个目标文件、库文件连接成可执行文件,本小节主要介绍”-T”选项,可以直接使用它指定代码段、数据段、bss段的起始地址,也可以制定一个连接脚本在连接脚本中进行复杂的地址设置。
“-T”选项只用于连接Bootloader、内核等“没有底层软件支持”的软件,连接运行于操作系统之上的应用程序,无需指定”-T”选项,它们使用默认的方式进行连接。
直接指定代码段、数据段、bss段的起始地址
格式如下:
-Ttext startaddr
-Tdata startaddr
-Tbss startaddr
其中的”startaddr”分别代表代码段、数据段和bss段的起始地址,它是一个十六进制的数。
在led_on的Makefile中有如下语句:
arm-linux -ld -Ttext 0x0000000 -g led_on. o -o led_on_elf
它表示的代码段运行的地址为0x0000000,由于没有定义数据段、bss段的起始地址,它们被依次放到代码段的后面
使用链接脚本设置地址
在/work/source/hardware/timer的目录下的程序为例,他的Makefile中有如下代码:
arm-linux-ld -Ttimer.lds -o timer_elf head.o int.o interrupt.o main.o
使用链接脚本timer.lds来设置可执行文件timer_elf的地址信息,timer_elf文件内容如下:
SECTIONS {
. = 30000000
.text :{ *(.text ) }
.rodata ALLGN{4 } : { *(.rodata ) }
.data ALIGN{4 } : { *(.data ) }
.bss ALIGN{4 } : { *(.bss ) *(COMMON)}
}
链接脚本的基本命令是SECTIONS命令,他描述了输出文件的映射图:输出文件中各段、各文件怎样设置。一个SECTIONS 内部包含了一个或多个段,段(section)是链接脚本的基本单元,他表示输入文件中的某个部分怎样放置。
arm-linux-objcopy选项
arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,可以使用不同的源文件格式。在嵌入式中常使用arm-linux-objcopy命令将ELF格式的生成结果转换为二进制文件,比如:
arm-linux -objcopy -o binary -S elf_file bin_file
arm-linux-objdump 常用来显示二进制文本信息,本书中常用来查看反汇编代码
1.将ELF格式的文件转换为反汇编文件:
arm-linux -objdump -D elf_file > dis_file
2.将二进制文件转换为反汇编文件:
arm-linux -objdump -D -b binary -m arm bin_file > dis_file