当前位置: 首页 > article >正文

正点原子阿尔法ARM开发板-IMX6ULL(七)——BSP工程管理实验(补:链接文件和.s文件)

文章目录

  • 一、关于链接脚本文件
  • 二、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


http://www.kler.cn/a/316251.html

相关文章:

  • opencv常用api
  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • 认识一下Unicorn
  • Ceph 中Crush 算法的理解
  • Jetpack 之 Ink API初探
  • 建筑施工特种作业人员安全生产知识试题
  • 【C++】【网络】【Linux系统编程】单例模式,加锁封装TCP/IP协议套接字
  • 【MyBatis 源码拆解系列】MyBatis 运行原理 - 读取 xml 配置文件
  • 怎么在PPT中嵌入字体?2个做ppt的实用技巧,不容错过!
  • 深入解读 iVector:语音识别与说话人识别领域的关键技术
  • 食品安全群众满意度调查流程
  • 基于Python的自然语言处理系列(14):TorchText + biGRU + Attention + Teacher Forcing
  • 2016年国赛高教杯数学建模D题风电场运行状况分析及优化解题全过程文档及程序
  • 【python】字面量
  • 计算机毕业设计之:基于uni-app的校园活动信息共享系统设计与实现(三端开发,安卓前端+网站前端+网站后端)
  • Redis主从架构原理
  • sensitive-word 敏感词 v0.20.0 数字全部匹配,而不是部分匹配
  • Hive企业级调优[2]—— 测试用表
  • 生动好看的css卡片样式
  • pytorch 48 基于voc2012数据集对yolov10s模型进行剪枝尝试
  • 【JavaEE初阶】文件IO(上)
  • 阿里云kafka消息写入topic失败
  • 【Nginx】Nginx 使用 SSL 的详细指南
  • 内核是如何发送数据包
  • Python国产新 ORM 框架 fastzdp_sqlmodel 快速入门教程
  • AI时代保持并提升自身的核心竞争力