三、IMX6ULL BSP工程管理

从裸机到系统

第一章 IMX6LL裸机点亮一颗LED
第二章 移植IMX6ULL_SDK点亮LED


提示:可以参考之前的文章


一 工程管理

什么是工程管理?
以往我们都是把所有文件放在一个文件夹中,但是这样文件如果数量比较庞大的话会显得工程很混乱,所以需要对文件分类、分模块进行管理,让逻辑更加清晰。

Linux下的工程管理主要就是功能模块化+Makefile


提示:以下是本篇文章正文内容,下面案例可供参考

二 工程创建

新建imx6ul bsp obj project
imx6ul: 存放芯片相关定义文件
bsp:存放外设驱动
obj:存放编译中间件
project:存放应用文件

二、功能模块化

1.文件管理

把fsl_common.h fsl_iomuxc.h MCIMX6Y2.h type.h放入imx6ul 同时创建 imx6ul.h

#ifndef __IMX6UL_H__
#define __IMX6UL_H__

#include "cc.h"
#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "MCIMX6Y2.h"

#endif

在bsp中创建 led clk delay文件夹
led中创建 bsp_led.c bsp_led.h

#ifndef  __BSP_LED_H__
#define __BSP_LED_H__

#include "imx6ul.h"

#define LED0 0

void led_init(void);
void led_switch(int led, int status);

#endif // ! __BSP_LED_H__

#include "bsp_led.h"

void led_init(void)
{
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0);

    IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03, 0x10B0);

    GPIO1->GDIR |= 1<<3;

    GPIO1->DR &=~(1<<3);
}

void led_switch(int led, int status)
{
    switch (led)
    {
    case LED0/* constant-expression */:
        /* code */
        if (status == ON)
        {
            /* code */
            GPIO1->DR &=~(1<<3);
        }
        else if (status == OFF)
        {
            GPIO1->DR |= 1<<3;
        }
        
        break;
    
    default:
        break;
    }
}

clk中创建 bsp_clk.c bsp_clk.h

#ifndef __BSP_CLK_H__
#define __BSP_CLK_H__

#include "imx6ul.h"

void clk_enable(void);

#endif // !__BSP_CLK_H__

#include "bsp_clk.h"

void clk_enable(void)
{
    CCM->CCGR0 = 0xFFFFFFFF;
    CCM->CCGR1 = 0xFFFFFFFF;
    CCM->CCGR2 = 0xFFFFFFFF;
    CCM->CCGR3 = 0xFFFFFFFF;
    CCM->CCGR4 = 0xFFFFFFFF;
    CCM->CCGR5 = 0xFFFFFFFF;
    CCM->CCGR6 = 0xFFFFFFFF;
}

delay中创建 bsp_delay.c bsp_delay.h

#ifndef __BSP_DELAY_H__
#define __BSP_DELAY_H__

#include "imx6ul.h"

void delay(volatile unsigned int n);

#endif // !__BSP_DELAY_H__


#include "bsp_delay.h"

void delay_short(volatile unsigned int n)
{
    while (n--)
    {
        /* code */
    }
    
}

void delay(volatile unsigned int n)
{
    while (n--)
    {
        /* code */
        delay_short(0x7FF);
    }
    
}

把start.s放到project中,同时创建main.c

#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"

int main(int argc, char *argv[])
{
    clk_enable();
    led_init();

    while (1)
    {
        /* code */
        led_switch(LED0, ON);
        delay(500);
        led_switch(LED0, OFF);
        delay(500);
    }
    
    return 0;
}

把imxul.lds链接脚本放到project同级目录,并创建Makefile

2.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)) 
###############################################################################################################
#格式:$(patsubst <pattern>,<replacement>,<text> ) 
#名称:模式字符串替换函数——patsubst。
#功能:查找<text>中的单词(单词以“空格”、“Tab”或“回车”“换行”分隔)是否符合模式<pattern>,如果匹配的话,则以<replacement>替换。
###############################################################################################################

SFILES 			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES 			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

###############################################################################################################
#格式:$(foreach <var>,<list>,<text>)
#名称:用来做循环用的
#功能:把参数<list>;中的单词逐一取出放到参数<var>;所指定的变量中,然后再执行< text>;所包含的表达式。
#每一次<text>;会返回一个字符串,循环过程中,<text>;的所返回的每个字符串会以空格分隔,最后当整个循环结束时,
#<text>;所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
###############################################################################################################

###############################################################################################################
#格式:$(wildcard PATTERN...)
#名称:获取工作目录下的.c文件列表
#功能:获取工作目录下的.c文件列表
###############################################################################################################

###############################################################################################################
#格式:$(notdir 文件列表)
#名称:剥离文件的绝对路径,只保留文件名。
#功能:剥离文件的绝对路径,只保留文件名。
###############################################################################################################

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)

到此bsp工程管理就完成了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦成大佬的第N天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值