2017-05-09 10 views
1

나는 FreeRtos 및 Cortex M에 대한 강의에 참석 이것은 인터럽트 컨텍스트 (인터럽트 처리기)에서 작업 컨텍스트 (스레드 처리기)로 진행될 수 있기 때문에 발생합니다. 제 질문은이 작업 스위치가 불법으로 간주되는 이유와 그러한 스위치의 영향이 무엇이겠습니까?'사용 오류 예외'M

+0

은 특정 소프트웨어와 관련이 있으며 해당 CPU와 관련이 없음을 나타냅니다. –

답변

1

Cortex-M (일부)에서 현재 컨텍스트는 인터럽트 (인터럽트 항목에서) 전에 사용중인 스택에 저장되므로 작업 중에 중단 되었으면 현재 컨텍스트 중 일부가 PSP를 통해 작업 스택에 저장됩니다. 인터럽트 자체는 항상 MSP에서 실행됩니다. 인터럽트가 인터럽트가 중단 된 태스크로 리턴하지 않으면 인터럽트 된 태스크는 전환 된 태스크의 잘못된 컨텍스트를 복원하는 것뿐만 아니라 종료시 저장된 컨텍스트를 복원 할 때 엉망인 스택을 갖게됩니다.

다시 컨텍스트 전환 (인터럽트에서 발생)에서 일부 컨텍스트가 자동으로 작업 스택에 저장되지만 OS는 나머지 컨텍스트도 작업 스택에 저장합니다. 전환을 수행하고 인터럽트를 빠져 나오면 OS는 태스크에 대해 저장된 컨텍스트를 복원 한 다음 인터럽트를 종료하여 나머지 컨텍스트를 자동으로 복원합니다. 이는 스택이 올바른 형식으로 유지되도록 보장하므로 작동합니다. Cortex-M4 일반 사용자 가이드에서 인터럽트 입력/종료를 살펴보십시오.

모든 프로세서가 이와 같이 작동하는 것은 아닙니다.

0

이 답변은 일반적이고하지 FreeRTOS이나 코어 텍스 M 고유의 것입니다 - 그것은 모든 플랫폼에서 어떤 전형적인 RTOS에 적용 : 인터럽트 서비스 루틴에서 호출 할 수 없습니다 실행할 수있는 스케줄러의 원인이

RTOS API 호출. 예를 들어 세마포어를 제공하면 일반적으로 스케줄러가 실행되어 해당 세마포어에서 보류중인 작업으로 전환합니다. 이것은 인터럽트 컨텍스트가 종료 될 때 을 실행해야하는 ISR에서 부적절합니다. 분명히 컨텍스트 스위치 전에 인터럽트가 완료되고 더 높은 우선 순위 인터럽트에 의해 다른 API 호출이나 선점이 발생하여 다른 태스크가 실행 가능하게 될 수 있습니다. 컨텍스트 스위치가 발생할 때 결정을 한 번만 수행하면 결정 론적 동작이 유지됩니다.

ISR 특정 버전의 함수는 즉시 스케줄러를 호출하지 않습니다. 대신 스케줄러가 인터럽트 컨텍스트를 종료 할 때 실행해야 함을 나타내는 플래그를 설정합니다.

일반적으로 RTOS API 호출을 만드는 ISR은 프롤로그에필로그이 있어야합니다; 특정 입력/종료 인터럽트 호출 또는 매크로. 이 프롤로그는 에필로그에서 감소되는 카운터를 증가시킵니다. 카운터가 0이고 일정 플래그가 설정되어 있으면 스케줄러가 실행됩니다. 이 카운터는 중첩 된 인터럽트를 종료 할 때 스케줄러가 실행되는 것을 방지합니다. 이렇게하면 스케쥴러가 가장 낮은 우선 순위의 보류중인 인터럽트를 종료 폼에서 한 번만 실행합니다.

"uasge 결함"이 발생하는지 여부는 FreeRTOS 특정 구현 세부 사항이며 대부분 학술적입니다.RTOS는 ISR에서 비 ISR 안전 호출의 사용을 동일하게 트랩하고 더 구체적인 오류 처리기를 실행할 수 있습니다. 그렇게하지 않으면 문제가 발생하여 사용 오류가 발생할 수 있습니다. 그것은 의존하는 다소 조잡한 메커니즘으로 보입니다. 사용 오류은 매우 광범위한 함정과 여러 가지 이유로 일어날 수 :

사용 오류는 :은 정의되지 않은 명령의 실행,로드/저장 여러에 대한 정렬되지 않은 메모리 액세스를 감지합니다. 활성화하면 0으로 나누기 및 기타 정렬되지 않은 메모리 액세스도 감지됩니다. 일부 RTOS는 ISR 특정 기능이없는

대신 API는 그 원인 일정이 내부적으로 ISR 컨텍스트를 감지하고 그 맥락에서 다르게 동작 호출 -이 프로그래머를위한 간단하고 안전하지만, 테스트하는 작은 오버 헤드를 운반 그러한 모든 호출의 컨텍스트 내부적으로 ISR 안전을 처리하는 API는 또한 자체적으로 ISR 관련 기능을 수행 할 필요가 없기 때문에 자체적으로 OS API 호출을 수행 할 수있는 호출 함수가 더 간단하다는 것을 의미합니다.