Моя реализация FreeRTOS не выполняет свои задачи - PullRequest
0 голосов
/ 01 ноября 2018

Мой проект имеет микроконтроллер Atmega328p (такой же, как Arduino Uno) Поэтому я реализовал портированный на Arduino Uno проект FreeRTOS v10.

Некоторые характеристики: - F_CPU = 1 МГц - работает по таймеру 0 - выгрузочный режим - Время нарезки = на

Мои две простые задачи ведут себя странно. Задача 1 - светодиодный переключатель, Задача 2 - трехтональная лестница

Моей первоначальной реализацией аварийной сигнализации была функция alarm_on(), которая имела три тона, произведенных с функциями _delay_ms() между ними. Но это не сработало, как ожидалось, поэтому я попытался использовать функции vTaskDelayUntil().

Я сделал видео о поведении, используя приведенный ниже фрагмент кода. https://www.youtube.com/watch?v=XnYaELsW1d0

Итак, мигание светодиодов работает, но это очень простая и короткая задача. Задание «Звук» воспроизводит только 2 тона, а иногда и только один.

Мой график задач:

xTaskCreate( TaskBlinkLED,  
             (const portCHAR *)"LED", 
             256, 
             NULL, 
             1,  
             NULL );

xTaskCreate( TaskSoundAlarm,  
             (const portCHAR *)"SOUND", 
             512, 
             NULL, 
             4,  
             NULL );

vTaskStartScheduler();

Фактический код задачи

static void TaskBlinkLED(void *pvParameters) // Main Green LED Flash
{
    (void) pvParameters;
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 800;
    /* The xLastWakeTime variable needs to be initialized with the current tick
    count.  Note that this is the only time we access this variable.  From this
    point on xLastWakeTime is managed automatically by the vTaskDelayUntil()
    API function. */
    xLastWakeTime = xTaskGetTickCount();

    for(;;)
    {
        led_toggle();
        vTaskDelayUntil( &xLastWakeTime, ( xFrequency / portTICK_PERIOD_MS ) );
    }
}

static void TaskSoundAlarm(void *pvParameters) 
{
    (void) pvParameters;
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 3000;
    xLastWakeTime = xTaskGetTickCount();

    for(;;)
    {
        alarm_on(300);
        vTaskDelayUntil( &xLastWakeTime, ( 200 / portTICK_PERIOD_MS )  );
        alarm_on(400);
        vTaskDelayUntil( &xLastWakeTime, ( 200 / portTICK_PERIOD_MS )  );
        alarm_on(500);
        vTaskDelayUntil( &xLastWakeTime, ( 200 / portTICK_PERIOD_MS )  );
        alarm_off();

        vTaskDelayUntil( &xLastWakeTime, ( xFrequency / portTICK_PERIOD_MS ) );
    }
}

Функция My Alarm

void alarm_on(unsigned long hz)
{
    ALARM_PORT_DDR |= (1<<ALARM_PIN);
    t1_set_ctc_a(hz, timer_freq);
}

Почему он не заканчивает полное звуковое задание здесь, производя 3 тона?

...