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.一般程序不需要,特殊情况下需要这种机制. ...
随机推荐
- CDateTimeUI类源码分析
CDateTimeUI是duilib里选择日期的控件,继承于CLabelUI控件,用于记录已经选择的日期,选择控件则是调用win32的日期选择控件. CDateTimeUI包含两个类,一个是CDate ...
- 03-Mysql数据库----安装与管理
本节掌握内容: mysql的安装.启动 mysql破解密码 统一字符编码 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的 ...
- 为什么logstash进程的CPU使用率100%?
机器上有个进程cpu使用率很高,近100%了, Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie%Cpu(s): 99.0 ...
- C#非托管跨线程委托调试
使用C#调用mingw的so文件,拿视频数据回wpf的界面进行显示,注册了回调函数.C++在调用回调函数时遇到了委托被回收的问题,提示:“类型的已垃圾回收委托进行了回调.这可能会导致应用程序崩溃.损坏 ...
- windows基础知识(win7)
右击 显示: 对设备进行管理: 在计算机属性中,开远程连接 控制面板: 控制面板下的操作中心: 控制面板下的管理工具: 控制面板下的默认程序: 控制面板下的日期时间: 控制面板下的鼠标: 控制面板下的 ...
- mongodb数据库高级操作
1.创建索引 2.索引名称 3.其他索引 4.explain 5.操作索引 6.高级特性 7.固定集合 8.导入导出 9.上锁 10.添加用户 11.主从复制
- MySQL日常管理
DB2最佳分页语句 SELECT * FROM ( SELECT inner2_.*, ROWNUMBER() OVER(ORDER BY ORDER OF inner2_) AS rownumber ...
- ubuntu中执行truffle build出现问题
进行build之前,采用默认构建器方式创建客户端,先安装默认构建器: npm install truffle-default-builder --save 然后需要修改truffle.js配置文件如下 ...
- android命令模式IntentService 远程下载文件
服务可用在一下情景: 1,用户离开activity后,仍需要继续工作,例如从网络下载文件,播放音乐. 2,无论activity出现或离开,都需要持续工作,例如网络聊天应用. 3,连接网络服务,正在使用 ...
- asp.net文件上传进度条研究
文章:asp.net 文件上传进度条实现代码