[En-Nut-Discussion] Anything to look for NutO/S on AT90CAN without ext RAM?

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Thu Aug 13 11:00:56 CEST 2009

>>>>> "Ulrich" == Ulrich Prinz <uprinz2 at netscape.net> writes:

    Ulrich> Hi!  I'd like to start an other project based on NutO/S and an
    Ulrich> AT90CAN128. I have no RAM but I do not need network. Just want
    Ulrich> to use the framework, tasks and device drivers.

    Ulrich> What to modify in NutO/S that it does not try to enable external
    Ulrich> RAM and put data there?

Here is the config I have for a AT90CAN128 configuration without RAM:

AVR_GCC = ""
MCU_AT90CAN128 = ""
NUTMEM_START = "0x100"
NUT_CPU_FREQ = "16000000"

Be sure to lower the number of can buffers, as these buffer chew lots of memory.
I also lowered  UART queues, as one UART is only uses to send out data and
the other only does one-wire communication

      result = NutRegisterDevice(&DEV_UART1, 0, 0);
      uart1 = fopen(DEV_UART1_NAME, "r+");
      _ioctl(_fileno(uart1), UART_SETSPEED, &baud);
      /* 090209: we don't evaluate received chars, so reduce queue size */
      _ioctl(_fileno(uart1), UART_SETRXBUFSIZ, &buf_size);
The firmware runs on several devices, doing some detection magic. In the
case these boards have external ram, I enable it:

  /* Use external RAM (but not for STACK!) */
  XMCRA = _BV(SRE) | _BV(SRW10); /* Upper range from 0to ffff, 1 Waitstate*/
  XMCRB = _BV(XMBK); /* Keepers, Full memory range*/
I can place variables there like
volatile unsigned char ll_relais[2]     __attribute__ ((section (".aram")));
volatile unsigned char nco_state        __attribute__ ((section (".aram")));
volatile unsigned long int nco_r[4]     __attribute__ ((section (".aram")));
         unsigned char nco_hid[8]       __attribute__ ((section (".aram")));
         unsigned char hf_hid[8]        __attribute__ ((section (".aram")));

I added in the application Makefile

include $(top_srcdir)/nutapps/Makerules

LDFLAGS += -Wl,--section-start=.aram=0x801100  -Wl,--section-start=.fpga=0x80e000
BINFLAGS += -R .aram -R .fpga

cps.o: ../inc/cps_can.h ../inc/fpgaboards.h

That way, no pointer in the base ram is needed for these variables

If there are memory mapped registers I do

volatile unsigned char * alu_ctl= (unsigned char *)             0xe000;
volatile unsigned long int *prog_data  = (unsigned long int *)  0xf000;
volatile unsigned long int *const_data = (unsigned long int *)  0xf400;

Hope this helps
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------

More information about the En-Nut-Discussion mailing list