Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: embedded cron
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
evgen2
А вот не подскажет ли кто - есть ли в природе embedded cron не для линукса, а для мелкопроцессоров типа ARM Cortex 3,
и чтоб в исходниках на Це, и чтоб памяти не ел, и чтоб difftime мухой считал без double.
Forger
Цитата(evgen2 @ Dec 2 2015, 00:04) *
А вот не подскажет ли кто - есть ли в природе embedded cron не для линукса, а для мелкопроцессоров типа ARM Cortex 3,
и чтоб в исходниках на Це, и чтоб памяти не ел, и чтоб difftime мухой считал без double.

Пробовал порт embedded cron на Cortex M0 (STM32F03x), причем приходилось снижать частоту, слишком быстро работал sm.gif

Шутки шутками, но если серьезно, то зачем?
evgen2
Цитата(Forger @ Dec 2 2015, 09:37) *
Пробовал порт embedded cron на Cortex M0 (STM32F03x), причем приходилось снижать частоту, слишком быстро работал sm.gif

Шутки шутками, но если серьезно, то зачем?

порт embedded cron - где брать?

Запуск "задач" по расписанию посредством использования RTC. Типа в пятницу с утра включать поддержание температуры, включать-выключать освещение с заходом/восходом солнца. Всё вроде бы понятно как делать, но как-то некузяво получается.
Forger
Цитата(evgen2 @ Dec 2 2015, 10:21) *
Запуск "задач" по расписанию посредством использования RTC. Типа в пятницу с утра включать поддержание температуры, включать-выключать освещение с заходом/восходом солнца. Всё вроде бы понятно как делать, но как-то некузяво получается.

У меня сложилось впечатление, что "из пушки по воробям" ...

Это продвинутый школьник за вечер напишет на ардуино. Если задача разовая, то быстрее сделать именно на ардуино или на край - практически на любой демоплате.

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

Повторюсь, почему именно Cortex-M3?
AVI-crak
Кхм, RTC имеет ограниченное количество будильников. При попытке в наглую сделать 10 будильников с разным временем и последовательностью установки - вас ждёт жестокий облом.
Тут требуется собственный диспетчер RTC, который будет знать о всех активных будильниках, и устанавливать их по порядку даты. Это можно и без ос сделать, но максимальное количество будильников должно быть ограниченно известным вам числом.

Проснулись, прошлись по всем будильникам и нашли минимальное время в + от текущего, установили , далее обработка функции на текущее время, и сон.
Добавление будильника - смотрим записи с датой ниже текущей, и юзаем первую-же попавшуюся.
Проект собирается без ос, любыми доступными способами.
evgen2
Цитата(Forger @ Dec 2 2015, 10:28) *
У меня сложилось впечатление, что "из пушки по воробям" ...


Я когда смотрел на исходники cron'а - у меня сложилось впечатление, что пушка в воробья не залезет

Цитата(Forger @ Dec 2 2015, 10:28) *
Это продвинутый школьник за вечер напишет на ардуино. Если задача разовая, то быстрее сделать именно на ардуино или на край - практически на любой демоплате.

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


Продвинутый школьник может написать только гуано и первое во что он упрется - "как поспать N секунд".

Цитата(Forger @ Dec 2 2015, 10:28) *
Повторюсь, почему именно Cortex-M3?


как раз потому, что там можно сделать вебморду

Цитата(AVI-crak @ Dec 2 2015, 10:49) *
Тут требуется собственный диспетчер RTC, который будет знать о всех активных будильниках, и устанавливать их по порядку даты. Это можно и без ос сделать, но максимальное количество будильников должно быть ограниченно известным вам числом.

Проснулись, прошлись по всем будильникам и нашли минимальное время в + от текущего, установили , далее обработка функции на текущее время, и сон.
Добавление будильника - смотрим записи с датой ниже текущей, и юзаем первую-же попавшуюся.
Проект собирается без ос, любыми доступными способами.


ну да, как-то так мыслится/хочется, только с функцией "периодический будильник" (раз в N секунд включаться на M секунд) и обработкой ситуации "несколько будильников сработали одновременно".



Forger
Цитата(evgen2 @ Dec 2 2015, 11:00) *
Я когда смотрел на исходники cron'а - у меня сложилось впечатление, что пушка в воробья не залезет
так и я о чем!

Цитата
Продвинутый школьник может написать только гуано и первое во что он упрется - "как поспать N секунд".

У вас сложилось ошибочное мнение о школьниках
бошки у них порой варят по-лучше, чем у некоторых взрослых wink.gif

Цитата
как раз потому, что там можно сделать вебморду
Ага, а на других процах это сделать невозможно.... буду знать

mantech
Цитата(evgen2 @ Dec 2 2015, 11:11) *
Продвинутый школьник может написать только гуано и первое во что он упрется - "как поспать N секунд".


Ну прямо так и только biggrin.gif

Вот делал много лет назад для своего первого ПЛК на АВР!

Сорри за многобукав, но чтоб было понятно...

RTCS – Real time Sheduler
Данный модуль позволяет задать до 16 событий с заданной длительностью от 1сек до нескольких лет! По наступлению события, устанавливается соотв. бит в регистре статуса.
Параметры задания находятся в энергонезависимой части ПГП, поэтому не стираются при выключении питания, как и часы реального времени.
Выдержка времени может быть задана как в абсолютном выражении (сек.мин.часы и т.д.)
так и относительно т.е. можно задать через сколько секунд, минут, часов или дней относительно текущего времени и даты, должно наступить событие. Это удобно например, для задания каких-либо сроков годности или сроков техобслуживания.
Время рассчитывается с учетом високосных лет и кол-ва дней в месяце.

Для работы RTCS необходимо задать текущее время и дату:
Например так
DATETIME[0]=10;DATETIME[1]=20;DATETIME[2]=10; //задаем сек,мин, часы соотв.
DATETIME[3]=29;DATETIME[4]=12;DATETIME[5]=12; //задаем день, месяц, год соотв.
blockwrite(RTC_DateTime,DATETIME); //задать время во внутренних часах

Для задания только времени можно использовать параметр RTC_Time, только даты - RTC_Date. Массив при этом состоит только из 3х элементов.

out (RTCS_Addr,15); //Задаем стартовый адрес в ПГП.
Внимание! Если адрес не задан, то считается равным 0!
Теперь можно задавать времена наступления событий:

blockwrite(RTCS_SetAbs,0,52,20,15,9,12);
В этом случае время события №1 задается абсолютно, а именно, сработает в 20часов 52мин 00сек 15сентября 2012года.
Если данные по событию представлены в виде массива из 6 элементов, то можно использовать параметр - RTCS_SetArr.
blockwrite(RTCS_SetArr,AlarmArray);

Если в условии задачи сказано, что событие должно наступить через N дней, то удобнее задавать относительным методом.
Например, зададим событие №2 на сработку через 10 дней:

blockwrite(RTCS_DayRel+1,10);
Сработка произойдет ровно в то же время, равное текущему, но через 10 дней.
Аналогично задаются:
RTCS_SecRel – секунды
RTCS_MinRel – минуты
RTCS_HrsRel – часы
Диапазон чисел (1-65535)

Данные события считаются наступившими, если текущая дата или время, более поздние, чем установлены. Но если нужна сработка только по совпадению дат и времени? Система позволяет это сделать!
Можно задать такой тип события, которое будет выполнятся циклически.
Например, нужно что-то включать каждые сутки в определенное время:
blockwrite(RTCSE_SetAbs,sec,min,hrs,0xff, 0xff,0xff,0xff);
Здесь мы задали событие во время sec,min,hrs, а остальные параметры нам неважны
По наступлению события, мы сбрасываем его флаг, и делаем паузу, хотябы на 1 сек, чтобы флаг события не взвелся вновь. После этого, следуюшее событие наступит ровно в эти же час минуту и секунду, как задано.
Аналогичным образом устанавливаются относительные интервалы времени.
Например: blockwrite(RTCSE_DayRel,10);


Запись «RTCS_DayRel+1» означает, что мы задаем событие №2
Например, событие №5 будет задано как «RTCS_DayRel+4»
Аналогично выбирается номер события в абсолютном и других относительных методах.

После задания всех событий, нужно разрешить работу обработчика:
out (RTCS_Enable,0b0000000000000011); //разрешили работу первых 2х событий, остальные не обрабатываются. Как видно, можно задавать опрос только тех событий, бит которых =1.
Чтение текущего времени осуществляется аналогично записи, с использованием параметров RTC_Time, RTC_Date или RTC_DateTime.
blockread(RTC_Time,TIME); //read sec[0] min[1] hour[2]
blockread(RTC_Date,DATE); //read day[0] month[1] year[2]

Чтение статуса RTCS производится так: res=in(RTCS_Status);
получаем 16бит, где 0й бит соответствует первому событию 15й- шестнадцатому. Если бит=1 событие произошло.

