[En-Nut-Discussion] Anything to look for NutO/S on AT90CAN without ext RAM?
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:
PLATFORM = "ETHERNUT2"
AVR_GCC = ""
GCC_DEBUG = ""
MCU_AT90CAN128 = ""
NUTMEM_START = "0x100"
NUTMEM_RESERVED = "64"
NUT_CPU_FREQ = "16000000"
ATCAN_RX_BUF_SIZE = "4"
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 __attribute__ ((section (".aram")));
volatile unsigned char nco_state __attribute__ ((section (".aram")));
volatile unsigned long int nco_r __attribute__ ((section (".aram")));
unsigned char nco_hid __attribute__ ((section (".aram")));
unsigned char hf_hid __attribute__ ((section (".aram")));
I added in the application Makefile
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