Перейти к содержанию

Распараллелить Потоки: Как Выполнять Кусок Кода В Обход Delay?


mappy89

Рекомендуемые сообщения

Доброго времени суток!

Возник вопрос про псевдомногопоточность в avr: есть простейшая программа - мигание одноцветным и двухцветным светодиодом одновременно. Одноцветный светодиод должен мигать постоянно, двухцветный меняет цвет в зависимости от того, который по счёту раз нажата кнопка. Когда кнопка нажата в третий раз - начинается мигание двухцветного светодиода циклом while(), соответственно одноцветный диод больше не мигает. В качестве защиты от дребезга используется функция _delay_ms(), во время её выполнения диод тоже соответственно не мигает

Внимание вопрос: как осуществить постоянное выполнение одного куска кода (мигания одноцветного светодиода) при выполнения другого куска кода (нажатия кнопки и управления двухцветным диодом )

Интересует именно возможность многопоточности отдельных кусков кода, а не решение задачи вида "постить два куска кода в один while()" =)

ниже код:

#include <stdlib.h>
#include <util\delay.h>
#include <avr\io.h>

int main(void)
{
DDRA|=1<<0; //двухцветный диод - красный
DDRA|=1<<1; //двухцветный диод - зеленый
DDRA|=0<<2; //кнопка
DDRA|=1<<3; //одноцветный диод
int bool=1; //показывает, который раз нажата кнопка

while (1)

{
PORTA|=1<<3;  //мигаем одноцветным диодом
_delay_ms(500);
PORTA&=~(1<<3);
_delay_ms(500);

if (PINA & (1<<2)) //при нажатии кнопки
{

switch (bool)
{
case 1:
PORTA&=~(1<<0); //зажигаем один цвет двухцветного
PORTA|=1<<1;
break;

case 2:
PORTA&=~(1<<1);  //другой зажигаем
PORTA|=1<<0;
break;
case 3:
while (1)
{
PORTA&=~(1<<0); //мигаем двухцветным
PORTA|=1<<1;
_delay_ms(500);
PORTA&=~(1<<1);
PORTA|=1<<0;
_delay_ms(500);
if (PINA & (1<<2)) {break; bool++;} //если в момент мигания нажали кнопку - выходим из цикла
}
break;

}
if ((++bool)>3) bool=1;
_delay_ms(1000); //задержка - защита от дребезга
}

}


}


Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Подскажите, если я задействую таймер с прерыванием раз в секунду (с увеличением какой либо перемнной на еденицу), то будут ли происходить эти прерывания, если я запущу функцию delay на некоторое время?

Ссылка на комментарий
Поделиться на другие сайты

будут ли происходить эти прерывания, если я запущу функцию delay на некоторое время?

Будут. Если ты сам их не запретишь.

Единственный побочный эффект - задержка станет чуть-чуть больше. Но это "чуть-чуть" ну очень мало ...

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

mappy89 Один диод можно посадить на шим, с другим работать в реальном времени.

Alex использовать для такой задачи RTOS, как PIC32 для мигания одним светодиодом

Изменено пользователем fuckir

В поисках работы..

Looking for job

Ссылка на комментарий
Поделиться на другие сайты

Таймером отсчитывается время выполнения операции-светодиод светится 250 миллисекунд.

До тех пор пока время меньше 250 миллисекунд выполняем задачу 2 - мигаем вторым светодиодом.

Если время равно 250 миллисекунд меняем состояние первого светодиода, сбрасываем значение таймера.

Цикл выполняется сначала.

Вот как-то так.

- А совесть в курсе? - А совесть в доле! :-D

Эксперт — это человек, который совершил все возможные ошибки в некотором узком поле.

Все грамматические ошибки являются авторским стилем изложения материала.

Ссылка на комментарий
Поделиться на другие сайты

Alex использовать для такой задачи RTOS, как PIC32 для мигания одним светодиодом
Заблуждаетесь. Как раз, для решения подобных задач, RTOS к месту. Она освободит человека от создания программных таймеров, их обработки, написания своего планировщика, следящего за флагами таймеров , вызывающего задачи(процедуры) и т.д... . Тем более, задача топикстартера неизвестна. ИМХО, то, что он описал со светодиодами - это только простенький пример, объясняющий суть его вопроса.

А так, пожалуйста, самый простой вариант программных таймеров - http://forum.chipmk.ru/index.php/topic/146-программные-таймеры/

Ссылка на комментарий
Поделиться на другие сайты

Все гораздо проще. Нужно правильно организовать программный цикл, опираясь на прерывание одного таймера и все. Про delay и прочую "нечисть" Си нужно забыть. :)

Ссылка на комментарий
Поделиться на другие сайты

Ещё вопросец, если внутри функции-обработчика прерываний таймера по переполнению повесить слишком много задач (положим, переполнение - раз в мс), то получается, что если за милисекунду контроллер не успеет выполнить все задачи , то их выполнение оборвётся на середине?

Ссылка на комментарий
Поделиться на другие сайты

...если внутри функции-обработчика прерываний таймера по переполнению повесить слишком много задач... контроллер не успеет выполнить все задачи , то их выполнение...

Прервется в том случае если в обработчике снова разрешите прерывания (при входе в прерывание аппаратно сбрасывается флаг "i", а при выходе - устанавливается). В этом случае получится нечто вроде рекурсии, и переполнится стек. Если не разрешать прерывания в обработчике - при окончании выполнения программы обработчика снова войдет в прерывание (выполнив одно инструкцию там где прервалось выполнение основной программы)

В обработчике прерываний должно быть минимум задач!

Ссылка на комментарий
Поделиться на другие сайты

Alex есть такое слово "Оптимально". Так вот в примере автора использование РТОС более чем излишество. Сколько в данном примере будет занимать код на таймере/шиме, а сколько с ОСой?

Кстати на сайте микрочипа об обоснованности использования РТОС в той или иной ситуации написано.

Думаю здесь не тот случай ИМХО

Изменено пользователем fuckir

В поисках работы..

Looking for job

Ссылка на комментарий
Поделиться на другие сайты

В обработчике прерывания от таймера достаточно поднимать флаг (назовем его "тик"). Далее, в основном цикле проверять (для функций выполняемых один раз за определенный период или отрабатывающих задержки) состояние этого флага. Поднят - выполняем зависимые функции, не поднят - пропускаем, выполняя только постоянно циркулирующие. В главном цикле, пройдя блок зависимых от таймера функций, опускаем флаг. Теперь они будут пропускаться до следующего тика таймера.

Ссылка на комментарий
Поделиться на другие сайты

fuckir, я Вас прекрасно понимаю, но Вы меня не поняли. Я не предлагаю решить задачу мигания 2-мя ЛЕДами с помощью RTOS. Подобную задачу можно решить вообще без всяких таймеров и прерываний. Мне показалось, что ТС привёл пример только для того, чтоб мы поняли его вопрос о реализации многозадачности. Рано или поздно, когда задача будет далеко не мигание светиками, ему всё равно придётся либо писать свой планировщик, либо использовать чужое творение. Только по этому я ему и предложил посмотреть в сторону ОСи, т.к. оптимальнее он сам не сделает...

Ссылка на комментарий
Поделиться на другие сайты

Alex согласен.

Если сложности возникают в решении таких задач, то с постижением RTOS придется попотеть. А вообще "дорогу осилит идущий"

Изменено пользователем fuckir

В поисках работы..

Looking for job

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...