Brise

STM32 LwIP 구조 - 3 본문

MCU

STM32 LwIP 구조 - 3

naudhizb 2020. 10. 18. 20:48
반응형

<< STM32 ETH + LwIP Init >>


STM32CubeMX 프로젝트에서 LwIP를 이용한 이더넷은 여러 단계의 초기화 과정을 거친다. 위 그림과 같이 5가지의 과정으로 나눌 수 있다.
먼저 위의 4가지 부분은 CubeMX에서 생성하는 자동생성 코드이며 HAL_ETH_MspInit함수와 HAL_ETH_Init, 두 함수는 configurable하다.
HAL_ETH_MspInit함수는 ETH 주변장치를 사용하기 위한 핀 설정을 초기화하며,
HAL_ETH_Init은 MII/RMII 인터페이스 선택 및 PHY 설정을 초기화한다.
여기서 주의할 점 중 하나는 STM32의 MAC설정의 경우 ETH_MACDMAConfig에서 수행하는데 해당 부분에 대한 설정은 비교적 자유롭지 않다는 점이다.
예를 들어, MACDMA 설정의 멀티캐스트 필터링의 기본값은 perfect인데, 만약 사용자가 여러 멀티캐스트를 받고 싶다면 stm32f7xx_hal_eth.c의 해당 코드를 수정하여야 한다.

만약 여러분이 ST의 개발보드에서 제공하는 phy가 아닌 별도의 phy를 사용하여야 한다면 1,3,4번째 부분을 변경하여야 하며, PHY 인터페이스 또한 다르거나 패킷 조작 관련하여 변경이 필요하다면 5번째와 low_level관련 인터페이스, link callback 관련 부분을 변경하여야 할 것이다.


CubeMX프로젝트에서 LwIP를 이용한 이더넷 서비스 방식에는 크게 두 가지가 있다.
첫 번째는 왼쪽에서 보는 것과 같이 이더넷 패킷이 도착하였는지 폴링하는 방식이 있고, 후자와 같이 이더넷 프레임이 수신되었을 때 인터럽트를 통하여 수신하는 방식이 있다. 물론 후자의 경우가 효율적이겠지만, 그만큼 프로그램의 흐름이 복잡해지기 때문에 프로그램의 실행을 중재하는 기능(i.e. FreeRTOS)이 필요하다. 때문에 인터럽트 모드의 경우 FreeRTOS를 같이 포함하는 경우에 사용된다.


실 구현에서 이더넷 프레임을 수신하는 과정의 코드를 보면 폴링 모드에서 주기적으로 ethernetif_input함수를 호출하며 호출된 함수 안에서 low_level_input함수를 호출하여 수신된 패킷이 있는 경우 패킷 p를 netif->input()를 통하여 처리하는 과정을 볼 수 있다. 이 경우 해당 패킷은 pbuf pool로부터 만들어졌기 때문에 반드시 free되어야 하며 오류 발생 시 상위 레이어에서 처리되지 않기 때문에 pbuf_free를 통하여 동적메모리 할당을 해제하는 내용을 볼 수 있다.


인터럽트 모드의 실 구현은 Ethernet_IRQ 핸들러에서 세마포어를 호출하여 이더넷 프레임이 수신었다는 사실을 알린다. 이 세마포어를 기다리고 있는 스레드는 일전의 ethernetif_input의 역할을 수행하며 빨리 실행되어야 하기 때문에 인터럽트 다음의 우선순위(realtime priority)를 가진다. 나머지 동작은 폴링과 비슷하게 수행된다.

추가로 FreeRTOS를 이용한 LwIP 서비스가 Non-OS와 다른 점이 있다면, FreeRTOS의 경우 TCP/IP 및 링크 상태, DHCP상태를 별도의 태스크로 띄워 관리 할 수 있다는 점이다. LwIP의 경우 API로 raw, netconn, socket인터페이스를 가지고 있지만, netconn 인터페이스부터는 RTOS를 사용하는 것이 사용에 편리하다고 한다.

반응형
Comments