文章目录
- 一、关于链接脚本文件
- 二、start.s
- 三、工程管理
- 3.1 bsp
- 3.2 im6ull
- 3.3 obj
- 3.4 project
- 四、makefile
 
一、关于链接脚本文件
imx6ul.lds
SECTIONS{
	. = 0X87800000;
	.text :
	{
		start.o 
		main.o 
		*(.text)
	}
	.rodata ALIGN(4) : {*(.rodata*)}     
	.data ALIGN(4)   : { *(.data) }    
	__bss_start = .;    
	.bss ALIGN(4)  : { *(.bss)  *(COMMON) }    
	__bss_end = .;
}SECTIONS{:开始定义段的布局。
. = 0X87800000;:设置当前地址为0x87800000,这通常是程序的起始地址。
.text ::定义一个名为.text的段,用于存放程序的代码。
{:开始列出.text段中包含的文件。
start.o:包含名为start.o的对象文件,这通常是程序的启动代码。
main.o:包含名为main.o的对象文件,这通常是程序的主函数。
*(.text):包含所有其他.text段的对象文件。
}:结束.text段的定义。
.rodata ALIGN(4) : {(.rodata)} :定义一个名为.rodata的段,用于存放只读数据,并且要求地址按照4字节对齐。这里.rodata*模式匹配所有以.rodata开头的段。
.data ALIGN(4) : { *(.data) } :定义一个名为.data的段,用于存放初始化的数据,并且要求地址按照4字节对齐。
__bss_start = .;:定义一个符号__bss_start,它的值是当前地址,通常用于标记未初始化数据段(BSS段)的开始。
.bss ALIGN(4) : { (.bss) (COMMON) } :定义一个名为.bss的段,用于存放未初始化的数据,并且要求地址按照4字节对齐。(.bss)匹配所有.bss段的对象文件,(COMMON)匹配所有公共符号。
__bss_end = .;:定义一个符号__bss_end,它的值是当前地址,通常用于标记BSS段的结束。
}:结束SECTIONS的定义。
SECTIONS{ 
 . = 0X10000000; 
 .text : {*(.text)} 
  . = 0X30000000; 
   .data ALIGN(4) : { *(.data) } 
    .bss ALIGN(4) : { *(.bss) } 
     }“*”是通配符,表示所有输入文件的 .text段都放到“ “.text”中。
 data和bss也是这样
二、start.s
中断向量表、初始化C环境
.global _start  		/* 全局标号 */
/*
 * 描述:	_start函数,程序从此函数开始执行,此函数主要功能是设置C
 *		 运行环境。
 */
_start:
	/* 进入SVC模式 */
	mrs r0, cpsr
	bic r0, r0, #0x1f 	/* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 	*/
	orr r0, r0, #0x13 	/* r0或上0x13,表示使用SVC模式					*/
	msr cpsr, r0		/* 将r0 的数据写入到cpsr_c中 					*/
	ldr sp,=0X80200000	/* 设置栈指针			 */
	b main				/* 跳转到main函数 		 */三、工程管理
3.1 bsp
存放驱动文件
 比如时钟驱动、LED驱动、延时驱动
3.2 im6ull
跟芯片相关的文件
 cc.h、 fsl_common.h、 fsl_iomuxc.h和 MCIMX6Y2.h
3.3 obj
存放.o文件
3.4 project
存在start.S、main.c等应用文件
四、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 		:= imx6ul \
				   bsp/clk \
				   bsp/led \
				   bsp/delay 
				   			   
SRCDIRS			:= project \
				   bsp/clk \
				   bsp/led \
				   bsp/delay 
				   
				   
INCLUDE			:= $(patsubst %, -I %, $(INCDIRS))
SFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))
SFILENDIR		:= $(notdir  $(SFILES))
CFILENDIR		:= $(notdir  $(CFILES))
SOBJS			:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS			:= $(SOBJS) $(COBJS)
VPATH			:= $(SRCDIRS)
.PHONY: clean
	
$(TARGET).bin : $(OBJS)
	$(LD) -Timx6ul.lds -o $(TARGET).elf $^
	$(OBJCOPY) -O binary -S $(TARGET).elf $@
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis
$(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)要改的话,主要是更改INCDIRS、SRCDIRS
                










