首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

S5PV210通用Makefile文件编写记录

S5PV210通用Makefile文件编写记录

S5PV210通用Makefile文件编写记录

   最近在学习S5PV210开发相关的知识,因为是入门一切都是新的,
   目前还是点灯阶段(哈哈哈哈),学习了rocky大佬讲的通用Makefile的编写
   感觉真的很好,写下来希望能帮助和我一样的刚入门的小白。
   之前也了解了一点点的Makefile文件编写比如说LED灯的Makefile文件编写
   一般情况下,我们在LED灯这节会看到Makefile基本上是这样的:

   
led_on.bin:led_on.S
        arm-linux-gcc -c -o led_on.o led_on.S
        arm-linux-ld  -Ttext 0x30000000 led_on.o -o led_on.elf
        arm-linux-objcopy -O binary -S led_on.elf led_on.bin

clean:
        rm -rf *.c *.elf *.bin  *.o



    但是像这种简单的Makefile会有很多弊端,并不通用,每次更改源文件就需要重
新写编写Makeifile文件,这样就给开发带了很多不便。所以我们需要一种通用的
Makefile文件,通用的Makefile需要支持SD卡启动和uboot下直接运行在RAM上
因此我们就要明白这两种方式下有什么主要的区别:
    1)程序运行时的地址不同。DDR:0X20000000、SD卡:0x0;
    2)SD卡,需要校验头信息,而RAM不需要加头校验信息。

在这种前提下我们还希望Makefile具有变量集合的概念 。
具体Makile代码如下:

  

#*.S、*.c -------->*.o---------->BUILD---------->BUILD.bin
#Designed by rocky for S5PV210
#define var                          #定义变量
TARGET := led.bin                    #定义最终目标文件(TARGET)名称为led.bin
BUILD  := led                        #*.o文件通过链接后生成BUILD文件此处命名为led
ENV    ?= SD                         #通过ENV变量判断启动方式是从SD卡启动还是从RAM启动  
SDTOOLS:= ./mk210                    #如果通过SD卡启动就需要借助官方提供的MK210文件进行辅助启动
COBJS +=start.o                      #最原始文件编译后生成的文件,如果有其他文件可以继续添加此处为start.o
COBJS +=main.o                      #最原始文件,此处为main.o

CROSS_COMPILE :=arm-linux-           #根据不通平台,编译方式不同,此处为arm-linux-交叉编译环境
CC     :=$(CROSS_COMPILE)gcc         #gcc编译器
LD     :=$(CROSS_COMPILE)ld          #ld链接器
OBJCOPY:=$(CROSS_COMPILE)objcopy     #去文件格式的转换工具

CFLAGS += -Wall                      #编译时可以去掉注释(打开所有#)
CFLAGS += -I./inc                    #可以在本层目录寻找相应头文件
LDFLAGS+= -Tmap.lds                  #链接脚本文件map.lds
ifeq ($(ENV),SD)                    #如果是通过RAM进行启动
LDFLAGS+= -Ttext=0X0                 #地址需要设置为0x0
else                                 #如果通过SD卡启动
LDFLAGS+= -Ttext=0x20000000          #地址设置为0x20000000
endif
#Way
all(TARGET)                                #目标文件为TARGET                       
ifeq ($(ENV),RAM)                            #如果通过RAM启动
$(TARGET)(BUILD)
        $(OBJCOPY) -O binary  $^ $@          #直接生成目标文件
else                                         #如果通过SD卡进行启动
$(TARGET)(BUILD)                          
        $(OBJCOPY) -O binary  $^ $@.TMP      #首先生成临时文件
        $(SDTOOLS) $@.TMP  $@                #加入官方提供的校验头
endif

$(BUILD)(COBJS)
        $(LD) $(LDFLAGS)   -o $@ $^          #链接生成BUILD文件

%.o:%.c
        $(CC) $(CFLAGS) -c -o $@ $^          #通过.c生成.o文件
%.o:%.S
        $(CC) $(CFLAGS) -c -o $@ $^          #通过.S生成.o文件


clean:                                      #清除
        rm -f $(TARGET)  $(BUILD) *.o  *.TMP   

   
其中map.lds文件为链接脚本文件,其的作用为
1) 哪一个.o放到代码段的起始位置
2) 所有的.o放到哪个基地址上
3) 代码段、数据段等等是不连续的需要分别指定地址。
代码如下:

OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
        . =0x0;                  #声明起始地址这里设置为0,即在此处不起作用
                                 #因为Makefile中已经指定了地址
        . =ALIGN(4);             #四字节对齐
        .text   :                #代码段   
        {   
                start.o
                *(.text)
        }   
        . =ALIGN(4);
        .rodata :                #只读数据段
        {   
                *(.rodata)   
        }   
        . =ALIGN(4);
        .data   :                #初始化数据段   
        {   
                *(.data)
        }   
        :. =ALIGN(4);
        .bss    :   
        {   
                *(.bss)          #未初始化数据段
        }   
}




以上文件仅供参考学习交流,如有错误,还请指正,侵删。
返回列表