LCD实验学习笔记(一):Makefile
主Makefile总领全局的就这句——
lcd.bin: $(objs)
要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o serial.o lcddrv.o framebuffer.o lcdlib.o main.o lib/libc.a
所以要先找到这些文件,几个.o,还有一个.a
.o目标文件怎么生成?
%.o:%.c和%.o:%.S是生成规则,就是依赖于.c或.S文件,使用交叉编译命令生成。
.a是库文件,到lib子目录里去找,在子目录里用make命令生成
下面逐行解读:
CC = arm-linux-gcc //编译器。定义CC变量,为了简化书写
LD = arm-linux-ld //连接器。定义LD变量,为了简化书写
AR = arm-linux-ar //库管理器。将多个可重定位的目标模块归档为一个函数库文件。这个变量在lib/makefile文件中使用了
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump
INCLUDEDIR := $(shell pwd)/include //定义头文件目录变量 $(shell pwd)为获取当前工作路径
CFLAGS := -Wall -O2 //GCC的编译参数 -Wall显示所有编译错误或警告 -O2优化选项,编译时使用2级优化
CPPFLAGS := -nostdinc -I$(INCLUDEDIR) //GCC编译参数 -nostdinc忽略缺省目录 -Idir把dir加到头文件的搜索路径中,而且gcc会在搜索标准头文件之前先搜索dir.
备注:‘=’与‘:=’的区别:
“=”:make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
export CC LD AR OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS //这些变量将传递到下级Makefile,本文件中指的是生成lib/libc.a库文件时的Makefile
objs := head.o init.o nand.o interrupt.o serial.o lcddrv.o framebuffer.o lcdlib.o main.o lib/libc.a //定义变量objs,包含了生成目标文件所需的文件
lcd.bin: $(objs) //定义生成目标lcd.bin,依赖于objs对象。执行这条命令时,先生成所有依赖文件,然后依次执行下面三条命令
${LD} -Tlcd.lds -o lcd_elf $^ //执行shell命令,LD变量前面定义”LD = arm-linux-ld“,即进行连接,使用lcd.lds为连接脚本,输出目标为lcd_elf,$^表示全部依赖文件
${OBJCOPY} -O binary -S lcd_elf $@ //执行shell命令,将lcd_elf文件转换成二进制文件,-O表示输出格式,-S表示不从源文件中复制重定位信息和符号信息到目标文件中
${OBJDUMP} -D -m arm lcd_elf > lcd.dis //反汇编lcd_elf文件为lcd.dis文件
.PHONY : lib/libc.a //.PHONY表示伪目标,不要管lib/libc.a文件是否存在
lib/libc.a: //当生成依赖文件lib/libc.a文件时,用下面的命令段,即cd lib; make; cd ..
cd lib; make; cd .. //进入lib目录,然后执行make命令,最后返回到当前目录。在lib子目录执行make命令时将使用子目录的Makefile,但于由前面export命令,本文件定义的一些变量将传递过去
%.o:%.c //%通配符。生成xxx.o文件先要找到xxx.c文件
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< //-c编译不连接。$@表示目标文件 $<表示第一个依赖文件
%.o:%.S
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
clean: //这个clean目标没有依赖对象,肯定是生成不了clean文件的,但会执行下面的命令。前面写明.PHONY : clean就更清楚了
make clean -C lib
rm -f lcd.bin lcd_elf lcd.dis *.o
LCD实验学习笔记(一):Makefile的更多相关文章
- LCD实验学习笔记(十):TFT LCD
硬件组成: REGBANK是LCD控制寄存器组,含17个寄存器及一块256*16的调色板,用来设置参数. LCDCDMA中有两个FIFO,当FIFO空或数据减少到阈值,自动发起DMA传输,从内存获取图 ...
- LCD实验学习笔记(二):head.S
ARM加电后从0地址开始取指执行. 连接为bin文件时时,连接脚本lcd.lds指定将head.o放在开头,所以head.S就是系统起步的地方. head.S开头就是异常向量定义,0地址就是reset ...
- LCD实验学习笔记(九):UART
s3c2440包含三个通用异步收发器,可工作于中断模式或DMA模式.每个UART包含两个64字节的FIFOs用于接收和发送数据.可编程设置波特率.1或2个停止位,5/6/7/8个数据位和奇偶校验状态. ...
- LCD实验学习笔记(八):中断
s3c2440有60个中断源(其中15个为子中断源). 31个32位的通用寄存器,6个程序状态寄存器.有6种工作模式(系统/用户模式,快中断模式,管理模式,数据访问中止模式,中断模式,未定指令中止模式 ...
- LCD实验学习笔记(七):NAND FLASH
s3c2440 CPU内置NAND FLASH控制器.相关寄存大器起始地址为0x4e000000. 通过设置NFCONF寄存器,设置NAND FLASH 时序. 通过设置NFCONT寄存器,使能NAN ...
- LCD实验学习笔记(六):存储控制器
s3c2440可使用地址空间为1GB(0x00000000到0x40000000). 1G空间分为8个BANK,每个BANK为128MB. 设27条地址线,和8个片选引脚(nGCS0-nGCS7). ...
- LCD实验学习笔记(五):MMU
内存管理分别页表机制和内存分配机制两块. 页表机制就是管理设备真实物理地址与虚拟地址的动态或静态的映射,基于cpu内部的mmu(内存管理单元)进行. CP15(协处理器)的C0(缓存)是一级页表,含4 ...
- LCD实验学习笔记(四):系统时钟
一般CPU频率(FCLK)高于内存.网卡等设备频率(HCLK),而串口.USB.I2C等设备频率(PCLK)更低. 系统时钟: 系统时钟源为晶振,初始频率12MHz. 通过设置MPLLCON寄存器的M ...
- LCD实验学习笔记(三):WATCH DOG
看门狗是为了能够防止程序跑飞用的.程序应该定时的去喂狗.如果程序跑飞了,那么就不会去喂狗了.如果超过了喂狗的时间,那么狗就会生成一个信号来reset CPU.一般程序不需要,特殊情况下需要这种机制. ...
随机推荐
- JavaScript RegExp 身份证、账号密码、email正则
什么是正则表达式 正则表达式是构成搜索模式. 在文本中搜索数据时,可以使用此搜索模式来描述正在搜索的内容. 正则表达式可以是单个字符,也可以是更复杂的模式. 正则表达式可用于执行所有类型的文本搜索和文 ...
- 使用CodeBlocks为你的程序添加程序文件图标和启动读入图标
其实也非常简单,自己这两天用win32api做了一个小程序,可是发现图标却是dos的,太难看了,于是就想起以前学win32汇编时候用到的工具,ResEd,已经被我汉化了一些,估计有新的版本发布吧,但是 ...
- SQL 基础笔记(三):约束
个人笔记不保证正确. 数据类型是限制我们可以在表里存储什么数据的一种方法.不过,对于许多应用来说, 这种限制实在是太粗糙了.比如,一个包含产品价格的字段应该只接受正数. 但是没有哪种标准数据类型只接受 ...
- JavaScript - arguments object
The arguments object is an Array-like object corresponding to the arguments passed to a function. fu ...
- URAL 1932 The Secret of Identifier(容斥)
Description Davy Jones: You've been captain of the Black Pearl for 13 years. That was our agreement. ...
- 阿里云服务器 linux下载 jdk
直接从本地下载包上传比较慢.直接在服务器上下载安装包: 1.进入orcle官网; 2.选择需要下载的版本,下载需要同意orcle协议, 3.点击下载,获取到下载请求的cookie, 复制所有cooki ...
- C语言单元测试
转自http://blog.csdn.net/colin719/article/details/1420583 对于敏捷开发来说,单元测试必不可少,对于Java开发来说,JUnit非常好,对于C++开 ...
- PokeCats开发者日志(六)
现在是PokeCats游戏开发的第九天的晚上,终于将这玩意提交到360移动开放平台进行审核了. 貌似很多平台都需要看这个著作权证明,得了,那我就话400块钱走一遍流程玩玩吧! 办理著作权还 ...
- LoadRunner系统架构简介与运行原理
1.LoadRunner系统架构简介 LoadRunner是通过创建虚拟用户来代替真实实际用户来操作客户端软件比如Internet Explorer,来向IIS.Apache等Web服务器发送HTTP ...
- 【SSH】——梳理三大框架
[前言] 去年软考,从System.out.println("Hello World!")开始,小编也算是进入java的世界了.转战java以后,虽然仍旧在学习.NET的知识,但越 ...