已经到了这一步了,前面不远处就是终点,小伙伴们再加把劲。
       这一步包括链接脚本、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
#########################################################################
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