2012-04-10 5 views
2

내가 임베디드 장치 와 FreeRTOS LwIP를 사용 C 프로그램을 작성하고, 마이크로 컨트롤러는 아트멜 AVR32이다. 수신 한 UDP 패킷이 LwIP 스택에 대기 중입니까?

LwIP 에서 UDP를 설정 한 후 나는 콜백 함수를 한 번 호출 될 것이다 UDP 데이터 그램이 수신 될 것을 알고, udp_recv()에 의해 콜백 함수를받을 수 있습니다. 그럼 콜백 함수 안에 process_udp_packet() 같은 것을 할 수 있습니다. 그러나 콜백 기능이 완료되기 전에 다른 UDP 패킷이 수신되면이 두 번째 패킷이 버퍼에 대기 할 것인가? 또는 콜백 함수가 즉시 다시 호출됩니다. 심지어 첫 번째 콜백 함수가 완료되지 않았습니까?

대단히 감사합니다.

답변

4

콜백은 LwIP 자체의 컨텍스트에서 호출됩니다. 따라서 콜백을 종료 할 때까지 LwIP가 차단됩니다. 새로운 패킷을 전혀 처리하지 않습니다. 새 데이터가 도착할 경우 인터페이스 드라이버는 LwIP가 차단 해제 될 때까지 인터페이스 (모뎀 등)에서 해당 데이터를 읽거나 자체 버퍼에 저장하지 않아야합니다.

따라서 일반 LwIP 워크 플로를 방해하지 않도록 가능한 한 빨리 콜백을 종료해야합니다. 이러한 콜백 함수를 프로그래밍 할 때 가장 좋은 방법은 새 패킷을 앱 대기열로 읽어 들이고 즉시 콜백에서 돌아 오는 것입니다. 그런 다음 자체 컨텍스트의 앱은 새로운 데이터를 처리 할 수 ​​있습니다.

그러나 데이터 처리가 정말 빠르면 콜백 기능으로 처리 할 수 ​​있습니다.

+0

고맙습니다. 사실 콜백 입력 매개 변수가 나에게 적합하지 않기 때문에 콜백 내부에서 너무 많은 일을하는 것이 적합하지 않다는 것도 알게됩니다. 이제 패킷을 저장할 버퍼를 할당했습니다. 실제 패킷이 pbuf 구조의 링크에 저장 될 수 있고 pbuf의 헤더가 실제 데이터가 아님을 알고 있기 때문입니다. 그러나 그렇게함으로써 패킷이 수신되었는지 여부를 확인하기 위해 폴링해야합니다. 맞습니까? 실제로 RTP 지원으로 VoIP 프로젝트를하고 있기 때문에 이것이 좋지 않을까 걱정하므로 실시간이 중요합니다. 조언 해 줄 수 있니? – eepty

+0

또한 struct pbuf의 ** len ** 필드가 페이로드의 길이 또는 전체 pbuf의 길이를 나타내는 지 여부를 묻고 싶습니다. 코드의 주석은 전자를 언급했다. 그러나 ** pbuf_header() ** 함수를 점검하면 * len *은 전체 pbuf의 길이를 나타냅니다 ..... @werewindle – eepty

+0

@eepty를 고맙습니다. 실시간 VoIP 프로젝트를 만들면 일부 RT 작업자 (예 : Keil RTOS 또는 FreeRTOS)를 사용하도록 권장합니다. 이렇게하면 실시간 환경에서 많은 스레드를 가질 수 있습니다. 귀하의 경우, 새 패킷을 기다리는 스레드는 폴링하지 않습니다. 세마포어로 차단됩니다. 새로운 패킷이 도착하면 콜백은 그것을 버퍼에 저장하고 세마포어에 신호를 보냅니다. (새 패킷이 없을 때) 장치는 사용자와 상호 작용하는 것처럼 다른 우선 순위가 낮은 스레드를 실행할 수 있습니다. – werewindle

관련 문제