2014-07-14 6 views
1

FreeRTOS의 메소드가 런타임에 ISR (인터럽트 서비스 요청) 또는 태스크의 컨텍스트에서 호출되는지 여부를 판별 할 수 있습니까? 어쩌면 이미 존재하는 함수가이 함수를 위해 존재할 수도 있고, 어쨌든 스택을 검사하는 메서드를 작성할 수도있을 것입니다.FreeRTOS에서 ISR 메소드 호출 감지

+0

하드웨어 독립적 인 방법으로 생각하지 않습니다. 당신의 플랫폼은 무엇입니까? –

+0

내 플랫폼은 팔 피질 m3입니다. – satur9nine

+0

이것 좀보세요 : http://stackoverflow.com/questions/16656489/safely-detect-if-function-is-called-from-an-isr –

답변

0

두 가지 방법이 있습니다. 나는 Cortex-M7 마이크로 컨트롤러를 사용하고있다. 따라서 Cortex-M3에서이 기능이 100 % 확실하지는 않습니다. 그러나 데이터 시트를 확인하는 것이 좋습니다.

첫 번째 접근 Cortex-M 코어의 CPU 레지스터를 확인하십시오. 일반적으로 일반적인 R0-R12 CPU 레지스터, SP (스택 포인터), LR (링크 레지스터) 및 PC (프로그램 카운터)가 있습니다. PSR, PRIMASK, FAULTMASK, BASEPRI 및 CONTROL과 같은 몇 가지 추가 '특수'CPU 레지스터가 있습니다. 바로 Cortex-M7 코어 용입니다. 이제 PSR 레지스터를 고려하십시오. PSR 레지스터는 "프로그램 상태 레지스터"의 약자입니다. 비트 필드 ISR_NUMBER [8 : 0]이 있습니다. 값이 0이면 CPU는 "스레드 모드"입니다. 스레드 모드는 일반적인 비 인터럽트 모드입니다. 값이 0이 아니면 CPU가 인터럽트를 실행 중입니다. 무슨 방해? ISR_NUMBER [8 : 0]의 값은 인터럽트 번호를 알려줍니다. PSR 레지스터의 값을 읽는 것이 쉬운 일이 아닙니다. 이를 위해서는 특정 어셈블리 명령을 사용해야합니다. C에서 그것을하는 빠른 방법이 없습니다. 당신은 MSR (특별 reg에 일반 이동) 및 MRS (일반 reg에 특별한 이동) 지침이 필요합니다. 물론 인라인 어셈블리를 사용하면 C 코드에 원활하게 삽입 할 수 있습니다 .-)

두 번째 접근법 두 번째 방법이 있습니다. 이전과 달리 CPU 레지스터를 읽을 필요가 없습니다. 대신,이 두 번째 방법은 '일반'레지스터의 값을 읽어야합니다 (마이크로 컨트롤러에 수천 개가있는 것처럼). 내가 말하는 레지스터는 ICSR (Interrupt Control and State) 레지스터입니다. 이 레지스터는 SCB "시스템 제어 블록"에 있습니다. 레지스터에는 VECTACTIVE [8 : 0]라는 비트 필드가 있습니다. 다시,이 비트 필드는 활성 인터럽트 번호를 포함합니다. 값이 0이면 CPU는 스레드 모드에 있으며, 이는 인터럽트가 현재 실행 중이 아님을 의미합니다.

희망이 도움이됩니다.