ION-DTN在RTEMS上的移植

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


上面的是移植过程中最为重要的步骤,为ION的makefile提供RTEMS的一些API接口以及一些库和工具。


首先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执行的文件。根据需要的功能要求修改即可。



转载于:https://www.cnblogs.com/sichenzhao/p/9320208.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值