Brise
STM32 LwIP 구조 - 3 본문
<< 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를 사용하는 것이 사용에 편리하다고 한다.
'MCU' 카테고리의 다른 글
ST-LINK V3 절연 보드 설치 방법 (0) | 2021.04.22 |
---|---|
STM32 Ethernet(MAC) 구조 (0) | 2020.10.20 |
STM32 LwIP 구조 - 2 (0) | 2020.10.18 |
STM32 LwIP 구조 - 1 (0) | 2020.10.18 |
STM32F7(Cortex-M7) 캐시 Invalidate (0) | 2020.10.17 |
원리부터 실무까지 쉽고 명확한 Arm 프로그래밍(Cortex-A9 중심으로) (0) | 2020.08.21 |
STM32F4 온도 센서 코드 (0) | 2020.03.15 |