嵌入式linux第一课之环境搭建及工具、概念介绍

源码编辑、查看源码工具:source insight

具体操作

  1. 先建立新工程,project
  2. 加入文件
  3. 同步文件project->Synchronize Files(方便查找原函数和文件)
    Ctrl+左键:查看函数在哪里有定义,变量同样适用
    Alt+逗号:回退到上一个界面

如何使用source insight编译Linux裸机代码

远程登录/串口工具,文件传输工具,TFTP服务器程序:MobaXterm

MobaXterm的具体使用
查看Ubuntu的ID,在Ubuntu里面的命令行(terminal)输入ifconfig
linux的ip和电脑的IP应当处于同一个网段(如果网段不同,则通过sudo ifconfig eth1 192.168.1.5来进行更改),因此要先观察电脑的IP(在命令行(cmd)输入ipconfig)

用虚拟机时,想要windows和虚拟机能够互通,需要对虚拟机进行设置

  1. 虚拟机和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

命令能够执行的条件是什么?

  1. 目标不存在(既没有hello这个文件)
  2. 依赖已更新(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,这里就不多介绍

总结
  1. 需要传输的文件有makefile里面涉及的文件,用FTP进行传输,在hello程序里面只需要传输hello.c和a.c文件。
  2. 在ubuntu用vi makefile输进连接内容(用cd进入文件所在的目录),命令的输入可通过SSH窗口进行命令的输入。(在过程中会产生其他文件,有目标文件,也有可能会产生.o文件,是否产生.o文件得看makefile怎么写)
  3. 用make将所有文件链接生成可执行文件。(注意可生成可执行文件的条件)

注意:整个过程中有windows端与linux端的应用程序开发对比以及嵌入式程序开发对比,根本的区别是在linux中执行命令是是用gcc还是用gcc-linux-ld,要注意区分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值