lwip-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [lwip-users] LWIP size


From: Dany Thiffeault
Subject: Re: [lwip-users] LWIP size
Date: Mon, 16 Nov 2009 09:57:22 -0500

Sorry for the delay, had to work on something else.

hum... the first thing I see is that your linker options do not define a heap size, so basically all the SDRAM will be used for heap because of that line in the linker script:
__heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : LENGTH(SDRAM); 

What I suggest is to define a maximum heap size, like 2MB and use the rest of the SDRAM to store your buffers. You need to be careful with adressing, because if you write in the memory section used by your heap, bad things will happen. Here is a copy/paste of some information in the Atmel application note:

This symbol can be defined when invoking the linker
using the option –Wl,--defsym,__heap_size__=value when calling the linker through avr32-gcc (which is expressed as –defsym __heap_size__=value when calling avr32-ld directly).
In the stand-alone package coming with this application note, the heap size is set to 0x200000 (i.e. 2MB).

Here are my linker options:
-march=ucr2 -Wl,--gc-sections -Wl,-e,_trampoline -Wl,--defsym,__heap_size__=0x00200000 -T../src/CONFIG/link_uc3a0512_extsdram.lds

So, I define 2MB for the heap and use the rest at my convenience.

Try this!


On Sun, Oct 4, 2009 at 12:41 PM, Oscar F <address@hidden> wrote:
Hello Dany, i have tested all solutions and bad result. I'll tell you:

all thing i have in my application for EVK1100. I need a big buffer of 12000 bytes, and i need 8 socket. my application fail sometime when accept the socket or when receive of the one socket with a fixed port. my fisrt idea s create the task with more memory, and i think in place the data in external SDRAM. Other thing i'm using FREE RTOS.

Can you help me?
Thanks in advance!!
Oscar

My files:

the linker option i have
-nostartfiles -L../src/SOFTWARE_FRAMEWORK/UTILS/LIBS/NEWLIB_ADDONS -T../src/CONFIG/link_extsdram.lds -march=ucr2 -Wl,--gc-sections -Wl,-e,_trampoline -mpart=uc3a0512 -Wl,--gc-sections --rodata-writable --direct-data



more information, The files:

link_extsdram.lds:
OUTPUT_FORMAT("elf32-avr32", "elf32-avr32", "elf32-avr32")

OUTPUT_ARCH(avr32:uc)

ENTRY(_start)

MEMORY
{
FLASH (rxai!w) : ORIGIN = 0x80000000, LENGTH = 0x00080000
INTRAM (wxa!ri) : ORIGIN = 0x00000004, LENGTH = 0x0000FFFC
SDRAM (wxa!ri) : ORIGIN = 0xD0000000, LENGTH = 0x01000000
USERPAGE : ORIGIN = 0x80800000, LENGTH = 0x00000200
}

PHDRS
{
FLASH PT_LOAD;
INTRAM_ALIGN PT_NULL;
INTRAM_AT_FLASH PT_LOAD;
INTRAM PT_NULL;
SDRAM_AT_FLASH PT_LOAD;
SDRAM PT_NULL;
USERPAGE PT_LOAD;
}

