diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-09-27 14:43:05 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2007-09-27 14:43:05 +0000 |
commit | eb04e53f6dd24efc86473c6264fc2d8c0d562c90 (patch) | |
tree | 61b1eeb6e80394230069cb096315593246acaf6d | |
parent | 2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com> (diff) | |
download | ada-examples-eb04e53f6dd24efc86473c6264fc2d8c0d562c90.tar.bz2 |
2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com>
* ChangeLog: New tests. Clean up. Rework so all tests use the same
shared Makefile for the hard logic of producing an executable.
* Makefile, Makefile.shared, README.Makefiles, networkconfig.h,
rtems_init.c: New files.
-rw-r--r-- | ChangeLog | 26 | ||||
-rw-r--r-- | Makefile | 14 | ||||
-rw-r--r-- | Makefile.shared | 71 | ||||
-rw-r--r-- | README.Makefiles | 45 | ||||
-rw-r--r-- | networkconfig.h | 77 | ||||
-rw-r--r-- | rtems_init.c | 230 |
6 files changed, 463 insertions, 0 deletions
@@ -1,3 +1,29 @@ +2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com> + + * ChangeLog: New tests. Clean up. Rework so all tests use the same + shared Makefile for the hard logic of producing an executable. + * Makefile, Makefile.shared, README.Makefiles, networkconfig.h, + rtems_init.c: New files. + +2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com> + + * ChangeLog: New tests. Clean up. Rework so all tests use the same + shared Makefile for the hard logic of producing an executable. + * Makefile, Makefile.shared, README.Makefiles, networkconfig.h, + rtems_init.c: New files. + +2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com> + + * ChangeLog: New tests. Clean up. Rework so all tests use the same + shared Makefile for the hard logic of producing an executable. + * Makefile, Makefile.shared, README.Makefiles, networkconfig.h, + rtems_init.c: New files. + +2007-09-27 Joel Sherrill <joel.sherrill@oarcorp.com> + + * Makefile, Makefile.shared, README.Makefiles, networkconfig.h, + rtems_init.c: New files. + 2007-07-23 Joel Sherrill <joel.sherrill@oarcorp.com> * hello_world_ada/Makefile.anybsp, hello_world_ada/Makefile.pc386, diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7dac10e --- /dev/null +++ b/Makefile @@ -0,0 +1,14 @@ +# +# $Id$ +# + +include $(RTEMS_MAKEFILE_PATH)/Makefile.inc +include $(RTEMS_CUSTOM) +include $(RTEMS_ROOT)/make/directory.cfg + +SUBDIRS=hello_world_ada delay_until + +ifeq ($(HAS_NETWORKING),yes) + SUBDIRS += dumpwebpage pingpong gen-soconn +endif + diff --git a/Makefile.shared b/Makefile.shared new file mode 100644 index 0000000..505c2ef --- /dev/null +++ b/Makefile.shared @@ -0,0 +1,71 @@ +# +# Subdirectory makefiles do some setup, then we get here +# + +# Tool helpers +CARGS =-B${RTEMS_MAKEFILE_PATH}/lib/ -specs bsp_specs -qrtems $(CPU_CFLAGS) + +# GEN5200 Specific Information +ifeq ($(RTEMS_BSP_FAMILY),gen5200) + LINKARGS+=-qnolinkcmds -T$(RTEMS_LINKCMDS) +endif + +# PC386 Specific Information +ifeq ($(RTEMS_BSP_FAMILY),pc386) + HEADERADDR=0x00097E00 + START16FILE=$(RTEMS_MAKEFILE_PATH)/lib/start16.bin + START16ADDR=0x00097C00 + RELOCADDR=0x00100000 + LINKARGS+= -Wl,-Ttext,$(RELOCADDR) +endif + +# Some tests need to be able to do a gethostbyname +ifeq ($(NEED_ROOTFS_FOR_HOST_INFO),yes) + CLEAN_ADDITIONS += FilesystemImage FilesystemImage.c FilesystemImage.h + FILESYSTEM_OBJS = FilesystemImage.o + FILESYSTEM_SRCS = FilesystemImage.h + CFLAGS += -DENABLE_UNTAR_ROOT_FILESYSTEM -I. +endif + +all: $(PROGRAM) + +$(PROGRAM): rtems_init.o $(FILESYSTEM_OBJS) $(PROGRAM).adb + $(AS:as=gnatmake) -v -O -gnata -gnatE -gnato $(@) -g \ + -I../src \ + -bargs -Mgnat_main \ + -largs $(CARGS) $(LINKARGS) rtems_init.o $(FILESYSTEM_OBJS) + $(SIZE) $(@) +ifeq ($(RTEMS_BSP_FAMILY),pc386) + mv $(@) $(@).obj + $(OBJCOPY) -O elf32-i386 \ + --remove-section=.rodata \ + --remove-section=.comment \ + --remove-section=.note \ + --strip-unneeded $(@).obj $(@) + $(OBJCOPY) -O binary $(@).obj $(@).bin + $(RTEMS_MAKEFILE_PATH)/build-tools/bin2boot -v $(@).bt $(HEADERADDR) \ + $(START16FILE) $(START16ADDR) 0 $(@).bin $(RELOCADDR) 0 +else +endif + +joel: + echo $(NEED_ROOTFS_FOR_HOST_INFO) + +rtems_init.o: ../rtems_init.c $(FILESYSTEM_SRCS) + $(CC) $(CFLAGS) $(CPU_CFLAGS) -c $< + +ifeq ($(NEED_ROOTFS_FOR_HOST_INFO),yes) +FilesystemImage: ../rootfs/etc/host.conf ../rootfs/etc/hosts + (cd ../rootfs ; tar cf - --exclude CVS --exclude .cvsignore .) >$(@) + +FilesystemImage.c FilesystemImage.h: FilesystemImage + $(PROJECT_ROOT)/bin/bin2c FilesystemImage FilesystemImage + +FilesystemImage.o: FilesystemImage.c + $(CC) $(CFLAGS) $(CPU_CFLAGS) -c $< +endif + +clean: + rm -f b~*.* *.o *.ali $(PROGRAM) + rm -f *.num *.exe *.obj *.bin *.bt *.gba + diff --git a/README.Makefiles b/README.Makefiles new file mode 100644 index 0000000..7d79cea --- /dev/null +++ b/README.Makefiles @@ -0,0 +1,45 @@ +# +# $Id$ +# + +The following is an example of how to build these Ada examples: + +export RTEMS_MAKEFILE_PATH=/home/joel/rtems-4.8-work/bsp-install/CPU-rtems4.8/BSP/ +make clean all + +This procedure has been used on the following BSPs: + + arm/edb7312 + bfin/eZKit533 + i386/pc386 + m68k/mcf5206elite + mips/jmr3904 + powerpc/gen5200 + powerpc/psim + sparc/erc32 + sparc/leon2 + sparc/leon3 + sparc/sis + +The Makefile directly produces an executable for a BSP which directly runs +the format (usually ELF) produced by just linking an application. +There are a couple of BSP families which require just a bit of +assistance that this Makefile knows about -- gen5200 and pc386. +The executables produced by this Makefile should run on at least the +following BSPs: + ++ arm/edb7312 ++ i386/pc386 ++ mips/jmr3904 ++ powerpc/icecube ++ powerpc/psim ++ powerpc/score603e ++ sparc/erc32 ++ sparc/leon2 ++ sparc/leon3 + +Some BSPs require even more manipulation of the ELF file before it can +be run on the target hardware. For example, the Freescale IceCube +variant of the gen5200 BSP uses U-Boot and you have to run mkimage +to get a bootable file. + diff --git a/networkconfig.h b/networkconfig.h new file mode 100644 index 0000000..0333393 --- /dev/null +++ b/networkconfig.h @@ -0,0 +1,77 @@ +/* + * Network configuration -- LOOPBACK ONLY!!! + * + * See one of the other networkconfig.h files for an + * example of a system that includes a real NIC and + * the loopback interface. + * + ************************************************************ + * EDIT THIS FILE TO REFLECT YOUR NETWORK CONFIGURATION * + * BEFORE RUNNING ANY RTEMS PROGRAMS WHICH USE THE NETWORK! * + ************************************************************ + * + * $Id$ + */ + +#ifndef _RTEMS_NETWORKCONFIG_H_ +#define _RTEMS_NETWORKCONFIG_H_ + + +/* #define RTEMS_USE_BOOTP */ + +#include <bsp.h> + +/* + * Loopback interface + */ +extern int rtems_bsdnet_loopattach(); + +/* + * Default network interface + */ +static struct rtems_bsdnet_ifconfig netdriver_config = { + "lo0", /* name */ + rtems_bsdnet_loopattach, /* attach function */ + NULL, /* No more interfaces */ + "127.0.0.1", /* IP address */ + "255.0.0.0", /* IP net mask */ + NULL, /* Driver supplies hardware address */ + 0 /* Use default driver parameters */ +}; + +/* + * Network configuration + */ +struct rtems_bsdnet_config rtems_bsdnet_config = { + &netdriver_config, + NULL, /* do not use bootp */ + 0, /* Default network task priority */ + 0, /* Default mbuf capacity */ + 0, /* Default mbuf cluster capacity */ + "localhost", /* Host name -- match expectations for 127.0.0.1 */ + "nodomain.com", /* Domain name */ + "127.0.0.1", /* Gateway */ + "127.0.0.1", /* Log host */ + {"127.0.0.1" }, /* Name server(s) */ +}; + +/* + * For TFTP test application + */ +#if (defined (RTEMS_USE_BOOTP)) +#define RTEMS_TFTP_TEST_HOST_NAME "BOOTP_HOST" +#define RTEMS_TFTP_TEST_FILE_NAME "BOOTP_FILE" +#else +#define RTEMS_TFTP_TEST_HOST_NAME "XXX.YYY.ZZZ.XYZ" +#define RTEMS_TFTP_TEST_FILE_NAME "tftptest" +#endif + +/* + * For NFS test application + * + * NFS server/path to mount and a directory to ls once mounted + */ +#define RTEMS_NFS_SERVER "192.168.1.210" +#define RTEMS_NFS_SERVER_PATH "/home" +#define RTEMS_NFS_LS_PATH "/mnt/nfstest" +#endif /* _RTEMS_NETWORKCONFIG_H_ */ diff --git a/rtems_init.c b/rtems_init.c new file mode 100644 index 0000000..f0dd833 --- /dev/null +++ b/rtems_init.c @@ -0,0 +1,230 @@ +/* + * COPYRIGHT (c) 1989-2007. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be found in + * the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +#include <bsp.h> + +#include <assert.h> +#include <pthread.h> +#include <stdlib.h> + +#if defined(MAIN_USE_NETWORKING) + #include <rtems/rtems_bsdnet.h> + #include "networkconfig.h" +#endif +#if defined(ENABLE_UNTAR_ROOT_FILESYSTEM) + #include <rtems/untar.h> + /* + * The tarfile image is built automatically externally. + */ + #include "FilesystemImage.h" +#endif + + +extern rtems_configuration_table BSP_Configuration; + +/* + * Using GNAT's Distributed Systems Annex support requires + * each node in the system to have different pid's. In a + * single CPU RTEMS system, it is always one. This lets the + * user override the RTEMS default. + */ +#ifdef GNAT_PID + #include <unistd.h> + + pid_t getpid() + { + return GNAT_PID; + } +#endif + +/* + * Set up first argument + */ +static int argc = 1; +static char arg0[20] = "rtems"; +static char *argv[20] = { arg0 }; + +#if defined(MAIN_USE_REQUIRES_COMMAND_LINE) + +#define COMMAND_LINE_MAXIMUM 200 + +#include <stdio.h> +#include <ctype.h> + +void parse_arguments( + char *buffer, + size_t maximum_length +) +{ + char *cp; + char *linebuf = buffer; + size_t length; + + for (;;) { + + #if defined(MAIN_COMMAND_LINE) + strncpy (linebuf, MAIN_COMMAND_LINE, maximum_length); + #else + /* + * Read a line + */ + printf (">>> %s ", argv[0]); + fflush (stdout); + fgets (linebuf, maximum_length, stdin); + + length = strnlen( linebuf, maximum_length ); + if ( linebuf[length - 1] == '\n' || linebuf[length - 1] == '\r' ) { + linebuf[length - 1] = '\0'; + } + #endif + + /* + * Break line into arguments + */ + cp = linebuf; + for (;;) { + while (isspace (*cp)) + *cp++ = '\0'; + if (*cp == '\0') + break; + if (argc >= ((sizeof argv / sizeof argv[0]) - 1)) { + printf ("Too many arguments.\n"); + argc = 0; + break; + } + argv[argc++] = cp; + while (!isspace (*cp)) { + if (*cp == '\0') + break; + cp++; + } + } + if (argc > 1) { + argv[argc] = NULL; + break; + } + printf ("You must give some arguments!\n"); + } + + #if defined(DEBUG_COMMAND_LINE_ARGUMENTS) + { + int i; + for (i=0; i<argc ; i++ ) { + printf( "argv[%d] = ***%s***\n", i, argv[i] ); + } + printf( "\n" ); + } + #endif +} + + +#endif + +/* + * By having the POSIX_Init thread create a second thread just + * to invoke gnat_main, we can override all default attributes + * of the "Ada environment task". Otherwise, we would be + * stuck with the defaults set by RTEMS. + */ + +void *start_gnat_main( void * argument ) +{ + extern int gnat_main ( int argc, char **argv, char **envp ); + + #if defined(MAIN_USE_REQUIRES_COMMAND_LINE) + /* + * This is scoped to match the Ada program. + */ + char command_line[ COMMAND_LINE_MAXIMUM ]; + + parse_arguments( command_line, COMMAND_LINE_MAXIMUM ); + #endif + + (void) gnat_main ( argc, argv, 0 ); + + exit( 0 ); + + return 0; +} + +#ifndef GNAT_MAIN_STACKSPACE + #define GNAT_MAIN_STACKSPACE 0 +#endif + +void *POSIX_Init( void *argument ) +{ + pthread_t thread_id; + pthread_attr_t attr; + size_t stacksize; + int status; + extern size_t _ada_pthread_minimum_stack_size(); + + #if defined(ENABLE_UNTAR_ROOT_FILESYSTEM) + printk("Loading filesystem image\n"); + status = Untar_FromMemory( (char *)FilesystemImage, FilesystemImage_size ); + #endif + + #if defined(MAIN_USE_NETWORKING) + printk("Initializing Network\n"); + rtems_bsdnet_initialize_network (); + #endif + + status = pthread_attr_init( &attr ); + assert( !status ); + + stacksize = GNAT_MAIN_STACKSPACE * 1024; + if ( stacksize < _ada_pthread_minimum_stack_size() ) + stacksize = _ada_pthread_minimum_stack_size(); + + status = pthread_attr_setstacksize( &attr, stacksize ); + assert( !status ); + + status = pthread_create( &thread_id, &attr, start_gnat_main, NULL ); + assert( !status ); + + pthread_exit( 0 ); + return 0; +} + +/* configuration information */ + +/* Standard output and a clock tick so time passes */ +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +/* We need to be able to create sockets */ +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 20 + +/* We need the full IMFS to pass the full ACATS */ +#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM + +/* This is overkill but is definitely enough to run the network stack */ +#define CONFIGURE_MAXIMUM_TASKS 20 +#define CONFIGURE_MAXIMUM_SEMAPHORES 20 + +/* We want a clock tick every millisecond */ +#define CONFIGURE_MICROSECONDS_PER_TICK RTEMS_MILLISECONDS_TO_MICROSECONDS(1) + +/* The initialization task is a POSIX Initialization thread with default attributes */ +#define CONFIGURE_POSIX_INIT_THREAD_TABLE + +/* We are using GNAT/RTEMS with a maximum of 20 Ada tasks and no fake Ada tasks. */ +/* A fake Ada task is a task created outside the Ada run-time that calls into Ada. */ +#define CONFIGURE_GNAT_RTEMS +#define CONFIGURE_MAXIMUM_ADA_TASKS 20 +#define CONFIGURE_MAXIMUM_FAKE_ADA_TASKS 0 + +/* Account for any extra task stack size */ +#define CONFIGURE_MEMORY_OVERHEAD (GNAT_MAIN_STACKSPACE) + +#define CONFIGURE_INIT + +#include <rtems/confdefs.h> |