【Linux裸机实验】LED实验

 所有文件:

【Linux裸机实验】LED实验_第1张图片

.vscode: Visual Studio Code工程文件

SI:Source Insight工程文件

imxdownload:SD卡烧写工具

  •  编写汇编部分(start.S)
.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中 					*/

        /*DDR3 地 址 范 围 是 0X80000000~0XA0000000(512MB) 或 者0X80000000~0X90000000(256MB) */
	ldr sp, =0X80200000	/* 设置栈指针			 */
	b main				/* 跳转到main函数 		 */
  • 编写Makefile 
/*定义变量objs,包含start.o main.o (注意:start.o 在前)*/
objs := start.o main.o

/*生成最终的可执行文件 ledc.bin*/
ledc.bin:$(objs)
        /*链接 【imx6ul.lds】为链接脚本文件 【$^】的意思是所有依赖文件的集合,即objs变量的值*/
	arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^
        /*将 ledc.elf 文件转为 ledc.bin 【$@】的意思是目标集合,即ledc.bin*/
	arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
        /*反汇编 生成ledc.dis*/
	arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis

/*针对不同的文件类型将其编译成对应的.o 文件 【$<】的意思是依赖目标集合的第一个文件,即start.s*/	
%.o:%.s
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
	
%.o:%.S
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<
	
%.o:%.c
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -O2 -o $@ $<

/*通过命令“make clean”可以清理工程*/	
clean:
	rm -rf *.o ledc.bin ledc.elf ledc.dis
	
  • 编写链接脚本(imx6ul.lds
SECTIONS{
        /* “.”在链接脚本里面叫做定位计数器,代码链接到以 0X87800000为起始地址的地方*/
	. = 0X87800000;
        /* “.text”是段名, “*”是通配符,表示所有输入文件的.text段都放到“.text”中*/
	.text :
	{
		start.o 
		main.o 
		*(.text)
	}
        /* “.rodata ”是段名, “ALIGN(4)”表示 4 字节对齐*/  
	.rodata ALIGN(4) : {*(.rodata*)}  
        /* “.data”是段名, “ALIGN(4)”表示 4 字节对齐*/   
	.data ALIGN(4)   : { *(.data) }    
        /*.bss 段的起始地址和结束地址就保存在了“__bss_start”和“__bss_end”中*/  
	__bss_start = .;    
	.bss ALIGN(4)  : { *(.bss)  *(COMMON) }    
	__bss_end = .;
}

 

你可能感兴趣的:(#,Linux学习之路)