共计 2369 个字符,预计需要花费 6 分钟才能阅读完成。
九、C 语言版 LED 试验工程治理
工程治理次要是在 Makefile 中会对一些源文件的地址援用和输入文件地址定位,依照学习指南的给出的公共构造如图,对于该目录构造的工程,编写 Makefile 如下。
CROSS_COMPILE ?= arm-linux-gnueabihf- # ?= 如果没有定义,则定义为
TARGET ?= bsp
CC := $(CROSS_COMPILE)gcc
LD := $(CROSS_COMPILE)ld
OBJCOPY := $(CROSS_COMPILE)objcopy
OBJDUMP := $(CROSS_COMPILE)objdump
# \ 是换行符,示意下一行与这一行为同一行。INCDIRS 是所有头文件的文件夹
INCDIRS := imx6ul \
bsp/clk \
bsp/led \
bsp/delay
# SRCDIRS 源代码所在的文件夹
SRCDIRS := project \
bsp/clk \
bsp/led \
bsp/delay
# 应用 patsubst 函数把 INCDIRS 中的每一个文件夹替换成 -I $(folder) 的格局,因为 Makefile 指明头文件目录时 须要在后面加上 -I
INCLUDE := $(patsubst %, -I %, $(INCDIRS))
# 先应用 foreach 函数取出 SRCDIRS 每个文件,而后用 wildcard 函数匹配出.S 结尾的文件,匹配出的文件带目录门路
SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
# 先应用 notdir 函数去除门路
SFILENDIR := $(notdir $(SFILES))
CFILENDIR := $(notdir $(CFILES))
# 先应用变量替换,把 SFILENDIR 外面的.S 文件替换成.o 文件,而后用 patsubst 给这些文件带上门路 obj/
SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS := $(SOBJS) $(COBJS)
# 指定搜寻目录 VPATH,应用 VPATH 指明源文件门路,如果不指明,make 只会在以后的目录中去找寻依赖文件和指标文件
VPATH := $(SRCDIRS)
.PHONY: clean
# bsp.bin 依赖 obj/ 目录下的 .o 文件,因为以后 obj/ 目录下还为空,会执行上面的依赖
$(TARGET).bin : $(OBJS)
$(LD) -Timx6ul.lds -o $(TARGET).elf $^
$(OBJCOPY) -O binary -S $(TARGET).elf $@
$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
# obj/ 目录上面的 .o 文件依赖于 .S 文件
$(SOBJS) : obj/%.o : %.S
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
$(COBJS) : obj/%.o : %.c
$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<
clean:
rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)
这里的链接脚本与之前的基本一致,就是要留神 .text
外面的 文件要加门路 obj/start.o
十、U-Boot 应用试验
(1)Linux 移植介绍
Linux 的移植较,在移植 Linux 之前咱们须要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核,bootloader 有很多,罕用的就是 U-Boot。移植好 U-Boot 当前再移植 Linux 内核,移植完 Linux 内核当前 Linux 还不能失常启动,还须要再移植一个根文件系统 (rootfs),根文件系统外面蕴含了一些最罕用的命令和文件。所以 U-Boot、Linux kernel 和 rootfs 这三者一起形成了一个残缺的 Linux 零碎,一个能够失常应用、功能完善的 Linux 零碎。
(2)编译 U -boot
用晚点原子给出的 Uboot,放到文件夹下后,先解压缩 tar -vxjf uboot-imx-2016.03-2.1.0-ge468cdc-v1.5.tar.bz2
。原本很简略,没想到在编译的过程中,呈现了 cp: write error: No space left on device
,前面用命令 df -h
一查,原来是虚拟机的存储空间满了。删了一些货色后,转念一想不如间接建一个软连贯,间接能够在 Linux 虚拟机里不便的用 Windows 外面的文件,于是应用命令 ln -s /media/sf_Share ~/share.soft
建了一个软连贯。接着就是开始编译发现又失败了,这此的起因又是上面的提醒,再一看,应该是创立的软链接跨了磁盘,而后在 mkae 外面又尝试创立 ln 硬链接,留神到硬链接不能跨分区。试了试不在软连贯外面应用 ln
,发现还是不行,应该是在加载的盘符中无奈创立硬链接吧,前面查到,建设硬链接时,链接文件和被链接文件必须位于同一个文件系统中,并且不能建设指向目录的硬链接,于是只能等今天再试试了。
ln -fsn $dest arch/arm/include/asm/arch
ln: failed to create symbolic link 'arch/arm/include/asm/arch': Operation not permitted
果然第二次尝试,把整个目录拷贝到了 home 目录下,而后编译,就编译胜利了。用到的指令如下,因为我只有四个核,所以最初一行的 j12
改成了 j4
编译胜利后的提醒如下: