主机(PC)开发差别:
在windows下写程序
1.--->打开Microsoft Visual C++ 6.0程序
2.--->关闭提示窗口(有的程序不提示)
3.--->file--->new--->project--->选择win32 console Applicatoin
4.--->在右边打上工程名字hello--->点击OK
5.选择A"hello,word!"application--->点击finish--->点击OK
6.左侧调出FileView栏可以查看工程里的文件
7.点击左上方新建按钮,添加新文件
在linux上开发嵌入式
1.--->在windows下的sourceinsight里建立.c文件,例子是用的hello.c和a.c
2.--->把这个程序通过ftp工具拖到虚拟机里
3.--->进入拖进去的那个文件夹里
4.--->用命令行gcc -o hello hello.c a.c编译,(生成一个hello的可执行程序)
5.--->用命令行./hello执行(.标识当前目录,表示执行当前目录的hello程序)
6.--->可以写一个makefile文件然后执行make来完成编译工作
嵌入式开发
一、windows使用ADS工具
1.编辑
2.编译
指定链接地址
指定链接顺序
编译(点击按钮)
3.执行
烧写到单板再启动
二、linux
1.Windows下编辑上传
2.写makefile执行make(为提高效率是命令行)
链接脚本(指定链接地址)
文件顺序
3.烧到开发板再启动
分析leds的链接地址文件leds.lds,这里面指定了链接地址
1. .=0x00表示当前地址为0,即从0地址开始
2. .text : { *(.text) }放代码段,*代表全部文件,在leds里就是两个源文件leds.c、crt0.S两个的代码段
3. .rodata ALIGN(4) : {*(.rodata)} 只读数据段
4. .data ALIGN(4) : { *(.data) }数据段
5. .bss ALIGN(4) : { *(.bss) *(COMMON) }
分析makefile,里面制定了链接顺序
1. arm-linux-ld -Tleds.lds crt0.o leds.o -o leds_elf
1. -Tleds.lds按照leds.lds的链接地址排放
2. crt0.o leds.o -o leds_elf先放srt0.o的代码段再放leds.o的代码段、只读数据段,数据段等等排列
执行
在虚拟机里在工程目录下执行make生成leds.bin和leds_elf
makefile的规则
makefile命令可以被执行的条件
目标不存在
依赖已更新
以leds为例
条件1:是没有leds.bin这个目标文件
条件2:crt0.S或者leds.c发生了更新(更改)
编译和链接放在一起
hello : hello.c a.c
gcc -o hello hello.c a.c
编译和链接分开
hello : hello.o a.o//heool依赖于hello.o和a.o,先在下面去找hello.o再找a.o,然后执行下一条
gcc -o hello hello.c a.c
hello.o : hello.c//找到hello.o
gcc -o hello.o -c hello.c
a.o : a.c
gcc -o a.o -c a.c
改进的makefile
hello : hello.o a.o
gcc -o $@ $^
//用$@表示目标,$^代表了两个依赖
%.o : %.c
//%代表任一名字,凡是name.o都是依赖于name.c
gcc -o $@ -c $< //$<表示了一个依赖
clean :
//clean是一个虚拟指令,执行make clean一定会执行下面那条语句
rm *.o hello
介绍gcc选项