Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.09.2015, 19:36   #41
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Цитата:
Сообщение от leon_3 Посмотреть сообщение
Таблица переходов у меня реализовано самым опасным способом - goto ...
Подскажешь где можно почитать про "плевки" (т.е. переходы)? В моих знания пробел в месте где, осуществляются переходы: например, программа прошла место где ей сказано по флагам определить куда "плюнуть" и она туда скакнула. Далее в течении работы устройства, сработало прерывание и флаг поменялся, до сего момента все хорошо... Флаг изменился, но как устройство с последовательными шагами может отреагировать на изменение флага в процессе выполнения иных шагов?
Статью читаю не в первый раз, суть примерно ясна, но слишком много не понятных мне команд. Все ли можно использовать в WIRING?
Про "плевки" я писал на предмет "выдать что-то и куда-то", а вовсе не как переходы. Извиняюсь за сленг.

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

Ещё раз извиняюсь за сленг.
Arhat109 вне форума   Ответить с цитированием
Старый 17.09.2015, 12:25   #42
leon_3
Junior Member
 
Регистрация: 26.08.2015
Сообщений: 6
Вес репутации: 0
leon_3 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

А можно по подробнее о прерываниях, не получается разобраться в них.
Конкретно: как запустить отслеживание, как правильно оформить, как остановить отслеживание. Хотя наверное это и все что может касаться аппаратных прерываний!
leon_3 вне форума   Ответить с цитированием
Старый 17.09.2015, 14:29   #43
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Пока очень абстрактно о прерываниях, "прописные истины" для начала:

Проц (любой современный, ранее были и другие) исполняет команды строго последовательно или согласно вашей программе, по условным переходам. Это - норма.

В проце, кроме счетчика текущей команды полно разных данных, регистров и т.д. - все вместе называют "текущим состоянием проца" или контекстом выполнения.

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

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

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

Почему компилятор ТРЕБУЕТ специального указания для процедур-обработчиков прерываний (тут это макрос ISR() )? А как раз для того, чтобы правильно назначить адрес обработчику, добавить сохранение контекста в начало процедуры и его восстановление после И команду возврата из прерывания. То бишь решить все засады.

Что произойдет, если в процессе обработки прерывания появится "ещё один сигнал"? Прерывание из прерывания. Если сохранение контекста идет в фикс. области, то предыдущий будет утерян безвозвратно. Если область динамически назначается, то постепенно растущая вложенность таких вызовов займет всю память и все снова "накроется медным тазом". Это к вопросу почему обработчик прерываний должен работать "быстро". Он должен работать быстрее чем наступает очередное прерывание.

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

Кроме этого, для главной программы, когда прерывания разрешены, есть своя засада: последовательное чтение длинных данных. Если, мы например, читаем long в регистр, то это чтение 4-х байт, 4-я отдельными командами. Если в процессе чтения происходит прерывание, которое изменяет состояние таких данных то что произойдет? А просто: часть данных (одного числа long!) будет отвечать начальному значению "до" прерывания, а вторая чать - "после" ... то есть регистр по завершению чтения будет содержать .. мусор.

Чтобы такого не происходило, данные которые могут изменяться в прерываниях и общие с главной программой указывают компилятору "особым способом" (тут volatile).. и читают их при запрещенных прерываниях специальными функциями. У меня в либе так сделана функция getOvfCount(), читающая состояние счетчика прерываний.

Собственно главный ликбез "что такое прерывания" на этом можно и закончить.

Тут, в Ардуино, есть замечательный хидер interrupt.h, который определяет макрос ISR(), который и формирует заголовок для обработчиков прерываний. Мой макрос ISRtimer() построен над ним и упрощает формирование название (и только!) обработчику для создания процедур обработки прерываний от таймеров:
#define timerIFlag(t,v) _timerIFlag(t,v) // get interrupt flag t:[0,2[,1,3,4,5]] v:[OVF,COMPA,COMPB[,COMPC,CAPT]]
#define ISRtimer(t,v) _ISRtimer(t,v) // make interrupt vector name

В первой строке закомментированы значения параметров для макроса регистра-флага прерывания и они же подходят к макросу, формирующему имя обработчика. Стало быть можно писать типа так:
ISR( ISRtimer(1, CAPT) )
{
тут действия обработчика прерывания по сигналу (Capture) захвата 1-го таймера.
}

В результате после обработки кода препроцессором получится следующее:
ISR( timer_1_CAPT_vector )
{
...
}

И после обработки макроса ISR() получится что-то типа такого (номер - условный, не помню):
void volatile vector_23 (void)
{
...
}

что дает указание компилятору что это не просто процедура без параметров, но ещё и обработчик, который надо "посадить" на 23-й сигнал обработки прерывания и добавить ему все требуемые начала и концы для сохранения контекста.

В главной программе в setup() - если однократно "до" основной работы и/или loop() - если надо периодически в требуемые моменты, где требуется по смыслу, надо разрешить реакцию на прерывания командой sei() - точнее смотреть interrupt.h и ...
по сути фсё.

В Wiring есть спец. методы attachInterrupt() и detachInterrupt(), которые, как понимаю имеют типовой обработчик прерываний, который смотрит в список заявленных вами процедур (attach)и сам из под себя вызывает нужную. ИМХО - это "долго". Детально я их не смотрел, но думаю что решено именно так.

В моей библиотеке такого нет и не будет, ибо задача "сделать максимально быструю либу". Но, разрешить пользовать стандартные - думаю можно.

Надеюсь что помог "на скорую руку".
Arhat109 вне форума   Ответить с цитированием
Старый 17.09.2015, 15:49   #44
leon_3
Junior Member
 
Регистрация: 26.08.2015
Сообщений: 6
Вес репутации: 0
leon_3 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Вот теперь я точно понял что очень мало понимаю что происходит.
Теорию я уже изучил, все примерно понял. В данном случае мне не хватает знаний в прерываниях а точнее ее тонкостях, потому что мне настолько глубоко это и не нужно! Сходу не могу понять что почитать что бы понять до конца!
leon_3 вне форума   Ответить с цитированием
Старый 12.10.2015, 21:13   #45
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Выложена вторая версия библиотеки. Обнаружилось много мелких правок в старых макросах. Особенно в работе с таймерами..

Все ключевые изменения описаны в первом сообщении темы. Все файлы документированы достаточно полно, и практически на всё есть примеры...

*1 Поточная работа с АЦП - ещё не тестировалась;
*2 Замер длительности импульсов пока работает только на одной ноге - №62 (аналог8).
Arhat109 вне форума   Ответить с цитированием
Старый 13.10.2015, 22:25   #46
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

1. Доделано измерение длительностей импульсов прерыванием PCINT2 любой ногой, хоть всеми сразу Замена pulseIn().

2. Добавлена функция tsc_simple() для упрощения управления простыми конечными автоматами - устанавливает команду и тайм аут её исполнения.
Arhat109 вне форума   Ответить с цитированием
Старый 02.12.2015, 11:04   #47
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Обновление Архива библиотеки. Исправил первый пост. Пользуйтесь на здоровье.
Arhat109 вне форума   Ответить с цитированием
Старый 04.12.2015, 16:12   #48
DeGlucker
Junior Member
 
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0
DeGlucker is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Очень понравилась библиотека, но при попытке откомпилировать скетч с функцией
Serial.parseint() потянуло millis(), которой в явном виде нет если переименовать
wiring.c, а, если не переименовывать, то "multiple definition of `__vector_16".
IDE 1.6.5, ATmega328
DeGlucker вне форума   Ответить с цитированием
Старый 05.12.2015, 09:07   #49
Arhat109
Senior Member
 
Регистрация: 14.06.2015
Адрес: СССР
Сообщений: 122
Вес репутации: 0
Arhat109 is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

К сожалению, да. Эта ошибка появляется из-за wiring.c и настроек библиотекаря. Чтобы правильно компилировалось этот файл надо переименовывать в том разделе откуда он берется при компиляции. Если у Вас Линукс - то это, скорее всего /usr/share/Arduino .. или похожий. Вот где он лежит на винде - не подскажу, за неимением таковой.

Можно как вариант компилировать в режиме ARHAT_MODE 1 в этом случае, используется вектор прерываний из wiring.c и конфликта не возникает. Но также не производится переопределение типовых функций digitalRead(), digitalWrite() .. и прочих на макроопределения, но никто не мешает вам пользоваться макроопределениями напрямую, без вызова этих функций.
Arhat109 вне форума   Ответить с цитированием
Старый 07.12.2015, 17:07   #50
DeGlucker
Junior Member
 
Регистрация: 04.12.2015
Сообщений: 14
Вес репутации: 0
DeGlucker is an unknown quantity at this point
По умолчанию Re: Ускоряем и улучшаем скетчи. Ещё одна библиотека.

Еще вопрос по библиотеке.
при компиляции для ATmega 168P вылезает:
D:\arduino16\libraries\Arhat/arhat.h:180:26: error: 'DREGpinLed' was not declared in this scope
#define pinDirReg(p) (DREG##p) // get DDRx direction register macros for pin
^
Откуда берется ##p ?
для 328 ошибок нет.
DeGlucker вне форума   Ответить с цитированием
Ответ

Метки
arduino mega 2560, скетч, ардуино


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 01:57. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика