Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.85/93: Рейтинг темы: голосов - 93, средняя оценка - 4.85
__bt__
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
1

Задачи и задержки

01.05.2013, 23:16. Просмотров 16727. Ответов 6
Метки нет (Все метки)

Работаю с FriiRTOS и RTX. Возник вопрос. запускаются 2 задачи с одинаковым приоритетом. Обе запускаются одновременно. В одной стоит vTaskDelayUntil(1), а в другой vTaskDelayUntil(5), т.е. перередавать управление на задачи соответственно каждую 1 мс и 5 мс.
Запустятся ли обе задачи на 5 мс?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2013, 23:16
Ответы с готовыми решениями:

AT89C51. Организация задержки
Доброго времени суток. Возникла задача организовать задержку 3 секунды с помощью 16ти разрядного...

FreeRTOS и длительность задержки
Заранее извиняюсь за глупые вопросы:) Суть проблемы: приспичило мне освоить RTOS. Поднимать начал...

Сброс задержки по прерыванию
Приветствую всех! Существует ли способ по внешнему прерыванию проскочить задержку _delay_ms()?...

Частота и задержки _delay_ms
Здравствуйте, извиняюсь заранее нубский вопрос в МК разбираюсь 2 месяца и неделю на практике....

Функция задержки в МК AVR
Речь идёт о программировании микроконтроллеров с помощью C/C++. Очень нужна библиотека,...

6
sohbtixhuk
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 799
01.05.2013, 23:33 2
Первой запустится та задача, которая была создана первой. Ну или которая в списке задач окажется ближе к началу.
0
__bt__
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
01.05.2013, 23:39 3
Цитата Сообщение от sohbtixhuk
Первой запустится та задача, которая была создана первой. Ну или которая в списке задач окажется ближе к началу.
Поставлю вопрос по другому. На пятом кванте (мс) запустятся обе задачи? Для первой задачи с vTaskDelayUntil(1) будет 5й запуск. А для второй с vTaskDelayUntil(5) будет 1й запуск. Верно?
0
sohbtixhuk
0 / 0 / 0
Регистрация: 14.02.2010
Сообщений: 799
02.05.2013, 13:24 4
Верно. Только будет второй запуск второй задачи. Отлично написал, да...
Допустим создаются задачи так - опустим полную инициализацию:
Код
xTaskCreate(Task1ms);
xTaskCreate(Task5ms);
Они будут бегать так:
Код
Task1ms
Task5ms
Task1ms
Task1ms
Task1ms
Task1ms
Task1ms
Task5ms
Так как многозадачности и дохуядерности, как таковой, нет - задачи будут выполнятся по очереди. С точки зрения пользователя на 5 милисекунде сработают обе задачи, с точки зрения ядра - на 5мс сработает первая задача, на 5.1 мс (приблизительно, хз, сколько у тебя там задача первая выполняется) сработает вторая. На 6 мс - первая итд. Если у тебя таск выполняется порядка 10 мс и приоритет одинаковый - вторая задача никогда не прервет первую во время выполнения.
Ну как-то так
0
__bt__
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
02.05.2013, 16:10 5
Цитата Сообщение от sohbtixhuk
...задачи будут выполнятся по очереди. С точки зрения пользователя на 5 милисекунде сработают обе задачи, с точки зрения ядра - на 5мс сработает первая задача, на 5.1 мс (приблизительно, хз, сколько у тебя там задача первая выполняется) сработает вторая. На 6 мс - первая итд. Если у тебя таск выполняется порядка 10 мс и приоритет одинаковый - вторая задача никогда не прервет первую во время выполнения.
Ну как-то так
Спасибо за развёрнутый ответ. За временем выполнения слежу.
0
Kiryhotd
0 / 0 / 0
Регистрация: 10.12.2014
Сообщений: 11
14.12.2014, 03:38 6
Добрый день у меня такой вопросик, в общем у меня плата STM32F4Dyscovery. Запустил FriiRTOS в оболочке IAR 6.5. Запускаю аудио чип CIRRUS CS43L22 который уже установлен на плату Dyscovery. Хочу сформировать меиндр 500Гц. В итоге получил меиндр, но каждые 100ms у меня провал получается как на графике, если в задаче vBlinkTask меняю vTaskDelay(50) скажем на vTaskDelay(100), то провал в выходном сигнале наблюдается каждые 200ms. Самое интересное проверял тактирование I2S: SCLK, SDIN, MCLK,LRCK, RESIT и I2C SCK SDA - все тактируется. И еще самое интересное в этом же проекте, до запуска задач(Task) делаю тупой бесконечный цикл с задержками и в итоге имею чистый меиндр на выходе CS43L22.
Вот не могу понять в чем может быть дело? Подскажите. Прилагаю осциллограмму нижний график это меиндр на аналогом выходе CS43L22, верхний график это пачка которая приходит на SDIN.
И фрагмент кода.
Код
 xTaskCreate(vBlinkTask, "BlinkTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
xTaskCreate(vPlayOudyo, "PlayOudyo", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
xTaskCreate(vTickWave,  "TickWave",  configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
//Запускаем шедулер - диспетчер задач. Он будет следить за приоритетами, переключением задач, ошибками и прочим.
vTaskStartScheduler();
Код
/*****************************************************************************
Задание проиграть аудио через CS32L22
******************************************************************************/
void vPlayOudyo(void *pvParameters)
{
while(1)
{
// Если флаг выставлен, то можно передавать данные
if((SPI3->SR & SPI_I2S_FLAG_TXE)) //(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE))
{
if (state == 0x00)

{
GPIOD->ODR ^= GPIO_Pin_12;
// Если переменная state = 0, то посылаем нули
//SPI_I2S_SendData(SPI3, 0x0000);
SPI3->DR = 0x0000;
}
else
{
// А если переменная state != 0, то посылаем
// максимальное значение, в итоге получаем
// прямоугольные импульсы
//SPI_I2S_SendData(SPI3, 0x7FFF);
SPI3->DR = 0x7FFF;
}
}
}
}
Код
void vBlinkTask (void *pvParameters)
{
while(1)
{
GPIOD->ODR ^= GPIO_Pin_13;
vTaskDelay(50); //Только такие задержки можно использовать в FriiRTOS. Забудьте про обычные долгие пустые циклы!
}
}
void vBlinkTask (void *pvParameters)
{
while(1)
{
GPIOD->ODR ^= GPIO_Pin_13;
vTaskDelay(50);
}
}

void vTickWave (void *pvParameters)
{
while(1)
{
//GPIOD->ODR ^= GPIO_Pin_12;
state ^= 0x01;
vTaskDelay(1); //Только такие задержки можно использовать в FriiRTOS. Забудьте про обычные долгие пустые циклы!
}

}

http://www.cyberforum.ru/savedimages/2014/12/14/kldrcbkx3fhmzjquzvyjc.jpg


http://www.cyberforum.ru/savedimages/2014/12/14/ppzcewayk4yvujytaxp.jpg
0
__bt__
1 / 1 / 0
Регистрация: 09.02.2012
Сообщений: 693
14.12.2014, 04:34 7
Цитата Сообщение от Kiryhotd
Добрый день у меня такой вопросик, в общем у меня плата STM32F4Dyscovery. Запустил FriiRTOS в оболочке IAR 6.5. Запускаю аудио чип CIRRUS CS43L22 который уже установлен на плату Dyscovery. Хочу сформировать меиндр 500Гц. В итоге получил меиндр, но каждые 100ms у меня провал получается как на графике, если в задаче vBlinkTask меняю vTaskDelay(50) скажем на vTaskDelay(100), то провал в выходном сигнале наблюдается каждые 200ms. Самое интересное проверял тактирование I2S: SCLK, SDIN, MCLK,LRCK, RESIT и I2C SCK SDA - все тактируется. И еще самое интересное в этом же проекте, до запуска задач(Task) делаю тупой бесконечный цикл с задержками и в итоге имею чистый меиндр на выходе CS43L22.
Вот не могу понять в чем может быть дело?
1. Совсем не понятно, почему вы меиндр генерируете Аудио ЦАПом.
2. Скорее всего проблема с таймингами. Контроллер не успевает отправить данные в ЦАП. Посмотрите пример ЦАПа работающего на прерываниях http://mykrosontroller.bplosid.net/wordpress/?page_id=2180.
3. Нужно сгенерировать буфер аудиоданных и отправлять в ЦАП, не иначе.
0
14.12.2014, 04:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2014, 04:34

Использование задержки (Atmega8A)
Здравствуйте. Задача: поморгать светодиодами на каждом порту в случайном порядке. Написал код...

Формирование задержки "РЕШЕНО"
Коллеги, очень нужна ваша помощь, понимаю, что многие меня сразу подвергнут анафеме, но сознательно...

Реализация временной задержки i8051
Поставлена задача : реализовать задержку в 50 секунд на микроконтроллере i8051. Я решил делать это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru