External RAM filesystem

Aitor.Viana.Sanchez at esa.int Aitor.Viana.Sanchez at esa.int
Wed Nov 14 16:09:06 UTC 2007


Based on the example i made (see bellow) i got questions.

Basically this example allows to read/write information in the RAMDISK 
area (which is an array in the example) by means of the filesystem API but 
does not allow to create files because the open/f_open routine shall open 
the "/dev/ramdisk0" device.
Is it possible to "mount" somehow the /dev/ramdisk0 and then, using the 
open/f_open, etc. calls to create file inside this RAMDISK?

Cheers,

Sitor


Here is the example I made.

rtems-config.h file --------------->

#ifndef RTEMSCONFIG_H_
#define RTEMSCONFIG_H_

/* configuration information */

rtems_task Init( rtems_task_argument argument);
extern char ramdisk[];

#define CONFIGURE_NEEDS_CONSOLE_DRIVER

#define CONFIGURE_RTEMS_INIT_TASKS_TABLE

#define CONFIGURE_MAXIMUM_TASKS 10
#define CONFIGURE_MAXIMUM_SEMAPHORES 10
#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4

rtems_bdbuf_config rtems_bdbuf_configuration[] = {
  { 512, 40, (void *) ramdisk }
};
int rtems_bdbuf_configuration_size = 1;

rtems_ramdisk_config rtems_ramdisk_configuration[] = {
  {
     512, 40, (void *) ramdisk
  }
};

// The sparc-rtems-gcc version 4 changes the location of the confdefs.h 
file.
#if (__GNUC__ > 3)
size_t rtems_ramdisk_configuration_size = 1;
rtems_task_priority swapout_task_priority = 100;
#else
int rtems_ramdisk_configuration_size = 1;
#endif


#define CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
rtems_driver_address_table Device_drivers[] = {
  CONSOLE_DRIVER_TABLE_ENTRY,
  CLOCK_DRIVER_TABLE_ENTRY,
  RAMDISK_DRIVER_TABLE_ENTRY
};
#define CONFIGURE_NUMBER_OF_DRIVERS \
  ((sizeof(Device_drivers) / sizeof(rtems_driver_address_table)))
#define CONFIGURE_MAXIMUM_DRIVERS 10



#define CONFIGURE_INIT

// The sparc-rtems-gcc version 4 changes the location of the confdefs.h 
file.
#if (__GNUC__ > 3)
#include <rtems/confdefs.h>
#else
#include <confdefs.h>
#endif

#endif /*RTEMSCONFIG_H_*/

<---------------------------------

test.c ----------------->

/*
 *  Simple test program -- simplified version of sample test hello.
 */

#include <bsp.h>

#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>

#include <rtems/ramdisk.h>
#include <rtems/bdbuf.h>

char ramdisk[30*1024];

#include "rtems-config.h"

rtems_task Init(
  rtems_task_argument ignored
)
{
        FILE *fp;
        unsigned char buffer[512];
        unsigned char aux[512];
        int i;
        size_t bw;
 
        // Open the RAMDISKK
        fp = fopen( "/dev/ramdisk0", "r+" );
        assert( fp );

        for ( i=0 ; i< 512 ; i++  )
                buffer[i] = (unsigned char) (i + 1);

        for (i=0; i < 30 ; i++ ) 
        {
                bw = fwrite( buffer, 512, 1, fp );
                assert(bw);
        }

        assert(fseek(fp, 0, SEEK_SET) == 0);

        for (i=0; i < 20 ; i++ ) 
        {
                memset( aux, 0, 512 );
                bw = fread( aux, 512, 1, fp );
                assert( bw == 1 );
                printf("%d ", i);

                assert( !memcmp( buffer, aux, 512 ) );
                assert( !memcmp( (ramdisk + (i*512)), aux, 512 ) );
        }

  exit( 0 );
}

/* end of file */

-----------------------------
Aitor Viana Sánchez

ESA - European Space Technology Centre (ESTEC)
TEC-EDD - Computer and Data Systems Section
ESA/ESTEC P.O. Box 299 / 2200AG Noordwijk ZH, The Netherlands
Tel (+31) 71 565 6727
Email: aitor.viana.sanchez at esa.int

Joel Sherrill <joel.sherrill at oarcorp.com> wrote on 11/14/2007 03:15:07 PM:

> I don't remember if there is an example in the source
> tree anywhere of doing this.  If you can put together
> something, it would be appreciated.  Just declared
> some large byte array and use it as the RAM for the
> purposes of an example.

> --joel

