ARM 임베디드 디바이스에서 RTOS를 사용하고 있습니다. 현재 나는 (내가 그 전 (별도의 스레드/작업)이 함수를 호출 할 때 신호가 완전히 잘못 될 수있는과를 기반으로 발견 이것이RTOS에서 vTaskDelay로 핀을 토글
GPIO_Write(PIN_1, LOW);
vTaskDelay(msec_to_ticks(1));
GPIO_Write(PIN_1, HIGH);
vTaskDelay(msec_to_ticks(1));
GPIO_Write(PIN_1, LOW);
vTaskDelay(msec_to_ticks(3));
GPIO_Write(PIN_1, HIGH);
if (option1){
vTaskDelay(msec_to_ticks(3));
GPIO_Write(PIN_1, LOW);
vTaskDelay(msec_to_ticks(1));
} else {
vTaskDelay(msec_to_ticks(1));
GPIO_Write(PIN_1, LOW);
vTaskDelay(msec_to_ticks(3));
}
GPIO_Write(PIN_1, HIGH);
if (option2){
vTaskDelay(msec_to_ticks(3));
GPIO_Write(PIN_1, LOW);
vTaskDelay(msec_to_ticks(1));
} else {
vTaskDelay(msec_to_ticks(1));
GPIO_Write(PIN_1, LOW);
vTaskDelay(msec_to_ticks(3));
}
GPIO_Write(PIN_1, HIGH);
vTaskDelay(msec_to_ticks(3));
GPIO_Write(PIN_1, LOW);
같은 신호를 전환의 필요에 1-2ms 해요 때때로 꺼짐).
taskENTER_CRITICAL() 및 taskEXIT_CRITICAL을 사용하면 다소 정확한 신호를 확보 할 수 있는지 궁금합니다.
내가 가진 한 가지 아이디어는 우선 순위가 높은 인터럽트가 어딘가에 코드를 지연시키고 지연시킬 수 있다는 것입니다 (태스크에 최대 우선 순위를 설정 했음에도 불구하고). 다른 하나는 타이밍이 맞지만 GPIO_Write가 바로 발생하지 않는다는 것입니다.
코드가 중단되지 않도록하려면 어떻게해야합니까?
감사합니다.
첫 번째 전환은 틱 경계와 비동기식이므로 다른 모든 전환은 즉시 지연됩니다. 즉, 지연이 1 틱 지연 (우선 순위가 높은 작업과 허용되는 인터럽트)을 따르는 경우 1 틱 지연을 정확하게 생성 할 수 있습니다. – Clifford