已经到了这一步了,前面不远处就是终点,小伙伴们再加把劲。
这一步包括链接脚本、Makefile的建立,主要参考了OR1200平台上移植的ucos-II的相关文件。
第一步:新建链接脚本文件ram.ld,可以参考OR1200源代码中包含的μC/OS-II的ram.ld,内容如下,重点是单独声明一个vectors section,占用低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
export CROSS_COMPILE
#########################################################################
TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
export TOPDIR
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
#########################################################################
export CONFIG_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
#########################################################################