Сбросить статус можно заданием новой уставки по событию, при этом бит статуса соотв. номеру события, стирается. Если задано время которое уже является прошедшим по сравнению с текущим, то бит будет снова установлен.

По наступлению события можно задать системное прерывание:
SEI (RTCS_IntrVect);
ВНИМАНИЕ! Если в одну секунду происходит сработка сразу нескольких событий, прерывание будет вызвано ОДНО, общее для них.
evgen2
Цитата(Forger @ Dec 2 2015, 11:13) *
Ага, а на других процах это сделать невозможно.... буду знать


Меня терзают смутные сомнения, что на M0 можно сделать вебморду

Цитата(mantech @ Dec 2 2015, 11:16) *
Ну прямо так и только biggrin.gif

Вот делал много лет назад для своего первого ПЛК на АВР!

ну так речь про школьника шла в контексте андурины, а там все через одно место...
mantech
Цитата(evgen2 @ Dec 2 2015, 11:34) *
ну так речь про школьника шла в контексте андурины, а там все через одно место...


Просто хотел этим сказать, что все это делается без каких-либо особых проблем на любом МК с "часами", и гораздо быстрее, чем портировать линуксовое что-то с чем-то...
Forger
Цитата(evgen2 @ Dec 2 2015, 11:34) *
Меня терзают смутные сомнения, что на M0 можно сделать вебморду
вебморда вебморде - рознь.
К примеру: подключаем к любому M0 копеешный вайфай типа ESP и будет работать даже сложная вебмоморда на несколько клиентов.


Цитата
а там все через одно место...

А вы посмотрите на свою задумку: всунуть в М3 урезанный линукс ради только нескольких RTC будильников...
evgen2
Цитата(Forger @ Dec 2 2015, 11:48) *
вебморда вебморде - рознь.
К примеру: подключаем к любому M0 копеешный вайфай типа ESP и будет работать даже сложная вебмоморда на несколько клиентов.


Причём тут вайфай? Веб морда с тысипями кушает память, а в M0 ее кот наплакал - 8-12 кб

Цитата(Forger @ Dec 2 2015, 11:48) *
А вы посмотрите на свою задумку: всунуть в М3 урезанный линукс ради только нескольких RTC будильников...


cron, это небольшая (для PC) утилита типа вот такого https://packages.debian.org/source/wheezy/cron или https://github.com/dubiousjim/dcron которая несколько меньше линукса
arhiv6
А какой минимальный шаг времени нужен? Поддержка дат нужна? Или просто "запуск задачи через час", "запуск задачи раз в сутки"? Если второй вариант, можно сделать свой планировщик, взяв за основу этот. Умеет периодический запуск задач. отложенный запуск.
AVI-crak
Цитата(evgen2 @ Dec 2 2015, 15:11) *
ну да, как-то так мыслится/хочется, только с функцией "периодический будильник" (раз в N секунд включаться на M секунд) и обработкой ситуации "несколько будильников сработали одновременно".

Это невозможно на физическом уровне. Ваш мк будет управлять физикой с двумя состояниями - вкл-выкл, ну может быть ещё шим - но у него тоже пишется единственное значение.
Значит все эти глюки необходимо разрулить ещё до фактической установки будильника.
Функция - будильник каждую секунду - задаётся с некорректными значениями неиспользуемых разрядов будильника. Например каждую секунду - число секунд, а минуты, часы дни - года FFFF. Тогда при установке будильника можно будет задействовать отдельный канал со спец режимом, именно для этих целей, но таких каналов кажись всего один штук. Ну и управление физикой будет очень ограниченным. С этим делом прекрасно справляется программный таймер, там даже ничего изобретать не нужно.
arhiv6
Ещё нашёл AVR-Crontab, но сам ни разу не пробовал. Если функционал устраивает, на ARM перенести вроде не сложно будет.
Forger
Цитата(evgen2 @ Dec 2 2015, 12:26) *
Причём тут вайфай? Веб морда с тысипями кушает память, а в M0 ее кот наплакал - 8-12 кб

А как вы будете подключать М0 в сеть, где будут бегать ваши TCP пакеты?
Размер занимаемой озу стеком TCP/IP сильно зависит от числа одновременных одкрытых соедений, других поддерживаемых протоколов,
в М0 ни у кого нет RMI интерфейса, чтобы подключить эзернет, но есть spi и uart как минимум, к ним пожно подключать внешние крохотные модули с реализаванных внутри них TCP/IP. В этом случае даже 8-битный адруино справиться с задачей на ура.
Я для примера предложил самый бюджетный и простой вариант - вайфай ESP.

