开发环境搭建---交叉工具链、makefile编写、连接器脚本、Eclipse调试
来源:互联网 发布:九堡做淘宝的在哪 编辑:程序博客网 时间:2024/05/16 12:08
交叉工具链
安装:
将arm-linux-gcc-4.3.2.tgz文件解压到linux根目录/下,可以发现解压后的文件在/usr/local/arm/4.3.2/文件下。
然后修改环境变量:执行命令vim /root/.bashrc
再添加最后一行代码:
三个命令:
arm-linux-gcc -g -c -o led.o led.S
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
可以使用file命令来查看文件的可以运行的平台。 如果希望对烧写到开发板中的程序进行编译,就需要采用针对开发板的交叉编译器。
交叉开发:
在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。
1、交叉编译器
命令:arm-linux-gcc
举例:arm-linux-gcc -g -c -o led.o led.S
-c:只编译不连接
-print-search-dirs:显示头文件的位置,与gcc不同
2、交叉链接器
命令:arm-linux-ld
举例:arm-linux-ld -Tled.lds -o led.elf led.o
led.lds为链接器脚本文件。
3、交叉转换器
命令:arm-linux-objcopy
举例:arm-linux-objcopy -O binary led.elf led.bin
将elf格式文件转换为bin格式的文件。bin是二进制格式文件。
4、交叉ELF文件工具
命令:arm-linux-readelf
举例:arm-linux-readelf -a led.elf
链接之后得到elf文件。
注意图中的两点:
如果一个程序拷到开发板中无法运行,可能的原因:运行平台不对,用file查看;可能大小端不对,用arm-linux-readelf -a 查看;也可能是库没有包含,可以采用arm-linux-readelf -d 来查看,查看的是动态链接库。
5、交叉反汇编器
命令:arm-linux-objdump
举例:arm-linux-objdump -D -S hello >dump
将编译后的可执行文件反汇编为汇编文件。hello是gcc编译之后的文件,是elf可执行文件,将汇编代码写入dump文件中。
在arm-linux-gcc编译时,加上-g参数,然后对可执行文件进行arm-linux-objdump反汇编,会发现dump中的汇编代码多了与之对应的C语言代码,方便观察。
makefile文件的编写
使用GNU Make工具来管理程序是每个Linux工程师必须掌握的技能。
Make能够使整个程序的编译、链接只需要一个命令(make)就可以完成。因此非常快捷方便。
Make的工作主要依赖于一个叫为Makefile的文件。Makefile文件描述了整个程序的编译,连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译,如何最后产生我们想要得可执行文件。
makefile由规则和变量两部分组成。
规则:
如果用户没有指定执行某一条规则,make会默认执行makefile中的第1条规则,而这条规则中的目标称之为:最终目标。
变量:
makefile编写举例:
all:led.S arm-linux-gcc -g -c led.S -o led.o arm-linux-ld -Tled.lds -o led.elf led.o arm-linux-objcopy -O binary led.elf led.bin.PHONY: cleanclean: rm -f *.bin *.elf *.o *.bak
当一个makefile中有许多类似的规则时,可将这些规则合并为一条通用规则:
采用百分号%
%.o : %.S arm-linux-gcc -g -c $^ -o $@
取消回显可以节约时间。
make命令默认在当前目录下寻找名字为makefile或者Makefile的工程文件,当名字不为这两者之一时,可以使用如下方法指定:
make –f 文件名 目标
链接器脚本 lds文件
一个可执行程序通常是由:代码段,数据段,bss段构成的。同样,在用于链接这个程序的链接器脚本中,就会反应出这几个段的信息。
链接器脚本文件的构成:段结构、起始链接地址、对齐、变量、代码段首文件。
链接器脚本文件名以 .elf 为结尾。
lds文件中采用 /* …… */星号和斜杠来表示注释。
对齐设置:. = ALIGN(4); 每个段前加入,4字节对齐,使得段首地址可以整除4。为了提高访问内存的效率。
设置代码段的首文件需要注意每个程序文件的顺序,第一名开始运行的文件的位置很重要。
lds文件编写举例:
SECTIONS { . = 0x0; /* .点表示当前地址,设置链接首地址为首地址 */ /* 在6410开发板,此处地址为0x50008000 */ . = ALIGN(4); /* 4字节对齐,调整段首地址对4整除 */ .text : /* 冒号前面一定要加空格 */ { led.o (.text) /* 设置代码首文件 */ *(.text) /* 星号表示所有文件的代码 */ } . = ALIGN(4); /* 4字节对齐 */ .data : /* 数据段 */ { *(.data) /* 星号表示所有文件的数据段 */ } bss_start = .; /* 定义变量 */ . = ALIGN(4); /* 4字节对齐 */ .bss : { *(.bss) /* bss段未初始化数据 */ }}
Eclipse调试
实现编译和在线调试的功能。
需要在linux虚拟机上安装eclipse软件,安装GDB server 调试工具,安装JLink驱动。
将gdb压缩文件解压到根目录下,与gcc的解压相同。
安装GDB server之后需要修改环境变量,如本文第一幅图所示,倒数第二行。gdb的环境变量要添加在gcc之前,因为交叉工具链中也有gdb工具。
首先要从SD卡启动,先格式化nand flash ,然后从nand flash 启动。
一定一定注意注意:
启动 Eclipse 之前,一定要先启动 JLink GDB Server。 在arm-tools文件夹中。
还需要拷贝 cp -d libjlinkarm.so* /usr/lib -f,
和 cp 45-jlink.rules /etc/udev/rules.d/ 。
安装eclipse的插件:
保证可以上网,help->instal new software
安装一个插件:
建立工程目录,在workspace文件夹新建一个工程目录。把代码、lds文件、makefile拷进去。
创建一个已有代码的工程,选择工程目录文件夹的位置,就可以了。
eclipse是根据makefile进行编译和调试的,调试的是elf文件。
调试配置: 工具栏中的“虫子“按钮在下拉菜单中选择debug configuration
一定注意:在配置之前,一定要先选中工程名字。
注意:选择的是 elf 格式的文件,调试的是elf格式的文件。
此处继续修改选项卡debugger中的两个内容
然后在commands选项卡中填入初始化命令:
# tiny6410_config# connect to the J-Link gdb servertarget remote localhost:2331# Set JTAG speed to 30 kHzmonitor endian littlemonitor speed 30# Reset the targetmonitor resetmonitor sleep 10## CPU core initialization (to be done by user)## Set the processor modemonitor reg cpsr = 0xd3#config MMU#flush v3/v4 cachemonitor cp15 7, 7, 0, 0 = 0x0#/* flush v4 TLB */monitor cp15 8, 7, 0, 0 = 0x0#disable MMU stuff and cachesmonitor cp15 1, 0, 0, 0 =0x1002#Peri port setupmonitor cp15 15, 2, 0, 4 = 0x70000013#disable watchdogmonitor MemU32 0x7e004000 = 0x00000000monitor sleep 10#disable interruptmonitor MemU32 0x71200014 = 0x00000000monitor MemU32 0x71300014 = 0x00000000monitor MemU32 0x7120000C = 0x00000000monitor MemU32 0x7130000C = 0x00000000monitor MemU32 0x71200F00 = 0x00000000monitor MemU32 0x71300F00 = 0x00000000#set clock monitor MemU32 0x7e00f900 = 0x0000801emonitor MemU32 0x7e00f000 = 0x0000ffffmonitor MemU32 0x7e00f004 = 0x0000ffffmonitor MemU32 0x7e00f020 = 0x01043310monitor MemU32 0x7e00f00C = 0xc2150601monitor MemU32 0x7e00f010 = 0xc2150601monitor MemU32 0x7e00f024 = 0x00000003monitor MemU32 0x7e00f014 = 0x00200102monitor MemU32 0x7e00f018 = 0x00000000monitor MemU32 0x7e00f01C = 0x14000007#config sdrammonitor MemU32 0x7e00f120 = 0x00000008monitor MemU32 0x7e001004 = 0x00000004monitor MemU32 0x7e001010 = 0x0000040fmonitor MemU32 0x7e001014 = 0x00000006monitor MemU32 0x7e001018 = 0x00000001monitor MemU32 0x7e00101c = 0x00000002monitor MemU32 0x7e001020 = 0x00000006monitor MemU32 0x7e001024 = 0x0000000amonitor MemU32 0x7e001028 = 0x0000000cmonitor MemU32 0x7e00102c = 0x0000018fmonitor MemU32 0x7e001030 = 0x0000000cmonitor MemU32 0x7e001034 = 0x00000002monitor MemU32 0x7e001038 = 0x00000002monitor MemU32 0x7e00103c = 0x00000002monitor MemU32 0x7e001040 = 0x00000002monitor MemU32 0x7e001044 = 0x00000013monitor MemU32 0x7e001048 = 0x00000013monitor MemU32 0x7e00100C = 0x00010012monitor MemU32 0x7e00104C = 0x00000b45monitor MemU32 0x7e001200 = 0x000150f8monitor MemU32 0x7e001304 = 0x00000000monitor MemU32 0x7e001008 = 0x000c0000monitor MemU32 0x7e001008 = 0x00000000monitor MemU32 0x7e001008 = 0x00040000monitor MemU32 0x7e001008 = 0x00040000monitor MemU32 0x7e001008 = 0x000a0000monitor MemU32 0x7e001008 = 0x00080032monitor MemU32 0x7e001004 = 0x00000000# Setup GDB for faster downloads#set remote memory-write-packet-size 1024set remote memory-write-packet-size 4096set remote memory-write-packet-size fixedmonitor speed 12000break _startload
先用smb将初始化脚本拷入linux,然后可以在linux中执行gedit命令,用编辑器打开初始化脚本,将代码进行复制到eclipse中。
如下图所示:
然后就可以启动调试了。
- 开发环境搭建---交叉工具链、makefile编写、连接器脚本、Eclipse调试
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
- 嵌入式开发交叉调试环境搭建
- 嵌入式开发环境搭建之安装交叉编译工具链
- linux下eclipse交叉开发环境搭建
- linux下eclipse交叉开发环境搭建
- eclipse搭建GBA开发环境(makefile)
- linux开发环境搭建-----开发环境,光盘内容,交叉编译工具链
- 搭建交叉开发环境
- 交叉开发环境搭建
- eclipse 和 交叉工具链构建嵌入式应用编译及调试环境
- 通过eclipse开发opencms-搭建调试环境
- Eclipse搭建stm32开发环境+jlink调试
- 【MonkeyRunner】eclipse中编写monkeyrunner脚本环境搭建
- tiny6410裸机实验第0章--------------开发环境的搭建(交叉编译工具链制作)
- RVDS和MDK嵌入式开发工具调试脚本编写
- Lua开发环境搭建(二)--使用Editplus编写Lua脚本
- eclipse + Felix 开发环境搭建 bundle 开发与调试
- hdu 5938 Four Operations(模拟)
- Python中的None与 NULL(即空字符)的区别
- [译]Android注解--@hide
- 异常:java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher 解决办法
- c++第二次作业-百钱百鸡问题
- 开发环境搭建---交叉工具链、makefile编写、连接器脚本、Eclipse调试
- Java如何生成Code128C条形码
- hdu 1848 Fibonacci again and again (博弈)
- 蓝桥杯第六届 格子中输出(printf()的*修饰符)
- 【51NOD 1237】最大公约数之和 V3
- mac或linux中打开.bashrc,编辑完之后如何保存退出
- C++ 日志库 boost::log 以及 glog 的对比
- 移动构造函数和移动赋值运算符
- QT读取XML文件