ION-DTN是DTN协议栈的具体实现,广泛应用在深空通信等恶劣环境下,RTEMS作为星载操作系统之一,若能在RTEMS上实现DTN协议栈,能够为RTEMS的提供更为广泛的应用。
接下来详细描述如何将ION-DTN移植到RTEMS上。
ION-DTN的3.5.0版本中有关于RTEMS移植的一个模板,而不知为何,在最新的3.6.0中却删除了该模板。因此选用3.5.0进行移植。
ION源码中RTEMS的模板文件夹为arch-rtems,其中内容如下:
一、最为重要的是Makefile文件,接下来对Makefile进行分析:
IONFLAGS_T = -DRTEMS -DBP_EXTENDED -DGDSSYMTAB -DGDSLOGGER \
-DUSING_SDR_POINTERS -DNO_SDR_TRACE -DNO_PSM_TRACE \
-DNO_PROXY -DNO_DIRLIST
# Add -DBPSEC if building with bpsec.
# -DBPSEC
# Add -DAGENT_ROLE if building with nm.
# -DAGENT_ROLE
# -DENABLE_IMC
# -DENABLE_BPACS
PGM=${ARCH}/ion.exe
ION_OPEN_SOURCE = 1
IONFLAGS_T表示一些开关的使能,比如-DRTEMS表示使能RTEMS接口。
PGM=${ARCH}/ion.exe
表示最后make生成的目标为ion.exe
ICISOURCES = \
platform.c \
platform_sm.c \
memmgr.c \
llcv.c \
lyst.c \
psm.c \
smlist.c \
smrbt.c \
ion.c \
rfx.c \
zco.c \
sdrtable.c \
sdrhash.c \
sdrxn.c \
sdrmgt.c \
sdrstring.c \
sdrlist.c \
sdrcatlg.c \
rfxclock.c \
ionadmin.c \
sdrmend.c \
ionsec.c \
ionsecadmin.c \
crypto.c \
csi.c \
bulk.c \
ionwarn.c \
ionrestart.c \
ionexit.c
# bloom.c \
# MurmurHash2.c \
LTPSOURCES = \
libltp.c \
libltpP.c \
libltpnm.c \
ltpei.c \
ltpclock.c \
ltpmeter.c \
pmqlsi.c \
pmqlso.c \
ltpadmin.c \
udplsi.c \
udplso.c
BPSOURCES = \
这些就是make需要编译的源文件,如果要使能某个功能,就要在makefile中加上对应的函数进行编译。
include $(RTEMS_MAKEFILE_PATH)/Makefile.inc
include $(RTEMS_CUSTOM)
LD_LIBS += $(RTEMS_MAKEFILE_PATH)/../lib/libm.a
include $(PROJECT_ROOT)/make/leaf.cfg
首先Makefile.inc是提供特定BSP的一些API接口,用于include进应用程序的makefile中。
而libm.a是RTEMS的二进制函数库。
leaf.cfg非常重要,定义了叶子节点,也就是RTEMS其他模块,比如应用程序模块中makefile的一些命令的具体实现。
# make/leaf.cfg
#
# Make(1) configuration file include'd by all leaf-node Makefiles
#
#
# LIBSUFFIX_VA, will "index" into LIBSUFF-*-v macros and
# convert our ${ARCH} back into .a or _g.a or _p.a based on debug.
# Useful for installing libraries.
#
LIBSUFFIX_OPTIMIZE_V=
LIBSUFFIX_DEBUG_V=_g
LIB_VARIANT=$(LIBSUFFIX_$(VARIANT_V)_V)
LIBSUFFIX_VA = $(LIB_VARIANT).a
# Pull in the desired "target" compiler
# Programs built on the host use automake generated rules.
# This will not change $(ARCH) -- binaries will still be place as per target
include ${CONFIG.CC}
ifeq (${DEPEND},$(wildcard ${DEPEND}))
include ${DEPEND} # pull in dependencies if they exist
endif
ifndef AUTOMAKE
#
# Builtin targets for compilation variants
#
debug:
$(MAKE) -f $(MAKEFILE) MAKEFILE=$(MAKEFILE) VARIANT=DEBUG
endif
#
# VARIANT_VA will convert our ${ARCH} back into "" or "debug".
# Handy when one makefile wants to hop over into a peer's tree and
# build something "the same" way.
#
VARIANT-OPTIMIZE-v =
VARIANT-DEBUG-v = debug
VARIANT_VA = $(VARIANT-$(VARIANT_V)-v)
#
# TARGET_VA will convert $@ (expected to be 'debug' etc.)
# into "" or "install" as appropriate.
# Used for variant recursion.
#
TARGET_debug_V = all
TARGET_VA = $(TARGET_$@_V)
#
# Builtin clean and distclean rules
# Individual makefiles can add stuff via CLEAN_ADDITIONS and CLOBBER_ADDITIONS
# If desperate to save something, they can override CLEAN_OS, CLEAN_CC, etc.
#
clean-am: clean-generic
-$(RM) -r $(CLEAN_OS) $(CLEAN_CC) $(CLEAN_DEPEND)
-$(RM) -r $(VARIANTS)
distclean-am: distclean-generic clean-am
-$(RM) -r $(CLOBBER_OS) $(CLOBBER_CC) $(CLOBBER_DEPEND)
ifndef AUTOMAKE
preinstall-am:
preinstall: preinstall-am
distclean: distclean-am
-$(RM) ./config.status
clean: clean-am
.PHONY: distclean distclean-am
.PHONY: clean clean-am
endif
EXEEXT?=.exe
DOWNEXT?=.ralf
define bsp-link-c
$(LINK.c) $(CPU_CFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) \
-o $(basename $@)$(EXEEXT) $(LINK_OBJS) $(LINK_LIBS)
endef
define bsp-link-cxx
$(LINK.cc) $(CPU_CFLAGS) $(AM_CFLAGS) $(AM_LDFLAGS) \
-o $(basename $@)$(EXEEXT) $(LINK_OBJS) $(LINK_LIBS)
endef
define default-bsp-post-link
$(NM) -g -n $@ > $(basename $@).num
$(SIZE) $@
endef
ifndef bsp-post-link
define bsp-post-link
$(default-bsp-post-link)
cp $(basename $@)$(EXEEXT) $(basename $@)$(DOWNEXT)
endef
endif
define make-exe
$(bsp-link-c)
$(bsp-post-link)
endef
define make-cxx-exe
$(bsp-link-cxx)
$(bsp-post-link)
endef
加上这些库后,还要加上rtems-libbsd编译后生成的libbsd二进制库,里面包含了libbsd的一些库函数,比如socket等网络协议栈标准接口函数等。非常非常重要。
LINK_LIBS += /home/c/development/rtems/rtems-4.12/arm-rtems4.12/beagleboneblack/lib/libbsd.a
以上对makefile的修改使得ION-DTN可以RTEMS为目标进行编译。
二、srclinks文件
在Makefile中添加的source文件,都要在srclinks文件中添加,保证source文件能够以链接的形式复制到arch-rtems文件夹下。
三、mysymtab.c文件
该文件是为RTEMS移植过程中,函数的模板的私有符号表,也就是如果要在应用程序中调用ION的功能函数的话,需要在此文件中声明。
/*
mysymtab.c: template private symbol table for RTEMS port
of the ION stack, with definition of
sm_FindFunction(), which accesses this table.
Author: Scott Burleigh, JPL
Copyright (c) 2010, California Institute of Technology.
ALL RIGHTS RESERVED. U.S. Government Sponsorship
acknowledged.
*/
extern int ionadmin(int, int, int, int, int, int, int, int, int, int);
extern int ionexit(int, int, int, int, int, int, int, int, int, int);
extern int rfxclock(int, int, int, int, int, int, int, int, int, int);
extern int ionsecadmin(int, int, int, int, int, int, int, int, int, int);
extern int ionwarn(int, int, int, int, int, int, int, int, int, int);
extern int ionrestart(int, int, int, int, int, int, int, int, int, int);
extern int ltpadmin(int, int, int, int, int, int, int, int, int, int);
extern int ltpclock(int, int, int, int, int, int, int, int, int, int);
extern int ltpmeter(int, int, int, int, int, int, int, int, int, int);
extern int pmqlsi(int, int, int, int, int, int, int, int, int, int);
extern int pmqlso(int, int, int, int, int, int, int, int, int, int);
extern int bpadmin(int, int, int, int, int, int, int, int, int, int);
extern int bpclock(int, int, int, int, int, int, int, int, int, int);
extern int bptransit(int, int, int, int, int, int, int, int, int, int);
extern int ltpcli(int, int, int, int, int, int, int, int, int, int);
extern int ltpclo(int, int, int, int, int, int, int, int, int, int);
extern int bibeclo(int, int, int, int, int, int, int, int, int, int);
extern int ipnadmin(int, int, int, int, int, int, int, int, int, int);
extern int ipnfw(int, int, int, int, int, int, int, int, int, int);
extern int ipnadminep(int, int, int, int, int, int, int, int, int, int);
extern int lgagent(int, int, int, int, int, int, int, int, int, int);
extern int bpsource(int, int, int, int, int, int, int, int, int, int);
extern int bpsink(int, int, int, int, int, int, int, int, int, int);
extern int bpdriver(int, int, int, int, int, int, int, int, int, int);
extern int bpcounter(int, int, int, int, int, int, int, int, int, int);
extern int ltpcounter(int, int, int, int, int, int, int, int, int, int);
extern int ltpdriver(int, int, int, int, int, int, int, int, int, int);
extern int udplsi(int, int, int, int, int, int, int, int, int, int);
extern int udplso(int, int, int, int, int, int, int, int, int, int);
#ifndef NASA_PROTECTED_FLIGHT_CODE
extern int cfdpadmin(int, int, int, int, int, int, int, int, int, int);
extern int cfdpclock(int, int, int, int, int, int, int, int, int, int);
extern int bputa(int, int, int, int, int, int, int, int, int, int);
#endif
#if 0
四、修改ionrtems.c文件
该文件是ion.exe应用程序功能实现的具体源文件,里面包含main函数以及其他功能函数。是ion.exe执行的文件。根据需要的功能要求修改即可。