This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

problem with large buffers in ram

Hi,
MCU: LPC2138
I am writing a code that takes data from serial port (interrupt driven) and stores it in queues.
Here's an overview:

//////////////
struct queue{
   char *buffer;
   int wp;
   in rp;
 };

char buffer1[6000];
char buffer2[1000];
char buffer3[600];
char uartBuffer[100];
struct queue myQueue;

void initQueue(char* bufferQueue, int size) {
    myQueue.buffer = bufferQueue;
    myQueue.wp = 0;
    myQueue.rp = 0;
}

void enqueue(char *data) {
  q = &myQueues;
  while(data[i] != '\0') {
        q->buffer[q->writePointer++] = data[i++];
        if (q->writePointer >= q->size)
                q->writePointer = 0;
        }
        q->buffer[q->writePointer++] = 0;
        if (q->writePointer >= q->size)
                q->writePointer = 0;
}

int main () {
  char str[50];
  UART0_init(9600);
  UART0_interrupt_init();
  initQueue(buffer3, 600);

  while(1) {
     sprintf(str, "wp: %d    rp: %d", myQueues.wp, myQueues.rp);
     UART0_sendstring(str);
  }
}

void UART0Isr() {
     UARTbuffer[i] = UART0_getbyte(); // get data until sequence completed
     if(/*sequence complete condition*/)
           enqueue(UARTbuffer);
}

Now, the problem is that the controller hangs after "enqueuing" 8 sequences(all sequences are same). and the number 8 decreases if i increase the size of sequence.

if i reduce the buffer3 size to 500 or less, code works perfectly fine.
for buffer3 size >= 500 ----> code hangs

if i interchange the declaration sequence of global variables like:

char buffer3[600];
char buffer1[6000];
char buffer2[1000];

it gets ok. Atleast for 1000 sequences.

if i disable all interrupts and use enqueue in main in a while loop, its runs fine.

void main() {
while(1) {
  enqueue(sequence);    //works fine here
}
}

Thanks for reading and advance thanks for helpful replies.

Regards,
Salman.

Parents
  • UM10114
    Chapter 21: LPC21xx/22xx Flash memory controller

    5.11 RAM used by ISP command handler
    ISP commands use on-chip RAM from 0x4000 0120 to 0x4000 01FF. The user could use
    this area, but the contents may be lost upon reset. Flash programming commands use the
    top 32 bytes of on-chip RAM. The stack is located at RAM top - 32. The maximum stack
    usage is 256 bytes and it grows downwards.

Reply
  • UM10114
    Chapter 21: LPC21xx/22xx Flash memory controller

    5.11 RAM used by ISP command handler
    ISP commands use on-chip RAM from 0x4000 0120 to 0x4000 01FF. The user could use
    this area, but the contents may be lost upon reset. Flash programming commands use the
    top 32 bytes of on-chip RAM. The stack is located at RAM top - 32. The maximum stack
    usage is 256 bytes and it grows downwards.

Children