FreeRTOS 시리즈 5: 작업 일시 중단 및 재개를 위한 API 기능(이론)

 FreeRTOS 실시간 커널 사용 가이드에서

 

정지 상태에서 준비 상태로 작업을 복원하려면 vTaskSuspend() 함수를 통해 정지 상태로 설정된 작업만 vTaskRexume()으로 재개할 수 있습니다!

freertos에서 제공하는 시스템 기능을 호출하는 사용자 인터럽트 기능이 있는 경우 반드시 FromISR로 freertos에서 제공하는 시스템 기능을 사용해야 하며 이 사용자 인터럽트의 우선순위는 configKERNEL_INTERRUPT_PRIORITY와 configMAX_SYSCALL_INTERRUPT_PRIORITY의 우선순위 사이에 있어야 합니다.일반적으로 configKERNEL_INTERRUPT_PRIORITY가 설정됩니다. 마이크로컨트롤러의 가장 낮은 값으로 우선순위, configMAX_SYSCALL_INTERRUPT_PRIORITY는 FreeRTOS 시스템이 보호할 수 있는 가장 높은 우선 순위 입니다 . FreeRTOS 시스템 제어 아래에 언급된 바와 같이 핵심 부분의 무결성과 일관성을 보장하기 위해 일반적으로 다음과 같은 조치를 취합니다: 인터럽트 끄기, 중요한 부분에 들어가기 전에 인터럽트를 비활성화하여 우선 순위가 높은 인터럽트 발생을 방지할 수 있습니다. 따라서 인터럽트의 우선 순위가 너무 높을 수 없습니다.) configMAX_SYSCALL_INTERRUPT_PRIORITY보다 우선 순위가 높은 인터럽트가 발생하고 시스템 API를 호출하여 우선 순위가 낮은 인터럽트의 연결 목록을 깨고 커널 데이터 손상을 일으킬 수 있습니다.

공식 웹사이트 설명: RTOS for ARM Cortex-M(freertos.org)

RTOS 사용 시 종속성

"FromISR"로 끝나는 FreeRTOS 함수는 인터럽트 안전하지만 이를 호출하는 인터럽트의 논리적 우선 순위가 configMAX_SYSCALL_INTERRUPT_PRIORITY(configMAX_SYSCALL_INTERRUPT_PRIORITY는 FreeRTOSConfig.h 헤더 파일에 정의됨)에 정의된 것보다 높지 않은 경우에만 가능 합니다 .  따라서 RTOS API 기능을 사용하는 모든 ISR은 configMAX_SYSCALL_INTERRUPT_PRIORITY에서 설정한 값 보다 크 거나 같은 숫자 우선 순위로 수동으로 설정해야 합니다 . 이렇게 하면 인터럽트의 논리적 우선 순위가 configMAX_SYSCALL_INTRUPT_PRIORITY 설정 이하가 됩니다.

Cortex-M 인터럽트의 기본 숫자 우선 순위는 0입니다. 0이 가장 높은 우선 순위입니다. 따라서 인터럽트 안전 RTOS API를 사용하여 인터럽트의 우선 순위를 기본값으로 두지 마십시오 .

선점형 커널에서 우선 순위가 높은 인터럽트는 중요 섹션 실행 중에 우선 순위가 낮은 인터럽트를 중단할 수 있습니다. 이것은 선점형 커널의 기능으로, 우선 순위가 높은 작업이나 인터럽트가 현재 실행 중인 작업을 중단할 수 있도록 합니다.

실시간 운영 체제에서 중요한 부분의 무결성과 일관성을 보장하기 위해 일반적으로 다음 조치가 취해집니다.

  1. 인터럽트 비활성화: 크리티컬 섹션에 진입하기 전에 인터럽트를 비활성화하여 우선 순위가 더 높은 인터럽트가 발생하지 않도록 할 수 있습니다. 이렇게 하면 중요한 섹션의 실행이 중단되지 않습니다 . 따라서 이 인터럽트가 FreeRTOS의 제어 범위 내에 있지 않으면 운영 체제가 이를 제어할 방법이 없습니다.

  2. 그러나 인터럽트를 비활성화하면 클록 틱 지연, 응답성 감소 등과 같은 다른 문제가 발생할 수 있으므로 이 접근 방식은 주의해서 사용해야 합니다.

  3. 크리티컬 섹션 보호: 크리티컬 섹션의 선점 금지 또는 뮤텍스 잠금과 같은 크리티컬 섹션 보호 메커니즘을 사용하고 크리티컬 섹션의 시작과 끝에 크리티컬 섹션 보호를 추가합니다. 이렇게 하면 한 번에 하나의 태스크 또는 인터럽트만 크리티컬 섹션에 들어갈 수 있습니다. 이 방법은 공유 리소스에 대한 동시 액세스 문제를 어느 정도 피할 수 있습니다.

  4. 상태 플래그: 예를 들어 원자 연산 또는 플래그 비트를 사용하여 중요한 섹션의 시작과 끝에 상태 플래그를 설정합니다. 다른 인터럽트나 작업은 임계 영역 관련 작업을 수행할 수 있는지 여부를 결정하기 위해 상태 플래그를 확인할 수 있습니다.

참고:

여기에서 인터럽트 우선순위가 운영 체제의 관할권 내에 있어야 하는 이유를 알 수 있습니다.

 FreeRTOS - 인터럽트 사용 시 주의 사항 - Running Light - Blog Garden(cnblogs.com)

Guess you like

Origin blog.csdn.net/qq_51519091/article/details/131491909