|
Read-Only
Author Kay Kubitz
Posted 31-May-2012 09:00 GMT
Toolset ARM
|
 Problems using UDP (ERR_MEM_ALLOC)
Kay Kubitz
Hi,
I have a negative effect while using UDP for sending data between
my controller (NXP LPC2368)and PC. I use not the RTOS (anyway with
RTOS i had the same problem)!
I using two sockets with different portnumbers - one for receiving -
one for transmitting. In my UDP-callback I use no routines like
udp_get_buf() or send_udp(). In the UART-ISR I send data to the PC
(~2,5 MBit) using udp_get_buf() and udp_send().
The bandwith-, RAM- and CPU-usage is not to hard at all (using
GPIO to measure the CPU-usage of each routine).
Everything is working very well as long as I send (2,5MBit) and
receive(1kBit) not simultaniously! I this case the system runs well
for some seconds and fail with "ERR_MEM_ALLOC" in "void sys_error()"
(part of Net_Config).
I tried different settings for Stack- and Heap-Size and the usage
of RTOS - allways the same.
The important parts of my source:
__irq void UART1_ISR(void)
{
...
datasendbuf = udp_get_buf (6+(40*12));
memcpy(datasendbuf,"^GMC",4);
...(memcpy)... }
udp_send (udp_soc1, GMC_remip, GMC_port, datasendbuf, 6+(40*12));
...
VICVectAddr = 0; //Acknowledge Interrupt
}
U16 udp_callback (U8 socket, U8 *remip, U16 port, U8 *buf, U16 len)
{
U8 *sendbuf;
char rx;
short x;
if(socket == udp_soc)
{
//Interpreter
x=0;
while(x<len)
{
rx = buf[x]; //Buffer Zeichenweise auslesen
x++;
if(rx=='^') //Auf Startzeichen prüfen
{
rx_start = 1;
rx_CR = 0;
udp_in_pointer = 0;
}
if(rx_start)
{
udp_in[udp_in_pointer] = rx; //Daten in Puffer übernehmen
udp_in_pointer++;
if(rx_CR)
{
if(rx == '\n')//Warten bis Endekennung empfangen
{
//Befehlshandler
if(!strncmp(udp_in+1,"GMC",3))
{
SMP = 0;
GMC = read_RS232_int(udp_in+4,4);
memcpy(GMC_remip,remip,4);
GMC_port = port;
}
else if(!strncmp(udp_in+1,"GCH",3))
{
//Comming soon
}
}
}
else
{
if(rx == '\r')rx_CR=1;
}
if(udp_in_pointer==255)
{
rx_start = 0;
}
}
}
}
return (0);
}
void init (void)
{
init_mcu ();
init_variables();
Timer_Init() ;
init_TcpNet ();
read_settings();
//UDP-Socket for transmit
udp_soc1 = udp_get_socket (0, UDP_OPT_SEND_CS | UDP_OPT_CHK_CS, udp_callback);
if (udp_soc1 != 0) {
udp_open (udp_soc1, 0);
}
//UDP-Socket for receive
udp_soc = udp_get_socket (0, UDP_OPT_SEND_CS | UDP_OPT_CHK_CS, udp_callback);
if (udp_soc != 0) {
udp_open (udp_soc, 11000);
}
}
int main (void)
{
init();
while(1)
{
timer_poll();
main_TcpNet();
}
}
Thanks for your comments!
|