源码编辑、查看源码工具:source insight
具体操作
- 先建立新工程,project
- 加入文件
- 同步文件project->Synchronize Files(方便查找原函数和文件)
Ctrl+左键:查看函数在哪里有定义,变量同样适用
Alt+逗号:回退到上一个界面
远程登录/串口工具,文件传输工具,TFTP服务器程序:MobaXterm
MobaXterm的具体使用
查看Ubuntu的ID,在Ubuntu里面的命令行(terminal)输入ifconfig
linux的ip和电脑的IP应当处于同一个网段(如果网段不同,则通过sudo ifconfig eth1 192.168.1.5来进行更改),因此要先观察电脑的IP(在命令行(cmd)输入ipconfig)
用虚拟机时,想要windows和虚拟机能够互通,需要对虚拟机进行设置
- 虚拟机和windows必须在同一个网段
2.看下图配置
现在进行远程登录,使用工具MobaXterm_Personal
使用session里面的SSH
登入成功之后就可以远程登录linux对其进行操作,不用管虚拟机了,把它开着就好。
登录FTP
使用session里面的FTP,输入linux主机IP还有用户名即可
FTP主要用于电脑和linux端的文件传送
新建串口连接
串口接在开发板理电源较远处的串口
开始编译文件
首先将Hello文件传输到linux系统中,Hello文件的内容A.c和Hello.c
A.c的内容
#include <stdio.h>
void a_fun(void)
{
printf("It is in A\n");
}
Hello.c的内容
extern void a_fun(void);
int main(int argc, char* argv[])
{
printf("Hello world !\n");
a_fun();
return 0;
}
如上图,运行完gcc -o Hello Hello.c A.c后就产生多一个文件出来,
Hello为新生成的可执行程序
执行该可执行文件:./Hello(./的意思是执行当前目录下的可执行程序),执行结果如下图:
makefile的由来
将上述的“gcc -o Hello Hello.c A.c”写入makefile中,用make命令即可执行如上操作,因此不用将命令一个一个的写
上述的是PC端(比如用VC6.0)和linux端执行代码的区别
接下来将来讲解嵌入式端和linux端的区别
linux下的编译
图中crt0.S 和leds.c都是源文件,leds.lds是链接脚本,还有个makefile
链接脚本用来指定链接地址,用命令行来链接程序时的排列顺序就是链接顺序,编译用命令行,这些东西都可以写在makefile里面,用make就可以编译了
leds程序里面makefile的内容,makefile解决的问题是链接顺序
CFLAGS := -Wall -Wstrict-prototypes -g -fomit-frame-pointer -ffreestanding
all : crt0.S leds.c
arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S
arm-linux-gcc $(CFLAGS) -c -o leds.o leds.c @-c,只编译不链接
arm-linux-ld -Tleds.lds crt0.o leds.o -o leds_elf @1. 这一条是链接命令,解释看下方解释
arm-linux-objcopy -O binary -S leds_elf leds.bin
arm-linux-objdump -D -m arm leds_elf > leds.dis
clean:
rm -f leds.dis leds.bin leds_elf *.o
@1. 意思是依照链接脚本进行链接,这个crt0.o在前面,leds.o的代码段在后面,首先是crt0.o和leds.o的text代码段(有先后顺序),接着是crt0.o和leds.o的只读数据段,后面以此类推。最后直接在linux环境下输入make就可以了
leds.lds文件里面的内容,该文件解决的问题是链接脚本来指定链接地址
SECTIONS {
. = 0x00; @等于0表示程序从当前地址开始排放,排放什么东西呢
.text : { *(.text) } @首先是text代码段
.rodata ALIGN(4) : {*(.rodata)} @接下来是只读数据段,再往下就是data,bss
.data ALIGN(4) : { *(.data) } @“*”表示所有文件,这里的所有文件指的是crt0.S和leds.c两个文件的代码段,只读数据段,data、bss和COMMON
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
crt0.s里面的内容如下,而这些文件编译在可执行文件的开始
.text
.global _start
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启
ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop
Makefile
makefile是什么东西?
基本核心是规则,规则是:
目标 : 依赖(可以有多个依赖)
“TAB”键 + 命令
例子,一开始的Hello程序,目标是生成Hello的应用程序
Hello : hello.c a.c
gcc -o hello hello.c a.c
命令能够执行的条件是什么?
- 目标不存在(既没有hello这个文件)
- 依赖已更新(hello.c a.c已修改)
自己写makefile文件,makefile的内容如下:
hello : hello.c a.c
gcc -o hello hello.c a.c
如何形成makefile
在Ubuntu里面的命令行输入vi makefile,把内容输进去
编译和链接是分开的,而上面的程序已经将编译和链接放一块了,我们接下来把编译和链接分开。
改后的程序内容
hello : hello.o a.o
gcc -o hello hello.o a.o
hello.o : hello.c
gcc -o hello.o -c hello.c @-c的作用是只编译不链接
a.o : a.c
gcc -o a.o -c a.c
这样做的好处是什么呢?为什么用的是".o" 文件呢?
一开始的目标是生成hello,但是一开始没有hello.o和a.o两个文件。
依赖不存在,因此想生成目标,就必须先生成依赖,故要以依赖为名查找下方的规则来匹配。然后生成hello.o。
用这个执行便会比之前还要多生成hello.o和a.o程序
用这种方法的话,当hello.c被修改,执行命令时只编译hello.c,a.c不用编译,然后再进行链接。
makefile的语法还是挺复杂的,需要时请查看[链接](file:///E:/%E5%B5%8C%E5%85%A5%E5%BC%8Flinux/%E5%BC%80%E5%8F%91%E6%9D%BF%E8%B5%84%E6%96%99/%E6%95%99%E7%A8%8B%E6%B6%89%E5%8F%8A%E7%9A%84%E8%B5%84%E6%96%99/GNU/gunmake.htm)
makefile可用通配符来表示,因为如上所示,很多文件都很相似,有没有方便的方法进行书写呢?这个时候就要用上通配符。具体运用如下:
hello : hello.o a.o
gcc -o $@ $^ @两个依赖用$^来表示
%.o : %c.
gcc -o $@ -c $< @目标可以用$@来表示,第一个依赖可以用$<来表示,从而代替两条规则
clean :
rm *.o hello
在命令行中使用make clean才会执行删除操作
对gcc的语法可以看书本,比如gcc-linux-ld,这里就不多介绍
总结
- 需要传输的文件有makefile里面涉及的文件,用FTP进行传输,在hello程序里面只需要传输hello.c和a.c文件。
- 在ubuntu用vi makefile输进连接内容(用cd进入文件所在的目录),命令的输入可通过SSH窗口进行命令的输入。(在过程中会产生其他文件,有目标文件,也有可能会产生.o文件,是否产生.o文件得看makefile怎么写)
- 用make将所有文件链接生成可执行文件。(注意可生成可执行文件的条件)
注意:整个过程中有windows端与linux端的应用程序开发对比以及嵌入式程序开发对比,根本的区别是在linux中执行命令是是用gcc还是用gcc-linux-ld,要注意区分。