마이크로 컨트롤러 용 RTOS 용 Message Queue


10

현재 마이크로 컨트롤러 용 RTOS를 작성하고 있습니다. 모든 것이 C ++ 11로 작성되었습니다-누군가 관심이 있고 저장소에 대한 링크가 맨 아래에 있습니다.

현재 스레드 간 (또는 인터럽트 처리기와 스레드 또는 인터럽트 처리기와 다른 인터럽트 처리기 사이에) 객체를 전달하기위한 간단한 데이터 큐 인 클래스를 작성하고 있습니다. 보통 나는 다른 프로젝트에서 발견 된 일부 공통 API를 따라하려고, 아직 나는이 동시 큐의 예를 찾을 수 없습니다 emplace()기능 지원 시간 제한을.

내 일반적인 "문제"는이 두 인터페이스 사이에서 결정할 수 없다는 것입니다.

( std::chrono::duration<Rep, Period>템플릿 형식이므로 명확성을 위해 템플릿 상용구를 생략합니다)

첫 번째 버전 :

template<typename T>
class FifoQueue
{
public:
    ...
    template<typename... Args>
    int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
    int tryPopFor(T&, std::chrono::duration<Rep, Period>);
    int tryPushFor(const T&, std::chrono::duration<Rep, Period>);
    int tryPushFor(T&&, std::chrono::duration<Rep, Period>);
    ...
}

두 번째 버전 :

template<typename T>
class FifoQueue
{
public:
    ...
    template<typename... Args>
    int tryEmplaceFor(std::chrono::duration<Rep, Period>, Args&&... args);
    int tryPopFor(std::chrono::duration<Rep, Period>, T&);
    int tryPushFor(std::chrono::duration<Rep, Period>, const T&);
    int tryPushFor(std::chrono::duration<Rep, Period>, T&&);
    ...
}

( ...Until접미사 와 함께 두 번째 기능 세트가 있습니다 -기간 대신 시간대를 사용합니다)

첫 번째 버전은 마지막 매개 변수로 시간 종료를 갖는 "공통 스타일"을 따릅니다 (예 : POSIX 메시지 큐, std::condition_variable마이크로 컨트롤러 용 RTOS의 단순 큐). 문제는 가변 시간 템플릿의 경우 "알려진"인수가 첫 번째 (*) 여야하므로 tryEmplaceFor () 함수의 마지막 인수로이 시간 초과 인수를 사용할 수 없다는 것입니다. 따라서 두 번째 버전은 "일관 적"입니다. timeout이있는 모든 함수는 첫 번째 인수로 timeout을 갖습니다. 이 변형은 아마도 타임 아웃을 이러한 기능의 첫 번째 인수로 사용하는 첫 번째 예가 될 수 있다는 명백한 문제가 있습니다.

어떤 인터페이스가 OS를 더 잘 제공 할 것인가 :

  • 마지막 인자로 초과를 갖는 설정된 표준 (의 제외 tryEmplaceFor()하고 tryEmplaceUntil()-이 첫번째 인수이어야 여기서 (*))?
  • 일관성-타임 아웃을 첫 번째 인수로 선호하십니까?

(*)-기술적으로 tryEmplaceFor()tryEmplaceUntil()에 대한 마지막 인수로 시간 초과를 가질 수 있다는 것을 알고 있지만 간단한 시나리오에 이러한 템플릿 마법을 사용하지 않는 것이 좋습니다. 마지막 인수를 얻기 위해 이러한 모든 재귀 인스턴스화를 수행하는 것은 약간 과도하게 보입니다. 특히 사용자가 잘못했을 때 컴파일러가 생성하는 오류를 시각화하면



첫 번째 버전과 두 번째 버전의 차이점은 무엇입니까? 강조 표시하십시오.
JBR 윌킨슨

1
관찰 : POSIX가 시간의 배치에 의해 방해 될만큼 충분히 잘 아는 것은 아니지만, 인터페이스를 사용하는 모든 사람들이 일관성이없는 API에 의해 좌절 될 것입니다. 2 번 투표합니다.
J Trana

답변:


0

(불행히도) 삭제 된 답변과 의견에서 제안한 것처럼 모든 일관성을 유지하기 위해 "일관성"라인 (두 번째 변형)을 따라갔습니다. 시점)이 첫 번째 인수입니다.

이것은 현재 단계의 코드입니다- 링크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.