> Aitor.Viana.Sanchez at esa.int wrote:
> >
> > Hi Thomas,
> >
> > I managed to configure the RAMDISK, and also accessing it but i got
> > couple of questions.
> >
> >         - I didn't use the msdos_initialize function at all and I
> > don't know what this function does exactly and why it is needed.
> >         - I had also to initialize the rtems_bdbuf_configuration
> > structure and the rtems_bdbuf_configuration_size variable, but i don't
> > know what is this structure/variable is for.
> >         - I can access to the RAMDISK by means of
> > fopen("/dev/ramdisk0") for instance. But this allows me to write/read
> > in the RAMDISK area using the file API. But apparently does not allow
> > me to create files in the RAMDISK area (which is my intention). Lets
> > say, I want to allocate a RAMDISK area, mount it, and then access it
> > like a filesystem.
> >
> > Here is my configuration file:
> >
> > #ifndef RTEMSCONFIG_H_
> > #define RTEMSCONFIG_H_
> >
> > /* configuration information */
> >
> > rtems_task Init( rtems_task_argument argument);
> >
> > #define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
> >
> > #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
> >
> > #define CONFIGURE_MAXIMUM_TASKS 10
> > #define CONFIGURE_MAXIMUM_SEMAPHORES 10
> > #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 4
> >
> > rtems_bdbuf_config rtems_bdbuf_configuration[] = {
> >   { 512, 20, (void *) 0 }
> > };
> > int rtems_bdbuf_configuration_size = 1;
> >
> > rtems_ramdisk_config rtems_ramdisk_configuration[] = {
> >   {
> >      512, 20, (void *) 0
> >   }
> > };
> >
> > int rtems_ramdisk_configuration_size = 1;
> >
> > #define CONFIGURE_HAS_OWN_DEVICE_DRIVER_TABLE
> > rtems_driver_address_table Device_drivers[] = {
> >   CONSOLE_DRIVER_TABLE_ENTRY,
> >   CLOCK_DRIVER_TABLE_ENTRY,
> >   RAMDISK_DRIVER_TABLE_ENTRY
> > };
> > #define CONFIGURE_NUMBER_OF_DRIVERS \
> >   ((sizeof(Device_drivers) / sizeof(rtems_driver_address_table)))
> > #define CONFIGURE_MAXIMUM_DRIVERS 10
> >
> > #define CONFIGURE_INIT
> >
> > #include <confdefs.h>
> >
> > #endif /*RTEMSCONFIG_H_*/
> >
> >
> > Cheers,
> >
> > Aitor
> >
> >
> > -----------------------------
> > Aitor Viana Sánchez
> >
> > ESA - European Space Technology Centre (ESTEC)
> > TEC-EDD - Computer and Data Systems Section
> > ESA/ESTEC P.O. Box 299 / 2200AG Noordwijk ZH, The Netherlands
> > Tel (+31) 71 565 6727
> > Email: aitor.viana.sanchez at esa.int
> >
> >
> > *Thomas Doerfler <Thomas.Doerfler at embedded-brains.de>*
> >
> > 11/13/2007 05:47 PM
> >
> >
> > To
> >  Aitor.Viana.Sanchez at esa.int
> > cc
> >  rtems-users at rtems.org
> > Subject
> >  Re: External RAM filesystem
> >
> >
> >
> >
> >
> >
> >
> >
> > Hi,
> >
> > yes, it should be possible. There still exists a ram disk driver, 
which
> > performs this function, see:
> >
> > cpukit/libblock/src/ramdisk.c
> >
> > We used it for our very first tests of the FATFS. If I recall 
correctly,
> > these are the steps to work with it:
> >
> > - define a rtems_ramdisk_config data structure (e.g. in the init 
module)
> > with the fixed name "rtems_ramdisk_configuration".
> >
> > - you can/must define the block size, the number of blocks and 
location
> > in this structure
> >
> > - If you add the RAMDISK_DRIVER_TABLE_ENTRY to your device driver 
table,
> > it will initialize automatically when your system comes up
> >
> > - Or, you can initialize the ramdisk with "ramdisk_initialize".
> >
> > - Next, you must format the ramdisk (use msdos_format function in
> > cpukit/libfs/src/dosfs/msdos_format.c).
> >
> > - Then you can mount the ramdisk as a (unpartitioned) volume with
> > msdos_initialze().
> >
> > I hope I am rather acurate on these steps.
> >
> > It would be nice if you could give us feedback, when things work.
> >
> > And it would be even nicer, if you could write a wiki entry on this
> > under www.rtems.com/wiki
> >
> > wkr,
> > Thomas.
> >
> >
> >
> >
> >
> > Aitor.Viana.Sanchez at esa.int schrieb:
> > >
> > > Hi all,
> > >
> > >
> > > is it possible to configure RTEMS somehow to access and external RAM
> > > memory address where a FAT32 (for instance) file system is placed? 
Is it
> > > possible to configure the address and size?
> > >
> > > Thanks in advance.
> > >
> > >
> > > Aitor
> > >
> > >
> > > 
------------------------------------------------------------------------
> > >
> > > _______________________________________________
> > > rtems-users mailing list
> > > rtems-users at rtems.com
> > > http://rtems.rtems.org/mailman/listinfo/rtems-users
> >
> >
> > --
> > --------------------------------------------
> > embedded brains GmbH
> > Thomas Doerfler           Obere Lagerstr. 30
> > D-82178 Puchheim          Germany
> > Tel. : +49-89-18 90 80 79-2
> > Fax  : +49-89-18 90 80 79-9
> > email: Thomas.Doerfler at embedded-brains.de
> > PGP public key available on request
> >
> > Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
> > 
------------------------------------------------------------------------
> >
> > _______________________________________________
> > rtems-users mailing list
> > rtems-users at rtems.com
> > http://rtems.rtems.org/mailman/listinfo/rtems-users
> >
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20071114/6fda82c5/attachment-0001.html>


More information about the users mailing list