2013-04-17 2 views
1

임베디드 프로그래밍에서는 임계 섹션이라고하는 코드의 원자 섹션을 생성해야합니다. 매크로는 보통 다음과 같이 매크로를 통해 구현됩니다.constexpr을 통한 중요 섹션

#define ENTER_CRITICAL() int saved_status_ = CPU_STATUS_REGISTER; __disable_irq(); 
#define EXIT_CRITICAL() CPU_STATUS_REGISTER = saved_status_ 

인터럽트 상태 입력 (활성화 또는 비활성화)이 저장됩니다. 퇴장시 - 복원됩니다. 문제는 추가 변수가 필요하다는 것입니다.

제 질문은 constexpr 함수를 통해 중요한 섹션을 만들 수 있습니까? (그리고 매크로를 없애기 위해)

+1

매크로를 함수로 구현하여 제거하거나 원치 않는 부작용이있을 수 있습니까? – stijn

+0

그런 다음 공통 변수를 사용하므로 입력 및 종료에 대한 하나의 함수 여야합니다 (물론 정적이어야합니다). 음, 아마도 그게 답입니다. 나는 그것에 대해 생각할 필요가있다. – Amomum

+1

또는 정적 변수를 없애고 로컬 변수를 사용할 수 있습니까? – stijn

답변

6

RAII 솔루션은 기존의 것 :

struct CriticalSection { 
    int saved_status_; 
    void Enter() { 
    saved_status_ = CPU_STATUS_REGISTER; 
    __disable_irq(); 
    } 
    CriticalSection() { Enter(); } 
    void Exit() { 
    CPU_STATUS_REGISTER = saved_status_; 
    } 
    ~CriticalSection() { 
    Exit(); // Can you call this more than once safely? Dunno. 
    } 
}; 

이처럼 사용하십시오 : CPU_STATUS_REGISTER는 런타임 값이기 때문에 어떤 상태 않고 이렇게

void foo() { 
    // unprotected code goes here 
    { 
    CriticalSection _; 
    // protected code goes here 
    } 
    // unprotected code goes here 
} 

이 불가능합니다. C/C++의 상태는 대부분 변수에 저장됩니다.

평범하지 않은 최적화 수준에서 위의 RAII 클래스가 더 이상 EXIT_CRITICAL()을 기억할 필요가 없다는 점을 제외하고는 매크로가 컴파일 된 코드와 완전히 동일한 코드로 컴파일됩니다.

+0

와우, 정말 멋지다! 고맙습니다. 나는 이것에 대해 들어 본 적이 없습니다. – Amomum

+1

@Amomum [RAII] (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)은 C++의보다 유용한 프로그래밍 기능 중 하나입니다. 즐겨! – Yakk

관련 문제