J'utilise une distribution RTOS sur un périphérique embarqué ARM. Actuellement, je suis dans le besoin d'un signal comme basculer cetteCommutation des broches avec vTaskDelay dans RTOS
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);
Ce que je remarque est que, compte tenu de l'endroit où et quand j'appelle cette fonction (thread séparé/tâche), le signal peut être complètement faux (1-2ms parfois).
Je me demande si l'utilisation de taskENTER_CRITICAL() et taskEXIT_CRITICAL peut m'aider à assurer un signal assez précis. Une idée que j'ai est que les interruptions avec une priorité plus élevée peuvent démarrer et retarder le code quelque part (bien que j'ai défini la priorité max sur la tâche). L'autre est que les timings sont corrects mais GPIO_Write ne se produit pas immédiatement.
Une autre idée sur comment puis-je m'assurer que le code n'est pas interrompu?
Cordialement,
Seule la première transition sera asynchrone à la limite de graduation car toutes les autres suivent immédiatement un délai. C'est-à-dire que vous pouvez générer avec précision un retard de 1 tick si le délai suit un délai d'une coche (tâches prioritaires et interruptions plus élevées). – Clifford