• 嵌入式Linux裸机开发(三)SDK移植及BSP管理


    系列文章目录



    前言

    在前面学习了LED驱动的汇编开发和C语言开发,但是很明显,这太麻烦了,效率太低了。


    BSP工程管理

    所有的源码文件放到工程的根目录下太乱了,于是按照正点原子这样进行文件分类管理
    在这里插入图片描述
    bsp文件放类似我们自己编写的库文件,imx6ul放系统移植的文件,obj放目标文件,project放项目文件

    SDK包移植

    文件移植

    官方编写了SDK包,直接移植就行, NXP 官网只有 I.MX6ULL这一款 Cotex-A 内核的芯片有裸机 SDK 包, 其它 Cotex-A 芯片都没有,所以这些都需要自行编写

    在这里插入图片描述
    我们需要三个文件:
    fsl_common.h:位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_common.h。
    fsl_iomuxc.h: 位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\drivers\fsl_iomuxc.h。
    MCIMX6Y2.h: 位置为 SDK_2.2_MCIM6ULL\devices\MCIMX6Y2\MCIMX6YH2.h。

    但是有很多需要修改的地方,所以建议直接使用正点原子的例程里面修改好的

    补充文件

    数据类型补充文件

    cc.h文件:存放一些SDK文件所用到的数据类型:

    #ifndef __CC_H
    #define __CC_H
    
    /*
     * 自定义一些数据类型供库文件使用
     */
    #define     __I     volatile 
    #define     __O     volatile 
    #define     __IO    volatile
    
    #define ON 		1
    #define OFF		0
    
    typedef   signed          char int8_t;
    typedef   signed short     int int16_t;
    typedef   signed           int int32_t;
    typedef unsigned          char uint8_t;
    typedef unsigned short     int uint16_t;
    typedef unsigned           int uint32_t;
    typedef unsigned long     long uint64_t;
    typedef	  signed char  	 	   s8;		
    typedef	  signed short 	  int  s16;
    typedef	  signed int 		   s32;
    typedef	  signed long long int s64;
    typedef	unsigned char 		   u8;
    typedef	unsigned short int     u16;
    typedef	unsigned int 		   u32;
    typedef	unsigned long long int u64;
    
    
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    启动文件

    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函数 		 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    编写其他需要的文件

    例如前面bsp文件下的clk、delay、led的头文件和C文件

    他这里加了一个imx6ul.h文件,我感觉没必要:

    #ifndef __IMX6UL_H
    #define __IMX6UL_H
    
    #include "cc.h"
    #include "MCIMX6Y2.h"
    #include "fsl_common.h"
    #include "fsl_iomuxc.h"
    
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Makefile文件

    在BSP管理下,这个文件需要一些变化:

    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)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    这个Makefile是一个通用文件,

    • 变量 TARGET 目标名字,不同的例程肯定名字不一一样
    • 变量 INCDIRS 包含整个工程的.h 头文件目录,文件中的所有头文件目录都要添加到变量 INCDIRS中。
      符号“\”,这个相当于“换行符”,表示本行和下一行属于同一行
    • 变量 SRCDIRS,和变量 INCDIRS 一样,只是 SRCDIRS 包含的是整个工程的所有.c 和.S 文件目录。
    • 使用到了函数 patsubst,通过函数 patsubst 给变量 INCDIRS 添加一个“-I”,因为 Makefile 语法要求指明头文件目录的时候需要加上“-I”
    • 变量 SFILES 保存工程中所有的.s 汇编文件(包含绝对路径),变量 SRCDIRS 已经存放了工程中所有的.c 和.S 文件,所以我们只需要从里面挑出所有的.S 汇编文件即可,这里借助了函数 foreach 和函数 wildcard
    • CFILES 和变量 SFILES 一样,只是 CFILES 保存工程中所有的.c 文件(包含绝对路径)
    • 变量 SFILENDIR 和 CFILENDIR 包含所有的.S 汇编文件和.c 文件,相比变量 SFILES 和 CFILES, SFILENDIR 和 CFILNDIR 只是文件名,不包含文件的绝对路径
    • SOBJS 和 COBJS 是.S 和.c 文件编译以后对应的.o 文件目录,默认所有的文件编译出来的.o 文件和源文件在同一个目录中,这里我们将所有的.o 文件都放到 obj 文件夹下
    • 变量 OBJS 是变量 SOBJS 和 COBJS 的集合
    • VPATH 是指定搜索目录的,这里指定的搜素目录就是变量 SRCDIRS 所保存的目录,这样当编译的时候所需的.S 和.c 文件就会在 SRCDIRS 中指定的目录中查找

    链接脚本文件imx6ul.lds

    start.o的路径变了

    SECTIONS{
    	. = 0X87800000;
    	.text :
    	{
    		obj/start.o 
    		*(.text)
    	}
    	.rodata ALIGN(4) : {*(.rodata*)}     
    	.data ALIGN(4)   : { *(.data) }    
    	__bss_start = .;    
    	.bss ALIGN(4)  : { *(.bss)  *(COMMON) }    
    	__bss_end = .;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    最后在移植的时候,记得把增加的文件的目录在Makefile里面加入即可,现在终于可以快速学习了

  • 相关阅读:
    【校招VIP】产品经理设计和思维考察之整体性
    Selector的使用
    基于SSM的进销存管理系统设计与实现
    发现一款自学Java可视化工具神器,非常牛逼,太爱了!
    合成游戏开发方案
    演讲比赛流程管理系统(看看你的星座会赢吗)
    【算法与数据结构】--算法和数据结构的进阶主题--算法的优化和性能调优
    [云原生k8s] Pod基础概念
    MR案例 - 求年度最高气温
    大数据与人工智能人脸识别
  • 原文地址:https://blog.csdn.net/zerokingwang/article/details/133585942