SECTIONS
{
/* Use a default heap size if heap size was not defined. */
__heap_size__ = DEFINED(__heap_size__) ? __heap_size__ : LENGTH(SDRAM);

/* Use a default stack size if stack size was not defined. */
__stack_size__ = DEFINED(__stack_size__) ? __stack_size__ : 10K;

/* Read-only sections, merged into text segment: */
PROVIDE (__executable_start = 0x80000000); . = 0x80000000;
.interp : { *(.interp) } >FLASH AT>FLASH :FLASH
.reset : { *(.reset) } >FLASH AT>FLASH :FLASH
.hash : { *(.hash) } >FLASH AT>FLASH :FLASH
.dynsym : { *(.dynsym) } >FLASH AT>FLASH :FLASH
.dynstr : { *(.dynstr) } >FLASH AT>FLASH :FLASH
.gnu.version : { *(.gnu.version) } >FLASH AT>FLASH :FLASH
.gnu.version_d : { *(.gnu.version_d) } >FLASH AT>FLASH :FLASH
.gnu.version_r : { *(.gnu.version_r) } >FLASH AT>FLASH :FLASH
.rel.init : { *(.rel.init) } >FLASH AT>FLASH :FLASH
.rela.init : { *(.rela.init) } >FLASH AT>FLASH :FLASH
.rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH
.rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } >FLASH AT>FLASH :FLASH
.rel.fini : { *(.rel.fini) } >FLASH AT>FLASH :FLASH
.rela.fini : { *(.rela.fini) } >FLASH AT>FLASH :FLASH
.rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH
.rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH
.rel.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH
.rela.data.rel.ro : { *(.rel.data.rel.ro*) } >FLASH AT>FLASH :FLASH
.rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH
.rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } >FLASH AT>FLASH :FLASH
.rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH
.rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } >FLASH AT>FLASH :FLASH
.rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH
.rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } >FLASH AT>FLASH :FLASH
.rel.ctors : { *(.rel.ctors) } >FLASH AT>FLASH :FLASH
.rela.ctors : { *(.rela.ctors) } >FLASH AT>FLASH :FLASH
.rel.dtors : { *(.rel.dtors) } >FLASH AT>FLASH :FLASH
.rela.dtors : { *(.rela.dtors) } >FLASH AT>FLASH :FLASH
.rel.got : { *(.rel.got) } >FLASH AT>FLASH :FLASH
.rela.got : { *(.rela.got) } >FLASH AT>FLASH :FLASH
.rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH
.rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } >FLASH AT>FLASH :FLASH
.rel.plt : { *(.rel.plt) } >FLASH AT>FLASH :FLASH
.rela.plt : { *(.rela.plt) } >FLASH AT>FLASH :FLASH
.init :
{
KEEP (*(.init))
} >FLASH AT>FLASH :FLASH =0xd703d703
.plt : { *(.plt) } >FLASH AT>FLASH :FLASH
.text :
{
*(.text .stub .text.* .gnu.linkonce.t.*)
KEEP (*(.text.*personality*))
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
} >FLASH AT>FLASH :FLASH =0xd703d703
.fini :
{
KEEP (*(.fini))
} >FLASH AT>FLASH :FLASH =0xd703d703
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
.rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } >FLASH AT>FLASH :FLASH
.rodata1 : { *(.rodata1) } >FLASH AT>FLASH :FLASH
.eh_frame_hdr : { *(.eh_frame_hdr) } >FLASH AT>FLASH :FLASH
.eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } >FLASH AT>FLASH :FLASH
.gcc_except_table : ONLY_IF_RO { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >FLASH AT>FLASH :FLASH
.lalign : { . = ALIGN(Cool; PROVIDE(_data_lma = .); } >FLASH AT>FLASH :FLASH
. = ORIGIN(INTRAM);
.dalign : { . = ALIGN(Cool; PROVIDE(_data = .); } >INTRAM AT>INTRAM :INTRAM_ALIGN
/* Exception handling */
.eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
.gcc_except_table : ONLY_IF_RW { KEEP (*(.gcc_except_table)) *(.gcc_except_table.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
/* Thread Local Storage sections */
.tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
.tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
/* Ensure the __preinit_array_start label is properly aligned. We
could instead move the label definition inside the section, but
the linker would then create the section even if it turns out to
be empty, which isn't pretty. */
PROVIDE (__preinit_array_start = ALIGN(32 / Cool);
.preinit_array : { KEEP (*(.preinit_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
PROVIDE (__preinit_array_end = .);
PROVIDE (__init_array_start = .);
.init_array : { KEEP (*(.init_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
PROVIDE (__init_array_end = .);
PROVIDE (__fini_array_start = .);
.fini_array : { KEEP (*(.fini_array)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
PROVIDE (__fini_array_end = .);
.ctors :
{
/* gcc uses crtbegin.o to find the start of
the constructors, so we make sure it is
first. Because this is a wildcard, it
doesn't matter if the user does not
actually link against crtbegin.o; the
linker won't look for a file to match a
wildcard. The wildcard also means that it
doesn't matter which directory crtbegin.o
is in. */
KEEP (*crtbegin*.o(.ctors))
/* We don't want to include the .ctor section from
from the crtend.o file until after the sorted ctors.
The .ctor section from the crtend file contains the
end of ctors marker and it must be last */
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
} >INTRAM AT>FLASH :INTRAM_AT_FLASH
.dtors :
{
KEEP (*crtbegin*.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend*.o ) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
} >INTRAM AT>FLASH :INTRAM_AT_FLASH
.jcr : { KEEP (*(.jcr)) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
.data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
.dynamic : { *(.dynamic) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
.got : { *(.got.plt) *(.got) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
.ramtext : { *(.ramtext .ramtext.*) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
.ddalign : { . = ALIGN(Cool; } >INTRAM AT>FLASH :INTRAM_AT_FLASH
.data :
{
*(.data .data.* .gnu.linkonce.d.*)
KEEP (*(.gnu.linkonce.d.*personality*))
SORT(CONSTRUCTORS)
} >INTRAM AT>FLASH :INTRAM_AT_FLASH
.data1 : { *(.data1) } >INTRAM AT>FLASH :INTRAM_AT_FLASH
.balign : { . = ALIGN(Cool; PROVIDE(_edata = .); } >INTRAM AT>FLASH :INTRAM_AT_FLASH
PROVIDE (edata = .);
__bss_start = .;
.bss :
{
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
/* Align here to ensure that the .bss section occupies space up to
_end. Align after .bss to ensure correct alignment even if the
.bss section disappears because there are no input sections. */
. = ALIGN(Cool;
} >INTRAM AT>INTRAM :INTRAM
. = ALIGN(Cool;
_end = .;
PROVIDE (end = .);
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
.stack ORIGIN(INTRAM) + LENGTH(INTRAM) - __stack_size__ :
{
_stack = .;
*(.stack)
. = __stack_size__;
_estack = .;
} >INTRAM AT>INTRAM :INTRAM

. = ORIGIN(SDRAM);
.data_sdram ORIGIN(SDRAM) :
{
PROVIDE(_data_sdram = .);
*(.data_sdram)
. = ALIGN(Cool;
PROVIDE(_edata_sdram = .);
} >SDRAM AT>FLASH :SDRAM_AT_FLASH

PROVIDE(_data_sdram_lma = ABSOLUTE(LOADADDR(.data_sdram)));

. = ALIGN(Cool;
.bss_sdram :
{
PROVIDE(__bss_sdram_start = .);
*(.bss_sdram)
PROVIDE(_bss_sdram_end = .);
} >SDRAM AT>SDRAM :SDRAM

.heap :
{
__heap_start__ = .;
*(.heap)
. = __heap_size__;
__heap_end__ = .;
} >SDRAM AT>SDRAM :SDRAM

.userpage : { *(.userpage .userpage.*) } >USERPAGE AT>USERPAGE :USERPAGE
/DISCARD/ : { *(.note.GNU-stack) }
}

crt0.x

include <avr32/io.h>


//! @{
//! \verbatim


// This must be linked @ 0x80000000 if it is to be run upon reset.
.section .reset, "ax", @progbits


.global _start
.type _start, @function
_start:
// Jump to the C runtime startup routine.
lda.w pc, _stext


// _stext is placed outside the .reset section so that the program entry point
// can be changed without affecting the C runtime startup.
.section .text._stext, "ax", @progbits


.global _stext
.type _stext, @function
_stext:
// Set initial stack pointer.
lda.w sp, _estack

// Set up EVBA so interrupts can be enabled.
lda.w r0, _evba
mtsr AVR32_EVBA, r0

// Enable the exception processing.
csrf AVR32_SR_EM_OFFSET

// Call the startup customization function.
call _init_startup

// Load initialized external SDRAM data having a global lifetime from the
// data_sdram LMA.
lda.w r0, _data_sdram
lda.w r1, _edata_sdram
cp r0, r1
brhs idata_sdram_load_loop_end
lda.w r2, _data_sdram_lma
idata_sdram_load_loop:
ld.d r4, r2++
st.d r0++, r4
cp r0, r1
brlo idata_sdram_load_loop
idata_sdram_load_loop_end:

// Clear uninitialized external SDRAM data having a global lifetime in the
// blank static storage section.
lda.w r0, __bss_sdram_start
lda.w r1, _bss_sdram_end
cp r0, r1
brhs udata_sdram_clear_loop_end
mov r2, 0
mov r3, 0
udata_sdram_clear_loop:
st.d r0++, r2
cp r0, r1
brlo udata_sdram_clear_loop
udata_sdram_clear_loop_end:

// Load initialized data having a global lifetime from the data LMA.
lda.w r0, _data
lda.w r1, _edata
cp r0, r1
brhs idata_load_loop_end
lda.w r2, _data_lma
idata_load_loop:
ld.d r4, r2++
st.d r0++, r4
cp r0, r1
brlo idata_load_loop
idata_load_loop_end:

// Clear uninitialized data having a global lifetime in the blank static storage section.
lda.w r0, __bss_start
lda.w r1, _end
cp r0, r1
brhs udata_clear_loop_end
mov r2, 0
mov r3, 0
udata_clear_loop:
st.d r0++, r2
cp r0, r1
brlo udata_clear_loop
udata_clear_loop_end:

#ifdef CONFIG_FRAME_POINTER
// Safety: Set the default "return" @ to the exit routine address.
lda.w lr, exit
#endif

// Start the show.
lda.w pc, main


//! \endverbatim
//! @}

init_startup:
int _init_startup(void)

{

// Import the Exception Vector Base Address.
extern void _evba;


// Load the Exception Vector Base Address in the corresponding system register
Set_system_register(AVR32_EVBA, (int)&_evba);


// Enable exceptions.
Enable_global_exception();

// Initialize interrupt handling.
INTC_init_interrupts();

/*********************** CONFIGURING CLOCK ***********************/

/* Switch to external oscillator 0 */
pm_switch_to_osc0( pm, FOSC0, OSC0_STARTUP );

/* Setup PLL0 on OSC0, mul+1=10 ,divisor by 1, lockcount=16, ie. 12Mhzx11/1 = 132MHz output.
Extra div by 2 => 66MHz */

pm_pll_setup(pm, // volatile avr32_pm_t* pm
0, // unsigned int pll
10, //10 unsigned int mul
1, // unsigned int div: Sel Osc0/PLL0 or Osc1/Pll1
0, // unsigned int osc
16); // unsigned int lockcount


pm_pll_set_option( pm, 0, // pll0
1, // Choose the range 80-120MHz.
1, // div2
0 ); // wbwdisable

/* Enable PLL0 */
pm_pll_enable(pm,0);

/* Wait for PLL0 locked */
pm_wait_for_pll0_locked(pm) ;

/* switch to clock */
//HSB=CLKmain=PSA=PSB= 66Mhz
pm_cksel(pm,0,0,0,0,0,0);
flashc_set_wait_state( 1 );
pm_switch_to_clock( pm, AVR32_PM_MCCTRL_MCSEL_PLL0 );

init_dbg_rs232(configCPU_CLOCK_HZ); //for debugging


// Initialize the SDRAM Controller and the external SDRAM chip.
sdramc_init(configCPU_CLOCK_HZ);
// From that point on, the external SDRAM can be accessed as a memory being
// part of the AVR32 UC3 memory map.
print_dbg("SDRAM inicializada asi como el Clock \n");


return 1;
}



Regards
Oscar







On Sat, Oct 3, 2009 at 11:15 AM, Oscar F <address@hidden> wrote:
Thank you very much Downy!!, i folow your advice, after reading the documentation, my first idea is change the original FREERTOS function "_init_startup", then i will change the CRT0.x and the last inster the script for linker. I dont know how is the script reference by the linker, because the documentation do not say anything.

If i have problem i will write in this post again.

Regards
Oscar


On Fri, Oct 2, 2009 at 5:27 PM, Dany Thiffeault <address@hidden> wrote:
yep. There is a nice application note by Atmel on that matter that explain well what to do. Get the .zip file from their website too, with all the files.
Advices:

1- If you don't want to mess with the FREERTOS function "_init_startup", just rename it and define yours in your main.c.
2- If you are using C++ (main.cpp), you need the "extern "C" {} englobing your own "init_startup" function.

That's about it. The application note takes care of everything else.

The application note:

Some AVRFreaks thread on the matter.

If you have any questions, don't hesitate, I've just done it hehe :)
Downy


On Fri, Oct 2, 2009 at 6:16 AM, Oscar F <address@hidden> wrote:
Hello, i think i ´ll move the heap and data to SDRAM. I read the application note, but i don´t know exactly that files create or edit because i have lwip and freeRTOS.

My first idea is to do:

a) edit the crt0.x of the project
b) edit init_startup function in the port directory of FREERTOS
c) Add de link_... .lds  to the project
d)  change the option of linker

Do you follow this step?
Thanks
Oscar



On Thu, Oct 1, 2009 at 7:05 PM, Oscar F <address@hidden> wrote:
Hello one question, if i defined one buffer very big, is necesary to increase alot the stack of the task. My memory is 64k too and i have FreeRTOS and lwip. I need to create a buffer of 20000bytes.

Do you think i have enough memory or i need to move all memory to SDRAM?

thanks

Oscar


On Thu, Oct 1, 2009 at 6:05 PM, Dany Thiffeault <address@hidden> wrote:
great, thanks!

I tried many things, but not this one.

Also, I want to point out that in the meantime, I decided to move my heap to my SDRAM instead of the 64k SRAM on the AVR32UC3. Now I have enough space to create all my tasks without problem, even with bigger stack sizes.



On Thu, Oct 1, 2009 at 1:09 AM, Mathias Zenger <address@hidden> wrote:
check this:
mathias
-----Ursprüngliche Nachricht-----
Von: lwip-users-bounces+m.zenger=mobatime.com@nongnu.org [mailto:lwip-users-bounces+m.zenger=mobatime.com@nongnu.org]Im Auftrag von Dany Thiffeault
Gesendet: Mittwoch, 30. September 2009 17:42
An: Mailing list for lwIP users
Betreff: Re: [lwip-users] LWIP size

Thanks Bill, good idea. 

I'm still trying to figure out how to generate the MAP file with AVRStudio 2.1...



On Tue, Sep 29, 2009 at 5:30 PM, Bill Auerbach <address@hidden> wrote:

Check you MAP file and find out where RAM has been allocated.  It’s easy to allocate too many PBUF_POOLs and run out of memory that way.

 

Bill

 

From: lwip-users-bounces+bauerbach=arrayonline.com@nongnu.org [mailto:lwip-users-bounces+bauerbach=arrayonline.com@nongnu.org] On Behalf Of Dany Thiffeault
Sent: Tuesday, September 29, 2009 3:56 PM
To: Mailing list for lwIP users
Subject: [lwip-users] LWIP size

 

Hi,

 

I would like to know what is the expected (approx.) size of the lwip stack. I use sequential configuration. My problem is that on my AVR32, I only have 64kbytes of SRAM and for some reasons, it is full. I'm trying to run my application using FreeRTOS and lwip. When I create tasks, my last one always fail on the malloc.

 

So, I'm assuming that FreeRTOS and lwip take a significant amount of space on my AVR32 in SRAM because my tasks have those sizes (presented in order of creation):

 

1- lwip Main task:                        512

2- Startup task (my own):            512

3- FreeRTOS Scheduler:             256

4- Ethernet task (my own):          512

5- Ethif (lwip):                             256

6- Diags task (my own):              512

 

The last one is the one that fails. So, out of 64kbytes, my tasks take much less memory. I another project not using lwip, I was able to create 3 tasks of 1024,  4096 and 4096 of size. So, I presume lwip takes a significant amount of space.

 

If yes, how could I tweak the config to reduce the size taken?

 

Best regards,

DownyTif.


_______________________________________________
lwip-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/lwip-users


_______________________________________________
lwip-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/lwip-users


_______________________________________________
lwip-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/lwip-users



_______________________________________________
lwip-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/lwip-users


_______________________________________________
lwip-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/lwip-users



_______________________________________________
lwip-users mailing list
address@hidden
http://lists.nongnu.org/mailman/listinfo/lwip-users


reply via email to

[Prev in Thread] Current Thread [Next in Thread]