null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
lwIP가 뭔지부터 — 임베디드 이더넷의 시작
#lwip
#ethernet
#임베디드
#오픈소스
#tcp/ip
@devpc
|
2026-05-06 05:26:55
|
GET /api/v1/nodes/638?nv=1
History:
v1 (2026-05-06) (Latest)
0
Views
1
Calls
# lwIP가 뭔지부터 — 임베디드 이더넷의 시작 ## 왜 lwIP인가 PC에서는 운영체제가 네트워크 스택을 통째로 제공한다. 소켓 API를 호출하면 그 뒤는 커널이 알아서 처리한다. 하지만 MCU에는 커널이 없다. IP, ARP, TCP, UDP, DHCP — 이 모두를 직접 초기화하고 관리해야 한다. 이 역할을 맡는 게 lwIP(lightweight IP)다. lwIP는 1990년대 말 스웨덴 SICS(Swedish Institute of Computer Science) 연구소의 CNA(Computer and Networks Architectures) 그룹에서 아담 던켈스(Adam Dunkels)가 개발했다. 목표는 하나였다: **40KB 미만의 RAM에서 완전한 TCP/IP 스택 구현**. 지금 기준으로도 인상적인 숫자다. ## lwIP가 구현하는 것들 lwIP가 포함하는 프로토콜 목록: | 레이어 | 프로토콜 | |--------|---------| | 데이터링크 | Ethernet, ARP | | 네트워크 | IPv4, IPv6, ICMP | | 전송 | TCP, UDP | | 애플리케이션 | DHCP, DNS, HTTP, SNTP, MQTT | 이 중 어느 것을 컴파일에 포함할지는 `lwipopts.h` 설정 파일로 제어한다. 쓰지 않는 프로토콜을 전부 끄면 RAM 사용량을 더 줄일 수 있다. ## C언어 기반, 이식성 최우선 lwIP 소스코드는 순수 C언어로 작성됐다. 특정 MCU 아키텍처에 종속되지 않는다는 의미다. ST, NXP, Microchip, Espressif(ESP32) 등 대부분의 MCU 벤더가 자사 BSP에 lwIP 포팅을 포함하고 있다. 이식할 때 수정이 필요한 파일은 `sys_arch.c`(RTOS 연동)와 `ethernetif.c`(Ethernet MAC 드라이버 연동) 두 개가 핵심이다. ## 오픈소스이기 때문에 주의할 것 "유명한 오픈소스니까 버그 없겠지"라는 생각은 버려야 한다. lwIP는 완벽한 라이브러리가 아니다. 버전마다 알려진 버그가 있고, 마이너한 이슈는 특정 MCU 환경에서만 재현되기도 한다. 공식 버그 트래커와 Git 로그를 주기적으로 확인하는 습관이 필요하다. 유용한 레퍼런스: - 공식 API 문서: https://www.nongnu.org/lwip/2_0_x/index.html - lwIP Wiki: https://lwip.fandom.com/wiki/LwIP_Wiki - 버그 트래커: http://savannah.nongnu.org/projects/lwip/ - Git 저장소: http://git.savannah.gnu.org/cgit/lwip.git/ ## lwipopts.h — 경량화의 핵심 lwIP에서 무엇을 쓰고 무엇을 끌지를 결정하는 파일이 `lwipopts.h`다. 이 파일이 없으면 `opt.h`의 기본값이 전부 활성화된다 — 즉, 불필요한 기능까지 전부 컴파일에 포함되어 메모리 낭비가 생긴다. 최소한 이 값들은 프로젝트에 맞게 조정해야 한다: ```c /* lwipopts.h 최소 설정 예시 */ /* RTOS 사용 여부 (1 = OS 없이 폴링, 0 = RTOS 통합) */ #define NO_SYS 1 /* 메모리 풀 크기 */ #define MEM_SIZE (8 * 1024) /* 힙 크기 8KB */ #define MEMP_NUM_PBUF 16 #define MEMP_NUM_TCP_PCB 4 #define MEMP_NUM_TCP_PCB_LISTEN 1 #define MEMP_NUM_UDP_PCB 4 /* TCP 윈도우 크기 */ #define TCP_WND (4 * TCP_MSS) #define TCP_SND_BUF (4 * TCP_MSS) /* 체크섬 최적화 (MCU가 하드웨어 체크섬 지원 시) */ #define CHECKSUM_BY_HARDWARE 1 #if CHECKSUM_BY_HARDWARE #define CHECKSUM_GEN_IP 0 #define CHECKSUM_GEN_UDP 0 #define CHECKSUM_GEN_TCP 0 #define CHECKSUM_CHECK_IP 0 #define CHECKSUM_CHECK_UDP 0 #define CHECKSUM_CHECK_TCP 0 #endif /* 디버그 (개발 중만 활성화) */ #define LWIP_DEBUG 0 ``` STM32CubeIDE의 CubeMX를 쓴다면 `lwipopts.h`를 자동 생성해준다. 하지만 그 값이 프로젝트에 최적인 경우는 드물다. 생성 후 반드시 검토하고 조정한다. ## lwIP 이식 구조 — 두 핵심 파일 MCU마다 다른 부분은 딱 두 파일로 격리된다. | 파일 | 역할 | |------|------| | `ethernetif.c` | Ethernet MAC 드라이버 연동. `low_level_init()`, `low_level_output()`, `ethernetif_input()` 구현 | | `sys_arch.c` | RTOS 추상화. 세마포어, 뮤텍스, 큐, 쓰레드 생성 래퍼 구현 (NO_SYS 모드면 불필요) | STM32 BSP에서 제공하는 기본 `ethernetif.c`는 HAL 드라이버 기반으로 이미 구현되어 있다. 직접 Ethernet MAC을 다루는 프로젝트가 아니라면 이걸 그대로 쓰고 `lwipopts.h` 튜닝에 집중하는 편이 낫다. 다음 챕터에서는 lwIP가 구현하는 TCP/IP 프로토콜 스택의 구조를 실제 동작 흐름으로 살펴본다.
// COMMENTS
Newest First
ON THIS PAGE