Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
Герои Войны - микс стратегии и РПГ. Собери лучшую армию и победи всех врагов. В игре 7 различных режимов - как для любителей PvE, так и PvP.

Герои Войны

Стратегии, Мидкорные, Экшены

Играть

Топ прошлой недели

  • Rahlkan Rahlkan 1 пост
  • Tannhauser9 Tannhauser9 4 поста
  • alex.carrier alex.carrier 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
XanderEVG
XanderEVG
6 лет назад
Arduino & Pi

Таймерная служба и диспетчер для ардуино от DiHalt⁠⁠

Пост по мотивам  дверного звонка.

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


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


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

SetTask(BlinkON); 

Функция добавления выполняется не долго (конкретно сколько - хз, можно посчитать, это вам в качестве домашки). Понятно что моргнуть светодиодом можно и в самом прерывании, это быстрее. Но к примеру:

SetTask(SendToSerial_длинный_текст); 

уже выгода ощущается заметно.


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

Например в прерывании мы спалили что нажата кнопка:

if(кнопка нажата){

отключаем прерывание у этой кнопки;

SetTask(btnPress); 

}


В btnPres() мы выполняем нужные действия и добавляем SetTimerTask(btnRelease, 100);

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


Теперь кусок псевдокода моего проекта, задача:

1) по нажатию кнопки включать проигрывание мелодии

2) ночью снижать громкость, время синхронизировать с RTC микрухой

3) ограничивать звук вручную с переменного резистора

4) синхронизироваться с телефоном(выбор мелодии, установка времени тихого режима, синхронизация времени телефон->ардуино->RTC и тд)


Главный цикл:

void setup() {

поднимаем_serial();

настраиваем_пины();

инициализируем_переменные();

настраиваем_mp3();

настраиваем_прерывание_с_кнопки(PCIN2);

настраиваем_таймер_для_отсчета_времени();


InitRTOS(); // Инициализируем ядро таймерной службы

RunRTOS(); //Запускаем таймерную службу и диспетчер задач


// Запуск фоновых задач

SetTimerTask(read_max_volume, 1000);  //читаем данные с переменного резистора каждые 1 сек

SetTimerTask(check_time, 1000);  //проверяем время, не поздно ли. если поздно - включим тихий режим

SetTimerTask(read_rtc, 65000);  //синхронизируемся с RTC

SetTimerTask(check_sync, SYNC_PERIOD); //читаем bluetooth модуль, проверяем пришли ли данные

SetTimerTask(BlinkON,500); //моргаем светодиодом

sei();

}


void loop() {

TaskManager(); 

}


И все, ничего лишнего. check_sync проверяет есть ли данные в буфере от bluetooth модуля.

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

- если это запрос текущих настроек - отправляем ответ

- если это данные с новыми настройками - принимаем и сохраняем их

- если это запрос "воспроизведи текущую мелодию" запускаем задачу воспроизведения


Каждую задачу нужно писать так что бы она выполнялась как можно быстрее, никаких delay внутри быть не должно(кроме совсем уж мелких, как у 1-wire), вместо этого отдаем управление другой задаче, предварительно добавив нужный флаг состояния этой задачи и добавив себя же в очередь(таймерную)

Слишком сильно делить задачи тоже не стоит, т к очередь не бесконечная(это настраиваемый параметр)


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


UPD:  Забыл про пример расширяемости кода. Допустим мы захотели к дверному звонку добавить пару функций:  датчик дыма, угарного газа, с оповещением или датчик движения, с оповещением, etc.

Для этого нужно добавить в конец setup() пару строк:

SetTimerTask(check_gas, 1000);

SetTimerTask(check_motion_sensor, 500); 

Останется написать сами эти функции. т к опросы датчиков происходят очень редко, по меркам МК, это нисколько не нагрузит ни очередь, ни сам микропроцессор. Функция проигрывания уже написана, нам нужно только записать нужные мелодии на флешку и запомнить их id


Вопросы, пожелания и критика приветствуется)

Показать полностью
[моё] Arduino Dihalt Длиннопост Текст Быдлокодинг Программирование Диспетчер задач
16
392
techn0man1ac
techn0man1ac
8 лет назад
TECHNO BROTHER

Работа с цифровым осциллографом (освоившим только кнопку AUTO посвящается ;)⁠⁠

Подробная инструкция о том как пользоваться осциллографом от товарища DiHalt , что показывает осциллограф, как настраивать осциллограф. Какие приемы есть для отладки с помощью осциллографа. На примере осциллографа RIGOL.

За видео говорим спасибо автору канала easyelectronics:

https://www.youtube.com/user/easyelectronics

Показать полностью
Dihalt Осциллограф Как это сделано Цифровой Радиолюбители Видео
38
Xirenec
Xirenec
10 лет назад

Самоубийца из второго Ж класса⁠⁠

Учился я во втором классе одной весьма средней школы :))) Класс был 2Ж (нехило правда :) Ж!!!, но это еще фигня! я был еще и в 7з :))) вот это вообще убойный класс был :)) ) Короче, класс не зря Ж звался, последний в параллели, самый безбашенный, от нас все учителя стрелялись :) Я в этой школе учился недолго, но видать именно там мне привилась моя безбашенность. Ладно, ближе к делу.
Пришла к нам новая учительница, практикантка из педа, милая такая. Добрая по жизни, но строгая на занятиях. В общем, ведет она урок, все сидят тихо, слушают. Тока мы с Саньком на второй парте сидим, угораем. Раз сделала нам замечание, ноль внимания. Вторе замечание, опять ноль внимания. Третье замечание, опять нам пофигу, развлекаемся…
- *ов, *ев! Дневник! Оба! Два за поведение!!!
- Гы, а нету! :)))))))))) Дома забыл!
- Встали тогда! Оба! Будете слушать стоя!!!
Пофигу, встаем. Стоим, угораем, уже стоя :))) Это ее добило окончательно :-Е Хоть молодая, а злобная :) (тем более наш основной преподаватель свалил куда-то, наказав ей нас держать в ежовых рукавицах)
-*ов, *ев! Живо!!! ВОН ИЗ КЛАССА!!!
Мы с Сашкой переглянулись и, окинув класс печальным, полным грусти, взглядом дружно совершили публичное самоубийство, посредством выпрыгивания из окна. 2й этаж однако! потолки и фундамент высооокие, почти как третий в обычном здании. У преподши, по словам одноклассников, подкосились ноги, отпала челюсть и, наверное, поседели волосы, но она была блондинкой, поэтому это никто не заметил :). Она уже, походу, представила себе заголовки газет:
«ШОК!!! :Препод изверг довел двух школьников до самубийства».

Гы, она была новенькой и не знала, что под окном, в которое мы сиганули, находился небольшой козырек пожарного выхода. Мы частенько уходили домой таким образом, лень обходить здоровенное здание школы, а тут прыг на козырек, спустился по опорным столбам и до дома… Благодать :)
Первый и последний раз меня вызвали к директору. Было жутко стыдно, но в то же время в душе горел дьявольский, озорной огонек — а как мы её, а! Гы Гы!
Ладно до родтелей дело не дошло, так и не смогли прозвониться до дома, а подпись бабушки я умело подделывал :) После этого случая я стал более осторожным, начал мастерски шифроваться, а все гадости делать только изподтишка, как партизан! :)
Показать полностью
Школа Dihalt Текст
6
s3gre
s3gre
11 лет назад

Главный вопрос⁠⁠

Число комментариев к посту
Главный вопрос Число комментариев к посту
[моё] Совпадение Случайность Случайности не случайны Числа Dihalt
1
1
DELETED
11 лет назад

И еще раз об удобстве⁠⁠

Кстати, это кот DIHALT`а,известного хабравчанина. Привет тебе DIHALT!
И еще раз об удобстве Кстати, это кот DIHALT`а,известного хабравчанина. Привет тебе DIHALT!
Рыжие Кот Коробка Instagram Dihalt Habr
2
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии