2
내가 임베디드 장치 와 FreeRTOS LwIP를 사용 C 프로그램을 작성하고, 마이크로 컨트롤러는 아트멜 AVR32이다. 수신 한 UDP 패킷이 LwIP 스택에 대기 중입니까?
LwIP 에서 UDP를 설정 한 후 나는 콜백 함수를 한 번 호출 될 것이다 UDP 데이터 그램이 수신 될 것을 알고,udp_recv()
에 의해 콜백 함수를받을 수 있습니다. 그럼 콜백 함수 안에 process_udp_packet()
같은 것을 할 수 있습니다. 그러나 콜백 기능이 완료되기 전에 다른 UDP 패킷이 수신되면이 두 번째 패킷이 버퍼에 대기 할 것인가? 또는 콜백 함수가 즉시 다시 호출됩니다. 심지어 첫 번째 콜백 함수가 완료되지 않았습니까? 대단히 감사합니다.
고맙습니다. 사실 콜백 입력 매개 변수가 나에게 적합하지 않기 때문에 콜백 내부에서 너무 많은 일을하는 것이 적합하지 않다는 것도 알게됩니다. 이제 패킷을 저장할 버퍼를 할당했습니다. 실제 패킷이 pbuf 구조의 링크에 저장 될 수 있고 pbuf의 헤더가 실제 데이터가 아님을 알고 있기 때문입니다. 그러나 그렇게함으로써 패킷이 수신되었는지 여부를 확인하기 위해 폴링해야합니다. 맞습니까? 실제로 RTP 지원으로 VoIP 프로젝트를하고 있기 때문에 이것이 좋지 않을까 걱정하므로 실시간이 중요합니다. 조언 해 줄 수 있니? – eepty
또한 struct pbuf의 ** len ** 필드가 페이로드의 길이 또는 전체 pbuf의 길이를 나타내는 지 여부를 묻고 싶습니다. 코드의 주석은 전자를 언급했다. 그러나 ** pbuf_header() ** 함수를 점검하면 * len *은 전체 pbuf의 길이를 나타냅니다 ..... @werewindle – eepty
@eepty를 고맙습니다. 실시간 VoIP 프로젝트를 만들면 일부 RT 작업자 (예 : Keil RTOS 또는 FreeRTOS)를 사용하도록 권장합니다. 이렇게하면 실시간 환경에서 많은 스레드를 가질 수 있습니다. 귀하의 경우, 새 패킷을 기다리는 스레드는 폴링하지 않습니다. 세마포어로 차단됩니다. 새로운 패킷이 도착하면 콜백은 그것을 버퍼에 저장하고 세마포어에 신호를 보냅니다. (새 패킷이 없을 때) 장치는 사용자와 상호 작용하는 것처럼 다른 우선 순위가 낮은 스레드를 실행할 수 있습니다. – werewindle