скрытое меню

регион памяти SYS_TIMEOUT

Cоздание блоков памяти в регионе [SYS_TIMEOUT] происходит на старте программы (lwip_init) в функции sys_timeouts_init .

#define LWIP_TIMERS должен быть установлен в 1.

В функции sys_timeouts_init происходит создание нескольких таймеров. Создаются таймеры вызовом функции sys_timeout.

У нас к примеру создаются 2 таймера.

#if IP_REASSEMBLY
	sys_timeout ( IP_TMR_INTERVAL , ip_reass_timer , NULL );
#endif /* IP_REASSEMBLY */
#if LWIP_ARP
	sys_timeout ( ARP_TMR_INTERVAL , arp_timer , NULL );
#endif /* LWIP_ARP */

Первый таймер для пересборки ip пакетов (для дефрагментации). Интервал 1000мс. Второй таймер для ARP пакетов , интервал 5000мс.

Содержание блока памяти это структура sys_timeo .

struct sys_timeo
{
  struct sys_timeo *next;
  u32_t time;
  sys_timeout_handler h;
  void *arg;

#if LWIP_DEBUG_TIMERNAMES
  const char* handler_name;
#endif /* LWIP_DEBUG_TIMERNAMES */
};

Таймеры всегда строят связанную цепочку через параметр next таким образом , что первый в цепочке будет самый короткий таймер и далее по порядку увеличения периода.

Указатель на самый первый (самый короткий) таймер хранится глобально в указателе next_timeout.

Теперь самое время упомянуть ,что для работы TCP обязательно надо обеспечить аппаратный таймер на сервере = 250мс .Этот таймер должен запускать функцию tcp_tmr, которая обслуживает отрытые tcp соединения, то есть следит когда уже пора их закрывать и т.д. , чтобы не было висяков в памяти.