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.
The bootloader and application can share RAM Ok.
But that would be very clear and visible if there is any such software layer. Lets say i am using the default SD/MMC bootloader provided by nxp for LPC2100 series.
In that case what i apprehended is right?