从裸机到系统
第一章 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工程管理就完成了