【发布时间】:2017-10-20 07:58:35
【问题描述】:
我在 ARM 嵌入式设备上使用 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);
我注意到的是,根据我调用此函数(单独的线程/任务)的位置和时间,信号可能完全错误(有时关闭 1-2 毫秒)。
我想知道使用 taskENTER_CRITICAL() 和 taskEXIT_CRITICAL 是否可以帮助我确保信号准确。
我的一个想法是,具有更高优先级的中断可能会启动并延迟某处的代码(尽管我已在任务上设置了最大优先级)。 另一个是时序正确但 GPIO_Write 没有立即发生。
关于如何确保代码不中断的任何其他想法?
问候,
【问题讨论】: