Мой проект имеет микроконтроллер 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 тона?