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
  • Hi, In this post:http://www.keil.com/forum/13707/ Predrag Despotovic said that :
    "(I was playing with bootloader IRAM1_size. And in my case, bootloader needs somewhere around 0xDFF of RAM. So in order not to overlap it's area, my IRAM1 starts at 0x40001000. Moshe Tal suggested 0x40000100 for his lpc2368 - not enough in my case. Try playing with IRAM1_size in bootloader project to determine your minimum...)"

    Now my question is why is it necessary to not to overlap the RAM area of bootloader in application code. ? Don't we only need to protect the 64 bytes of exception vectors of RAM area.
    Wouldn't rest of the ram be available to be used by application code.

Reply
  • Hi, In this post:http://www.keil.com/forum/13707/ Predrag Despotovic said that :
    "(I was playing with bootloader IRAM1_size. And in my case, bootloader needs somewhere around 0xDFF of RAM. So in order not to overlap it's area, my IRAM1 starts at 0x40001000. Moshe Tal suggested 0x40000100 for his lpc2368 - not enough in my case. Try playing with IRAM1_size in bootloader project to determine your minimum...)"

    Now my question is why is it necessary to not to overlap the RAM area of bootloader in application code. ? Don't we only need to protect the 64 bytes of exception vectors of RAM area.
    Wouldn't rest of the ram be available to be used by application code.

Children