注册 登录
电子技术论坛 返回首页

leon1984的个人空间https://bbs.elecfans.com/?1158792[收藏][复制][分享][RSS]

博客

【Altera博客大赛】自制处理器OpenMIPS移植ucos-II过程之6——创建Makefile ... ...

已有 1759 次阅读2014-1-7 15:49

已经到了这一步了,前面不远处就是终点,小伙伴们再加把劲。
这一步包括链接脚本、Makefile的建立,主要参考了OR1200平台上移植的ucos-II的相关文件。
第一步:新建链接脚本文件ram.ld,可以参考OR1200源代码中包含的μC/OS-II的ram.ld,内容如下,重点是单独声明一个vectors sec tion,占用低0x80空间,用来存放的异常处理例程入口地址,其余的可执行程序放在地址0x80以后的空间:

MEMORY
{
vectors : ORIGIN = 0x00000000, LENGTH = 0x00000080
ram : ORIGIN = 0x000080, LENGTH = 0x00200000 - 0x00000080
}
SECTIONS
{
.vectors :
{
*(.vectors)
} > vectors

.text : {
*(.text)
_endtext = .;
} > ram

.rodata : {
*(.rodata);
*(.rodata.*)
} > ram

.sbss :
{
*(.sbss)
} > ram

.scommon :
{
*(.scommon)
} > ram

.data : {
sdata = .;
_sdata = .;
*(.data)
*(.sdata)
edata = .;
_edata = .;
} > ram

.bss SIZEOF(.data) + ADDR(.data) :
{
sbss = . ;
_sbss = . ;
__bss_start = ALIGN(0x8);
___bss_start = ALIGN(0x8);
*(.bss)
*(COMMON)
end = ALIGN(0x8);
_end = ALIGN(0x8);
__end = ALIGN(0x8);
ebss = .;
_ebss = .;
} > ram

.stack :
{
*(.stack)
_stack_addr = .;
} > ram
}

第二步:建立Makefile、config.mk文件,保存在ucos-II目录下,其中Makefile如下,从中可以知道以来的library有openmips.o、ucos.o、port.o,这三个文件在后面几步添加的Makefile中得到。
最终编译要得到的是三个文件:ucos.om、ucos.bin、ucos.asm,其中ucos就是要下载flash中的二进制文件,ucos.asm是反汇编文件,只是用来便于调试的:

ifndef CROSS_COMPILE
CROSS_COMPILE = mips-sde-elf-
endif

exportCROSS_COMPILE

#########################################################################

TOPDIR:= $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
exportTOPDIR

include $(TOPDIR)/config.mk

# order is important here:
SUBDIRS= common ucos port

LIBS =common/openmips.o ucos/ucos.o port/port.o

#########################################################################
all: ucosii.om ucosii.bin ucosii.asm

ucosii.om: depend subdirs $(LIBS) Makefile
$(CC) -Tram.ld -o $@ $(LIBS) -nostdlib $(LDFLAGS)
ucosii.bin: ucosii.om
mips-sde-elf-objcopy -O binary $< $@
ucosii.asm: ucosii.om
mips-sde-elf-objdump -D $< > $@

#########################################################################
depend dep:
@for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir .depend ; done
subdirs:
@for dir in $(SUBDIRS) ; do $(MAKE) -C $$dir || exit 1 ; done
clean:
find . -type f \
\( -name 'core' -o -name '*.bak' -o -name '*~' \
-o -name '*.o' -o -name '*.tmp' -o -name '*.hex' \
-o -name '*.exe' -o -name '*.bin' -o -name '*.srec' \
-o -name '*.mem' -o -name '*.img' -o -name '*.out' \
-o -name '*.aux' -o -name '*.log' -o -name '*.data' \) -print \
| xargs rm -f
rm -f System.map

distclean: clean
find . -type f \
\( -name .depend -o -name '*.srec' -o -name '*.bin' \
-o -name '*.pdf' \) \
-print | xargs rm -f
rm -f $(OBJS) *.bak tags TAGS
rm -fr *.*~

#########################################################################

config.mk文件如下,注意在CFLAGS的定义中添加“-mips32” 选项:

#########################################################################
CONFIG_SHELL:= $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else if [ -x /bin/bash ]; then echo /bin/bash; \
else echo sh; fi ; fi)

HOSTCC= cc
HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
#########################################################################
AS= $(CROSS_COMPILE)as
LD= $(CROSS_COMPILE)ld
CC= $(CROSS_COMPILE)gcc
AR= $(CROSS_COMPILE)ar
NM= $(CROSS_COMPILE)nm
STRIP= $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB= $(CROSS_COMPILE)ranlib

CFLAGS += -I$(TOPDIR)/include -I$(TOPDIR)/ucos -I$(TOPDIR)/common -Wall -Wstrict-prototypes -Werror-implicit-function-declaration -fomit-frame-pointer -fno-strength-reduce -O2 -g -pipe -fno-builtin -nostdlib-mips32

ASFLAGS += $(CFLAGS)

LDFLAGS += -lgcc -e 256
#########################################################################
exportCONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE \
AS LD CC AR NM STRIP OBJCOPY OBJDUMP \
MAKE CFLAGS ASFLAGS
#########################################################################
%.o:%.S
$(CC) $(CFLAGS) -c -o $@ $<
%.o:%.c
$(CC) $(CFLAGS) -c -o $@ $<
#########################################################################

第三步:在common目录下添加Makefile文件,用来得到openmips.o文件,如下:

# CFLAGS += -DET_DEBUG -DDEBUG
LIB= common.o
OBJS= openmips.o
all:$(LIB)
$(LIB):$(OBJS) $(SOBJS)
$(LD) -r -o $@ $(OBJS) $(SOBJS)
#########################################################################
.depend:Makefile $(OBJS:.o=.c)
$(CC) -M $(CFLAGS) $(OBJS:.o=.c) > $@
sinclude .depend
#########################################################################

第四步:在port目录下添加Makefile文件,用来得到port.o文件,如下:

LIB= port.o
OBJS= os_cpu_c.o
SOBJS= os_cpu_a.o

all:$(LIB)
$(LIB):$(OBJS) $(SOBJS)
$(LD) -r -o $@ $(OBJS) $(SOBJS)
#########################################################################
.depend:Makefile $(OBJS:.o=.c) $(SOBJS:.o=.S)
$(CC) -M $(CFLAGS) $(OBJS:.o=.c) $(SOBJS:.o=.S) > $@
sinclude .depend
#########################################################################

第五步:在ucos目录下添加Makefile文件,用来得到ucos.o文件,如下:

# CFLAGS += -DET_DEBUG -DDEBUG
LIB= ucos.o
OBJS= os_flag.o os_mbox.o os_mem.o os_mutex.o os_q.o os_sem.o os_task.o os_time.o os_tmr.o os_dbg_r.o os_core.o
all:$(LIB)

$(LIB):$(OBJS) $(SOBJS)
$(LD) -r -o $@ $(OBJS) $(SOBJS)
#########################################################################
.depend:Makefile $(OBJS:.o=.c)
$(CC) -M $(CFLAGS) $(OBJS:.o=.c) > $@

sinclude .depend
#########################################################################

返回顶部