:우선 순위가 높은 ISR에서 FreeRtos 작업을 시작하는 방법은 무엇입니까? 사용
- Stm32F10x, F2xx, F4xx
- FreeRtos 8.1.1
- GCC-팔 - 없음 - - EABI 4_8-2014q2
나는 실행되어야하는 ISR을 가지고 높은 인터럽트 우선 순위이므로이 ISR 내에서 FreeRtos Api를 호출하는 것이 금지됩니다 (here 및 here 참조).
경우에 따라 이러한 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주기 낭비).
더 나은 방법으로, 특히 지연 시간을 줄이면 어떤 문제를 해결할 수 있을까요?
내부 인터럽트를 트리거하는 방법에 대한 아이디어 나 링크는 무엇입니까? – Joe
좋아요, st-lib 안에'EXTI_GenerateSWInterrupt()'가 있습니다. 불행하게도 EXTI 라인과 irq 채널을 낭비해야합니다. 그러나 나는 그것을 시험해 볼 것이다. – Joe
[Here] (https://sourceforge.net/p/freertos/discussion/382005/thread/140cde98/#694c)는 EXTI를 사용하지 않고 다른 접근법이지만 FreeRtos 추적 매크로를 사용하기 때문에 약간의 차이가 있습니다 내 프로젝트에 대한 해키. 이제 FreeRtos 세마포어와 함께 EXTI 기반 솔루션을 적용했습니다. – Joe