2014-10-08 5 views
3

:우선 순위가 높은 ISR에서 FreeRtos 작업을 시작하는 방법은 무엇입니까? 사용

  • Stm32F10x, F2xx, F4xx
  • FreeRtos 8.1.1
  • GCC-팔 - 없음 - - EABI 4_8-2014q2

나는 실행되어야하는 ISR을 가지고 높은 인터럽트 우선 순위이므로이 ISR 내에서 FreeRtos Api를 호출하는 것이 금지됩니다 (herehere 참조).

경우에 따라 이러한 ISR은 절전 모드 인 FreeRtos 작업이 적어도 대기 시간이 길면 깨어나야하는 조건을 감지합니다.

일반적으로 (ISR이 우선 순위가 낮기 때문에 FreeRtos API를 호출하도록 허용 된 경우)이를 해결하기 위해 큐 또는 세마포를 사용합니다.

그러나 우선 순위가 높은 ISR로 어떻게 실현할 수 있습니까?

volatile int flag = 0; 

void XYZ_IRQHandler() { 
    if (someCondition) 
     flag = 1 
} 

void FreeRtosTaskFunction(void* parameters) { 
    for (;;) { 
     if (flag == 1) 
      doSomething(); 
     vTaskDelay(1); // sleep 10ms (tick frequency is 100Hz) 
    } 
} 

그러나이 방법은 단점이 있습니다 :

나의 현재 interims 접근 방식은 (간략 설명)과 같이되는입니다 (작업 웨이크 때까지 ISR에서 플래그를 설정에서)

  • 대기 시간 최대 1 개의 FreeRtos tick.
  • 플래그를 폴링해야합니다 (CPU주기 낭비).

더 나은 방법으로, 특히 지연 시간을 줄이면 어떤 문제를 해결할 수 있을까요?

답변

2

테스트를 거치지는 않았지만 아이디어가 있습니다. 작동해야하는 것처럼 보입니다.

ISR은 다른 인터럽트의 영향을받지 않는 (즉, 정확한 시간에 측정을 수행하는) 매우 낮은 대기 시간을 필요로하기 때문에 우선 순위가 높다고 가정하고 있지만 작업은 빨리 완료해야하지만 isn 꽤 중요하다 (즉, 값을 전송하거나 표시).

우선 순위가 높은 ISR에서 타이밍이 중요한 기능을 수행 한 다음 우선 순위가 낮은 내부 인터럽트를 트리거합니다.

우선 순위가 높은 ISR이 완료되면 (다른 보류중인 경우도 마찬가지 임) 우선 순위가 낮은 ISR이 호출됩니다. 그러면 FreeRTOS API를 호출하고 추가 지연없이 작업을 시작할 수 있습니다.

+0

내부 인터럽트를 트리거하는 방법에 대한 아이디어 나 링크는 무엇입니까? – Joe

+0

좋아요, st-lib 안에'EXTI_GenerateSWInterrupt()'가 있습니다. 불행하게도 EXTI 라인과 irq 채널을 낭비해야합니다. 그러나 나는 그것을 시험해 볼 것이다. – Joe

+0

[Here] (https://sourceforge.net/p/freertos/discussion/382005/thread/140cde98/#694c)는 EXTI를 사용하지 않고 다른 접근법이지만 FreeRtos 추적 매크로를 사용하기 때문에 약간의 차이가 있습니다 내 프로젝트에 대한 해키. 이제 FreeRtos 세마포어와 함께 EXTI 기반 솔루션을 적용했습니다. – Joe

1

해결책은 FreeRTOS Task notification을 사용하는 것입니다.

작업이 보류 상태가되고 ISR 이벤트가 발생하면 즉시 다시 시작하거나 깨우십시오.

+0

FreeRtos Task Notification (FreeRtos 8.2에서 도입)은 세마포어 대신 사용할 수있는 훌륭한 방법입니다.그러나 인터럽트 우선 순위가 높은 ISR에서 해당 API를 호출 할 수도 없습니다. – Joe