2016-12-19 8 views
1

저는 임베디드 소프트웨어를 사용하고 있습니다. 이 소프트웨어는 두 개의 주요 부분으로 나뉩니다. 첫 번째는 응용 프로그램 소프트웨어이고 두 번째는 일부 시스템 소프트웨어입니다. 시스템 소프트웨어는 드라이버 세트와 RTOS로 구성됩니다. 나는 응용 프로그램 부분을 개발했으며 준비된 드라이버를 사용하고 있습니다. 드라이버 중에는 CAN 통신을위한 드라이버도 있습니다. 기능 중 하나는 기능 I 드라이버 기능을 사용하는 방법을 이해하는 문제가콜백 함수가있는 드라이버

typedef void (*can_receive_callback_t) (can_message_t msg); 

에 다음 인터페이스를 또한 포인터의 정의가 다음되는이 기능과 함께

result_t can_set_receive_callback (can_receive_callback_t cb); 

있습니다. 나는

void my_function (can_message_t m); 

가 나는 또한 위에서 정의 된 함수가 너무 콜백 함수라고 알고 인터페이스를 다음과 같이 몇 가지 기능을 정의 할 필요가 알고있다. 그러나 왜 콜백 함수를 정의해야하는지 모르겠습니다.

함수 포인터를 인수로 전달하지 않고 단순히 드라이버 함수를 호출하는 것은 왜 불가능합니까?

나를 정의한 콜백 함수가 "받은 메시지를 처리하는 방법을 말합니다. 드라이버 개발자에게 알려지지 않은 정보는 무엇입니까?

은 수신 메시지가 준비된 인터럽트 서비스 루틴에 의해 처리되었지만 언급 된 함수 중 어느 것도 ISR처럼 보이지 않는다는 것을 의미합니다.

아무도 좋은 문서를 참조 할 수 있습니까? 이런 유형의 드라이버가 설명되어 있습니까? 고마워.

+0

의 특수성과의 프로토콜을 기반으로 수신 된 데이터를 관리하는 콜백 (등 구조, 타이밍, ...) 설정해야합니다 당신이 정의한 함수를 가리키는 포인터. CAN 메시지를 받자 마자 귀하의 기능이 실행됩니다. 프로그래머가 아니라 드라이버에 의해 호출됩니다. 따라서 "콜백"이라는 용어가 사용됩니다. 이것은 표준화 된 절차는 아니지만 특정 드라이버에 고유 한 것입니다. 사용법을 이해하려면 드라이버에 대한 설명서를 읽어야합니다. 또는 문서가 없으면 코드를 이해하십시오. – Lundin

답변

1

OSI model 말하기 운전자는 물리적 수준에서 의사 소통을 관리해야합니다.

그래서 드라이버는 통신 장치 활성화, 구성, 읽기, 쓰기 등을 수행하여 HW를 관리하여 버스 (CAN)에서 통신합니다.

데이터 링크 계층은 버스에서 보내고받는 데이터의 "프로토콜"을 관리합니다.

드라이버 개발자는 특정 이벤트가 물리 계층에 의해 트리거 될 때 콜백 (callbacks) 될 함수를 설정하기 위해 데이터 링크 계층 개발자를 필요로합니다.

즉, 특정 경우에, 당신은 API를 사용하면 함수를 전달하고 싶어

+0

답장을 보내 주셔서 감사합니다. 나는 다음과 같은 방식으로 메시지를받는 것을 상상한다. 먼저 사서함에 새 메시지가 있습니다. 이 이벤트를 기반으로 적절한 ISR이 호출됩니다.ISR은 드라이버 기능에 의해 주기적으로 테스트되는 플래그를 설정합니다. 드라이버 함수는 플래그의 상태 변경을 감지하자마자 플래그를 재설정하고 메일 함에서 메시지를 검색하고 콜백 함수를 호출합니다. 메시지를 더 처리 한 준비된 코드가 있습니다. 맞아? 감사. – Steve

+0

작동해야하지만 호출 된 함수가 호출자 함수를 차단합니다. 더욱이, 내가 이해할 수있는 한, 당신은 또한 flag set과 reset을 돌봐야한다 : atomic 또는 concurrent access가 관리되어야한다. – LPs

+0

도움 주셔서 감사합니다. LPs. – Steve