RTEMS on Virtex 4
    Gempeler Stefan 
    Stefan.Gempeler at nanotronic.ch
       
    Mon Jun  3 09:43:23 UTC 2013
    
    
  
Hi Sebastian and Joel,,
 
thank you very much for your fast replies. Sorry if I ruined your
weekend, Joel ;-)
 
> you execute the program out of the RAM?
 
Yes, that's the plan. No additional memory (costs).
 
> printf() and the Termios interface (do you need it?) needs a lot of
code space
> and the PowerPC code itself is not very dense.  It is possible to
strip down a
> RTEMS system, but in general RTEMS is not a ultra low code size
system.
 
I use the printk() to write data to the UART (also changed the printf()
in c/src/lib/libbsp/powerpc/virtex/startup/bspstart.c:
bsp_XAssertHandler() to printk() -> no printf() in elf file).
Hmm, when I set
#define CONFIGURE_TERMIOS_DISABLED
I get no output anymore. We use the UART as a simple debug console
(output can be directly written to UART, input interrupt driven).
 
> Can you post your hello world version? And how you configured RTEMS.
 
The changes I made in the virtex BSP c/src/lib/libbsp/powerpc/virtex:
-          configure.ac :  changed
RTEMS_BSPOPTS_SET([RTEMS_XPARAMETERS_H],[*],[\<xparameters_dflt.h\>]) to
RTEMS_BSPOPTS_SET([RTEMS_XPARAMETERS_H],[*],[\"/home/me/code/ml410/ppc40
5_0/include/xparameters.h\"])
-          console/consolelite.c : removed the entries "/dev/ttyS1" to
"/dev/ttyS3" in console_tbl Console_Configuration_Ports[]
-          startup/bspstart.c: bsp_XAssertHandler(), printf() to
printk()
-          startup/linkcmds: 
RamBase =  0xfffc0000;
RamSize =  0x0003ffff;
HeapSize = 0x0;
StackSize = 0x2000;
MEMORY
{
  RAM : ORIGIN = 0xfffc0000, LENGTH = 0x0003ffff
}
SECTIONS
{
  .text 0xfffc0000:
...
  /* align bottom of 32k init stack at a 32k boundary */
  . = . + 0x1000;
  . = ALIGN( 0x1000 );
  stack.start = .;
  . = . + StackSize;
  . = . + StackSize;
  stack.end   = .;
  /*
   * Interrupt stack setup
   */
    IntrStack_start = ALIGN(0x10);
    . += StackSize;
    IntrStack_end = .;
...
 
Configured with :
../rtems/configure --target=powerpc-rtems4.11 --enable-rtemsbsp=virtex
--prefix=/home/me/code/bsp-install --disable-cxx --disable-networking
 
I tested several hello worlds.
 
The basic one:
//----------------------------------------------------------------------
---------------------------------------------
//----------------------------------------------------------------------
---------------------------------------------
/* forward declarations to avoid warnings */
rtems_task Init(rtems_task_argument argument);
 
rtems_task Init( rtems_task_argument ignored )
{
  printk( "\n\n*** HELLO WORLD TEST ***\t\t%s, %s\n", __DATE__, __TIME__
);
  printk( "Hello World\t\t\t\t%s, %s\n", __DATE__, __TIME__ );
 printk( "*** END OF HELLO WORLD TEST ***\t\t%s, %s\n", __DATE__,
__TIME__ );
  exit( 0 );
}
 
/* NOTICE: the clock driver is explicitly disabled */
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_MAXIMUM_TASKS            1
#define CONFIGURE_USE_DEVFS_AS_BASE_FILESYSTEM
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_INIT
#include <rtems/confdefs.h>
------------------------------------------------------------------------
-------------------------------------------
Size:
   text       data        bss         dec        hex    filename
126392    1724      4004   132120   20418  rtems_libs.exe
------------------------------------------------------------------------
-------------------------------------------
 
To test the POSIX thread creation: 
//----------------------------------------------------------------------
---------------------------------------------
//----------------------------------------------------------------------
---------------------------------------------
void* dbg_thread(void *arg)
{
                printk( "POSIX: LOCAL dbg_thread()\t%s, %s\n", __DATE__,
__TIME__ );
                while(1);
                exit( 0 );
}
//----------------------------------------------------------------------
---------------------------------------------
rtems_task Init(rtems_task_argument ignored )
{
  printk( "\nClassic -- Hello World\t\t%s, %s\n", __DATE__, __TIME__ );
  rtems_task_delete( RTEMS_SELF );
}
//----------------------------------------------------------------------
---------------------------------------------
void *POSIX_Init( void *argument )
{
  pthread_t dbg;
 
  printk( "POSIX -- Hello World\t\t%s, %s\n", __DATE__, __TIME__ );
  pthread_create( &dbg, NULL, dbg_thread, NULL );
  sleep( 1 );
  while(1);
  exit( 0 );
}
//----------------------------------------------------------------------
---------------------------------------------
/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_MAXIMUM_TASKS
(1)
#define CONFIGURE_MAXIMUM_POSIX_THREADS                     (2)
#define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE
(CONFIGURE_MAXIMUM_POSIX_THREADS*1024)
#define CONFIGURE_INIT
#include <rtems/confdefs.h>
------------------------------------------------------------------------
-------------------------------------------
Size:
   text       data        bss         dec        hex    filename
141416    1796      3848   147060   23e74  rtems_libs.exe
------------------------------------------------------------------------
-------------------------------------------
 
These 2 examples worked and produced the output as expected over the
UART  defined as STDOUT_BASEADDRESS. Also the input (polled with
getchark ()) worked. 
 
> The PowerPC BSPs should provide this interface:
>
http://www.rtems.org/onlinedocs/doxygen/cpukit/html/group__rtems__interr
upt__extension.html
> In case this doesn't work with the virtex4 BSP, then we should fix
this.
 
I already tried it with rtems_interrupt_handler_install(), but it seems
to be missing in the libs:
undefined reference to `rtems_interrupt_handler_install' 
collect2: error: ld returned 1 exit status
 
virtex4 BSP: at the moment I use the virtex and not the virtex4 BSP
because I don't know how to get the UART stdio working. 
How do I set up the stdio and interrupt to STDOUT_BASEADDRESS? 
 
Ok, thank you very much again for your responses and help. I really
appreciate it. 
The next step of my evaluation process will be trying to get a lower
memory usage to move on with our tests. 
 
Kind regards
Stefan Gempeler
 
 
 
 
 
 
 
 
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20130603/d62d2775/attachment-0001.html>
    
    
More information about the users
mailing list