реклама на сайте
подробности

 
 
> Многопоточность на attiny2313
aivs
сообщение Apr 6 2013, 21:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 114
Регистрация: 3-10-09
Пользователь №: 52 731



Продолжаю изучать программирование под avr.
Написал программу "Часы", добавил три кнопки для выставления времени, кнопки обрабатываются по прерыванию от Таймера каждые 0.1 сек, время тикает от того же таймера, все красиво и четко работает.
Затем я задействовал термодатчик ds18b20 с шиной 1ware и написал программу для показа температуры на дисплее hd44780, датчик опрашивается по прерыванию от таймера каждые 0.1 сек, прекрасно работает.
А затем я решил совместить эти две программы, чтобы часы в одной части дисплея работали, а температура в другой части. Получилось кривенько, при опросе датчика прерывания запрещены, соответственно на нажатия кнопок реакция заторможенная.
Подскажите, как бы реализовать подобие многопоточности?
Может тут подойдут конечные автоматы?
Приветствую список литературы по этому вопросу!
А может для attiny2313 вообще это не возможно сделать без тормозов?

Сообщение отредактировал aivs - Apr 6 2013, 21:16
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Apr 6 2013, 23:39
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(aivs @ Apr 7 2013, 01:15) *
Получилось кривенько, при опросе датчика прерывания запрещены, соответственно на нажатия кнопок реакция заторможенная.
Подскажите, как бы реализовать подобие многопоточности?
А может для attiny2313 вообще это не возможно сделать без тормозов?


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

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

В крайнем случае, в прерывании допустимо начать процесс, если его старт требует синхроности с событием, вызывашим прерывание. А для последовательной передачи бит существует SPI, который тоже способен вызывать прерывание по завершению чтения/записи байта (8 бит). И даже в голову не должна приходить крамольная мысль, пославши первый байт, дождаться там же в прерывании окончания передачи, чтобы послать следом второй.

Сама я с интерфейсом 1ware дела никогда не имела, но полагаю, что SPI с этой задачей должен справиться. В конце концов, побитно можно выдавать сигнал по таймеру, поднимая и опуская уровень в РАЗНЫЕ (!) такты. Например, часовой таймер вызывает прерывание каждую миллисекунду. Так вот можно сделать так, что через каждую миллисекунду какой-то пин в порте будет изменять свое состояние. И не в коем случае не жмотиться, пытаясь поднять и опустить уровень за один присест с фиксированной задержкой - задержек в прерывании быть не должно, их делают периодом таймера. Однако повторю, что это самый крайний случай, а не рекомендация делать меандр посредством частых прерываний. Наконец, еще есть UART/USI, который может работать в режиме 2-wire, хотя его использвать жалко, т.к. это обычно единственная связь с внешним миром.

Стоит всякий раз обдумывать, насколько неотложно необходима реакция на прерываение. Некоторые совершают ошибку, полагая, что если АЦП выставил сигнал готовности, а прерывание от него сработало, то, мол, надо тут же в прерывании его опрашивать. Ничуть не бывало - АЦП потерпит до следующего такта, а потому пороть горячку не следует - пусть основной цикл опрашивает АЦП, ему все равно больше делать нечего. Но это в том случае, если опрос АЦП требует посылки в него управляющего байта, задержки на его переваривание и приема байтов данных - всего этого в прерывании делать нельзя. Но если АЦП таков, что дает результат в порту или регистре, то взять его прерывании можно и нужно.

То же касается разного рода измерений. Не остынет термопара за доли миллисекунды, а потому, когда придет время эту температуру опрашивать, из прерывания этого делать необходимости никакой нету.

P.S. ответила развернуто только потому, что ATtiny2313 - моя любимая тинька, и я сержусь, когда ее незаслуженно обижают. sm.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 7 2013, 00:31
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Xenia @ Apr 7 2013, 02:39) *
что нельзя долго сидеть в прерывании.

Можно..в разумных пределах. Если вложенные прерывания допустимы.

Цитата(Xenia @ Apr 7 2013, 02:39) *
Сама я с интерфейсом 1ware дела никогда не имела, но полагаю, что SPI с этой задачей должен справиться.

SPI-то справится, но для 1-wire скорость слишком большой может быть(8-16МГц/128 - так быстро не надо)

Цитата(Xenia @ Apr 7 2013, 02:39) *
Например, часовой таймер вызывает прерывание каждую милисекунду. Так вот можно сделать так, что через каждую миллисекунду какой-то пин в порте будет изменять свое состояние.

Не хватает однократного режима таймера - выдать 0 на выход, установить через сколько надо тактов 1 и чтобы однократно. В принципе ШИМ сгодится...

Вход завести на захват по фронту. И где-нибудь разбирать захваченное...

Цитата(Xenia @ Apr 7 2013, 02:39) *
Наконец, еще есть UART/USI, который может работать в режиме 2-wire, хотя его использвать жалко, т.к. это обычно единственная связь с внешним миром.

Стандартное решение, но на мегах UART-ов не напасёшся обычно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- aivs   Многопоточность на attiny2313   Apr 6 2013, 21:15
- - ILYAUL   ЦитатаПолучилось кривенько, при опросе датчика пре...   Apr 6 2013, 21:52
- - aivs   В прерывании я опрашиваю три кнопки, и если кнопка...   Apr 7 2013, 07:38
|- - Xenia   Цитата(aivs @ Apr 7 2013, 11:38) Код // ...   Apr 7 2013, 12:23
||- - _Pasha   Цитата(Xenia @ Apr 7 2013, 15:23) Возможн...   Apr 7 2013, 14:19
||- - Xenia   Цитата(_Pasha @ Apr 7 2013, 18:19) Там в ...   Apr 7 2013, 14:31
||- - _Pasha   Цитата(Xenia @ Apr 7 2013, 17:31) А syste...   Apr 7 2013, 14:35
|- - mempfis_   ЦитатаЗадержки с использованием _delay_us и _delay...   Apr 7 2013, 12:58
- - _Pasha   Могу сказать, как делаю я. 1. Беру за основу идею,...   Apr 7 2013, 09:58
- - mempfis_   Цитата(aivs @ Apr 7 2013, 01:15) Затем я ...   Apr 7 2013, 11:12
|- - _Артём_   Цитата(mempfis_ @ Apr 7 2013, 14:12) Есть...   Apr 7 2013, 19:37
|- - mempfis_   ЦитатаПроблемы скорее нет, чем есть. Разве самому ...   Apr 8 2013, 07:31
|- - _basile   DATASHEET 2313: "The External Interrupts are ...   Apr 8 2013, 07:52
||- - _Pasha   Цитата(_basile @ Apr 8 2013, 10:52) Как т...   Apr 8 2013, 07:57
|||- - _basile   Цитата(_Pasha @ Apr 8 2013, 11:57) Вы не ...   Apr 8 2013, 08:08
|||- - _Pasha   Цитата(_basile @ Apr 8 2013, 11:08) И что...   Apr 8 2013, 08:22
||- - aivs   Цитата(_basile @ Apr 8 2013, 11:52) DATAS...   Apr 8 2013, 16:37
|- - _Артём_   Цитата(mempfis_ @ Apr 8 2013, 10:31) Не в...   Apr 8 2013, 14:36
- - aivs   Спасибо, уберу из прерывания: Код_delay_ms(25...   Apr 8 2013, 13:36
- - ARV   всем начинающим всегда рекомендую мудрить поменьше...   Apr 8 2013, 17:48
- - Xenia   Я тоже сразу заметила, что в этой программе пока д...   Apr 8 2013, 22:36
- - _Pasha   Цитата(Xenia @ Apr 9 2013, 01:36) Поэтому...   Apr 9 2013, 01:23
- - aivs   Цитата(Xenia @ Apr 9 2013, 02:36) Поэтому...   Apr 9 2013, 08:17
- - _Pasha   Цитата(aivs @ Apr 9 2013, 11:17) Нет...   Apr 9 2013, 09:14
- - mempfis_   Цитата(aivs @ Apr 9 2013, 11:17) Нет...   Apr 9 2013, 09:43
- - ARV   Цитата(mempfis_ @ Apr 9 2013, 13:43) Прос...   Apr 9 2013, 10:11
- - mempfis_   Цитата(ARV @ Apr 9 2013, 13:11) P.S. судя...   Apr 9 2013, 14:14


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.0141 секунд с 7
ELECTRONIX ©2004-2016