FreeRTOS не может опрашивать входные контакты при использовании vTaskDelayUntil () - PullRequest
0 голосов
/ 11 ноября 2018

Я столкнулся со странным поведением с кодом FreeRTOS. Особенно при использовании vTaskDelayUntil() и vTaskDelay()

Я пытаюсь прочитать входной контакт с моего ИК-датчика. Что касается области видимости, я вижу, что PIR удерживает 3,3 В в течение не менее 1 секунды.

Код ниже читает мой PIR-вход только когда я закомментирую строку 'vTaskDelayUntil'. Как только я активирую эту строку, регистр PINC всегда равен 0. Также, когда я уверен, что на моем входном контакте есть 3.3В.

static void TaskStatemachine(void *pvParameters) 
{
    (void) pvParameters;
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 100; 

    xLastWakeTime = xTaskGetTickCount();

    for(;;)
    {
        printf("PINC.1 = %d\n", (PINC & (1<<1) ));
        vTaskDelayUntil( &xLastWakeTime, ( xFrequency / portTICK_PERIOD_MS ) );
    }
}

Что здесь происходит? Я изменил xFrequency на разные значения, но безуспешно.

1 Ответ

0 голосов
/ 23 ноября 2018

В качестве эксперимента упростите вывод следующим образом:

putchar( (PINC & (1<<1)) == 0 ? '0' : '1' ) ;

Затем вы получите непрерывный поток 1 или 0.

Если это работает с задержкой или без нее, то вполне вероятно, что задача имеет слишком маленький стек для поддержки printf(). Попробуйте увеличить стек и положить обратно printf().

...