Цитата
которая несколько меньше линукса,
Ну, это все меняет sm.gif
evgen2
Цитата(arhiv6 @ Dec 2 2015, 12:33) *
А какой минимальный шаг времени нужен? Поддержка дат нужна? Или просто "запуск задачи через час", "запуск задачи раз в сутки"? Если второй вариант, можно сделать свой планировщик, взяв за основу этот. Умеет периодический запуск задач. отложенный запуск.


О, спасибо. Минимализм, как и хотелось. И можно и RTC прикручивать.

Цитата(AVI-crak @ Dec 2 2015, 12:40) *
Это невозможно на физическом уровне. Ваш мк будет управлять физикой с двумя состояниями - вкл-выкл, ну может быть ещё шим - но у него тоже пишется единственное значение.
Значит все эти глюки необходимо разрулить ещё до фактической установки будильника.
Функция - будильник каждую секунду - задаётся с некорректными значениями неиспользуемых разрядов будильника. Например каждую секунду - число секунд, а минуты, часы дни - года FFFF. Тогда при установке будильника можно будет задействовать отдельный канал со спец режимом, именно для этих целей, но таких каналов кажись всего один штук. Ну и управление физикой будет очень ограниченным. С этим делом прекрасно справляется программный таймер, там даже ничего изобретать не нужно.

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

Цитата(Forger @ Dec 2 2015, 12:51) *
А как вы будете подключать М0 в сеть, где будут бегать ваши TCP пакеты?
Размер занимаемой озу стеком TCP/IP сильно зависит от числа одновременных одкрытых соедений, других поддерживаемых протоколов,
в М0 ни у кого нет RMI интерфейса, чтобы подключить эзернет, но есть spi и uart как минимум, к ним пожно подключать внешние крохотные модули с реализаванных внутри них TCP/IP. В этом случае даже 8-битный адруино справиться с задачей на ура.
Я для примера предложил самый бюджетный и простой вариант - вайфай ESP.

Ну, это все меняет sm.gif


Всё равно веб сервер надо будет в М0 делать.

Но сама идея мне нравится, как раз под дивайс, в котором крон должен жить.
Вайфай ESP - это ESP8266 или есть другие варианты?
Forger
Цитата(evgen2 @ Dec 2 2015, 13:32) *
Вайфай ESP - это ESP8266 или есть другие варианты?

Конечно, есть и другие, этот я указал для примера и как самый ходовой и доступный.
Tarbal
Цитата(evgen2 @ Dec 2 2015, 01:04) *
А вот не подскажет ли кто - есть ли в природе embedded cron не для линукса, а для мелкопроцессоров типа ARM Cortex 3,
и чтоб в исходниках на Це, и чтоб памяти не ел, и чтоб difftime мухой считал без double.


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

Правда difftime не считает.

Могу рассказать более подробно (с примерами имплементации) если интересно.
AVI-crak
Цитата(evgen2 @ Dec 2 2015, 17:32) *
Почему невозможно? Просыпаемся по RTC, смотрим, какие есть "задачи", если нет - то спим дальше, если есть - выполняем их - последовательно - типа дрыгнуть ногами, запустить АПЦ и дождаться результата (т.е. квазиодновременно, если у нас минимальный квант от RTC секунда), перед тем как заснуть пробегаемся по будильникам, находим ближайший, программируем время следующего прерывания RTC и засыпаем. RTC позволяет (более лучше спать и) меньше потреблять, чем программный/нутряной таймер.


Да вот фига.
Просыпаемся когда уже пора что-то делать, потому как будильник на это время взведён. Иначе смысл в будильнике отпадает, можно на программных таймерах считать, с точностью в миллисекунды. Завёл одну переменную в 64 бита - и железяка её за всю твою жизнь не обнулит.
evgen2
Цитата(AVI-crak @ Dec 2 2015, 22:34) *
Да вот фига.
Просыпаемся когда уже пора что-то делать, потому как будильник на это время взведён. Иначе смысл в будильнике отпадает, можно на программных таймерах считать, с точностью в миллисекунды.


Да фига. Я как раз об этом и говорю.

Цитата(AVI-crak @ Dec 2 2015, 22:34) *
Завёл одну переменную в 64 бита - и железяка её за всю твою жизнь не обнулит.

не всю. До разряда батарейки/зависания/сбоя
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.