скрытое меню

выделение памяти pbuf_alloc

Для варианта http server raw, который не предназначен для работы во FreeRTOS, память выделяется через функцию pbuf_alloc для входящих данных с физического уровня.

Третий параметр pbuf_alloc

PBUF_ROM

Что такое PBUF_ROM ? Если остановиться варианте исполнения pbuf_alloc(.., .., PBUF_ROM) , то мы видим следующий стек функций :

Thread #3 536874336 (defaultTask : Running [P: 3]) (Suspended : Breakpoint)	
	pbuf_alloc() at pbuf.c:236 0x801c780	
	tcp_write() at tcp_out.c:627 0x801f53e	
	altcp_tcp_write() at altcp_tcp.c:357 0x8019c32	
	altcp_write() at altcp.c:383 0x80199a4	
	http_write() at httpd.c:567 0x80189be	
	http_send_data_nonssi() at httpd.c:1 225 0x8018d7c	
	http_send() at httpd.c:1 659 0x8018ee4	
	http_recv() at httpd.c:2 755 0x8019842	
	altcp_tcp_recv() at altcp_tcp.c:108 0x8019be4	
	tcp_input() at tcp_in.c:501 0x801ed12	
	<...more frames...>	

В общем PBUF_ROM это наши ответные данные из FLASH (где лежат наши web файлы ) и чтобы их отправить по идеи не надо использовать SRAM.

PBUF_RAM

А этот вариант выделения памяти (PBUF_RAM) используется для быстрых ответов , например на запросы ARP , так как на них долго думать не надо .

Вот примерный стек функций :

Thread #3 536874336 (defaultTask : Running [P: 3]) (Suspended : Breakpoint)	
	pbuf_alloc() at pbuf.c:301 0x801c74e	
	etharp_raw() at etharp.c:1 168 0x801a70e	
	etharp_input() at etharp.c:758 0x801a89c	
	ethernet_input() at ethernet.c:213 0x80216d2	
	usb_polling() at rndis_init.c:250 0x80214c4	
	StartDefaultTask() at main.c:779 0x8021998	
	uxListRemove() at list.c:227 0x801383c	

Это вариант выделения из общей кучи.

PBUF_POOL

А этот вариант выделения памяти , когда нужно время и когда будут выделятся связанные куски памяти и их удалять сразу нельзя. Тут строятся цепочки из кусков памяти . Вот например udp запрос :

Thread #3 536874336 (defaultTask : Running [P: 3]) (Suspended : Breakpoint)	
	pbuf_alloc() at pbuf.c:251 0x801c7c6	
	udp_recv_proc() at dhserver.c:378 0x80208c4	
	udp_input() at udp.c:431 0x801ffde	
	ip4_input() at ip4.c:734 0x801b336	
	ethernet_input() at ethernet.c:194 0x80216a4	
	usb_polling() at rndis_init.c:250 0x80214c4	
	StartDefaultTask() at main.c:779 0x8021998	
	uxListRemove() at list.c:227 0x801383c