使用vTaskDelayUntil()时,FreeRTOS无法轮询输入引脚

时间:2018-11-11 13:40:35

标签: polling freertos rtos

我面临着FreeRTOS代码的怪异行为。 特别是在使用vTaskDelayUntil()vTaskDelay()

我正在尝试从PIR传感器读取输入引脚。 在示波器上,我看到PIR保持3.3v高电平至少1秒钟。

当我注释掉'vTaskDelayUntil'行时,下面的代码仅读取我的PIR输入。一旦激活该行,PINC寄存器就始终为0。 同样,当我确定输入引脚上有3.3v电压时。

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 :(得分:0)

作为实验,请简化输出:

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

然后您将获得1或0的连续流。

如果无论延迟有无延迟,那么任务似乎堆栈太小而无法支持printf()。尝试增加堆栈并放回printf()