-
- Берете библиотеку Protothreads и пишете как ни в чем не бывало. Скрипач(308 знак., 25.07.2013 19:52 - 22:05, ссылка)
- я cделал проще - выделил по таймеру на задачу, в диспетчере (или в начале задачи перед PT_BEGIN) синхронно с глобальным 1мс-флагом - декремент. В результате задержка сводится к макросу: zeleny(95 знак., 28.07.2013 23:58)
- Можно и так. Из плюсов: лучше себя ведет в пошаговой отладке. Еще лучше - отдельный массив таймеров, как у Мазура. Таймеров задаче может понадобится несколько. Всякий раз править код "перед PT_BEGIN"...не халяльно. Скрипач(152 знак., 29.07.2013 00:09 - 00:11)
- Пока делаю так: шаг увеличивается в задачах созданием дополнительных счетчиков в ОЗУ и инкрементированием с заданным шагом. Вообще интересный вопрос. Спасибо что подняли его. Уже появилась идея. Массив таймеров из трехбайтных блоков остается. mazur(539 знак., 29.07.2013 08:39 - 08:43)
- много таймеров нужно очень редко, в 99% случаев хватает 1го, 16-битного. Нужно больше - как уже писал, перед PT_BEGIN обрабатывается все специфичное для данной задачи. - zeleny(29.07.2013 00:27)
- Можно и так. Из плюсов: лучше себя ведет в пошаговой отладке. Еще лучше - отдельный массив таймеров, как у Мазура. Таймеров задаче может понадобится несколько. Всякий раз править код "перед PT_BEGIN"...не халяльно. Скрипач(152 знак., 29.07.2013 00:09 - 00:11)
- А не Timer-Timestamp? А не uint16? - Юра(25.07.2013 22:42, )
- Злые вы :))) - Скрипач(25.07.2013 22:43)
- А не надо секасом на площади заниматься :-) - amusin(25.07.2013 22:50)
- Злые вы :))) - Скрипач(25.07.2013 22:43)
- а где "staic"? - Гудвин(25.07.2013 21:16)
- Упс. добавил. - Скрипач(25.07.2013 22:04)
- А операцию вычитание в еще одни скобки взять не хотите? :) - rezident(25.07.2013 22:13)
- Тогда и YIELD'у нужно ссылку на контекст передать. А еще, готовый PT_WAIT_UNTIL есть. Скрипач(986 знак., 25.07.2013 22:26)
- +1 :) - Evgeny_CD(25.07.2013 22:20)
- А операцию вычитание в еще одни скобки взять не хотите? :) - rezident(25.07.2013 22:13)
- Упс. добавил. - Скрипач(25.07.2013 22:04)
- я cделал проще - выделил по таймеру на задачу, в диспетчере (или в начале задачи перед PT_BEGIN) синхронно с глобальным 1мс-флагом - декремент. В результате задержка сводится к макросу: zeleny(95 знак., 28.07.2013 23:58)
- Проблема пробок на автотрассе из-за того, что какие-то участники движения едут, как черепахи, решается не светофорами, а обеспечением возможности ОБГОНА! Поскольку перед черпахами дофига свободной дороги. Main loop подобна этой автотрассе - пробки Ксения(335 знак., 25.07.2013 13:34 - 13:36)
- Есть такой трюк, как несколько лупов поменьше, в прерываниях таймеров с соответствующими приоритетами и вложениями. Одна беда - на AVR этот трюк не катит ;) - Vladimir Ljaschko(25.07.2013 16:42)
- Несколько заЛупов поменьше - имитация RTOS. Нафиг. При производительности современных камней... Слушайте, может мы к DOS вернемся. Она уж на Атомах точно летать будет. - tesla(29.07.2013 00:33)
- Вполне катит и на АВР - в медленном таймерном прерывании разрешаются вложенные прерывания (чтобы могло работать быстрое таймерное прерывание), в быстром таймерном прерывании через сколько-то раз разрешается медленное таймерное прерывание. Таких Apтём(53 знак., 25.07.2013 16:48)
- Ага, лёгкое извращение. - Vladimir Ljaschko(25.07.2013 17:05)
- Малая скорость это не помеха. Ехали бы 50 км/ч за пенсионером - уже хорошо. Помеха - нет разгонных полос при въездах(съездах) на магистрали. - Юра(25.07.2013 16:04, )
- никогда вообще в своих программах не использовал задержек, и все таймауты прекрасно формируются - AVF(25.07.2013 14:24)
- Ну о чем и речь. Процедура вывода символов проверяет, истекло ли время ожидания. Если не истекло - сразу выход в Main Loop. Если истекло - выводим символ, выставляем новое значение таймаута и выходим опять же в Main Loop. - LightElf(25.07.2013 13:42)
- Здрасти! Пауза же не в конце процедуры стоит, а после КАЖДОГО выведенного на дисплей символа впадает в ожидание. Если я при первом же ожидании в Main loop вернусь, то следующие цифры никогда не будут прописаны. - Ксения(25.07.2013 15:19)
- Где-то у вас что-то не продумано. Koyodza мне подсказал этот способ. Создается буфер. Скажем, 20x4=80 байт. Пусть раз в 1 мс выводим посимвольно из буфера на дисплей. При 20x4 обновление всего экрана 84 мс. 80 символов, 4 адреса строк. Я мог бы mazur(175 знак., 25.07.2013 16:03, youtube)
- И вам не хворать :) LightElf(202 знак., 25.07.2013 15:48 - 15:55)
- Можно и всю строку выводить, но тогда очиску FIFO можно поручить таймерному прерыванию, которое будет за один вызов писать один символ на экран. - Apтём(25.07.2013 19:46)
- А как быть, если в начале/конце строки есть дополнительная работа (например, на очистку экрана) с особо большой задержкой? Тогда таймирование подравнивать под эту большую задержку, чтобы было поровну, или ту большую задержку разбивать на много Ксения(17 знак., 25.07.2013 19:11)
- Ну вот как-то примерно так. lcd_put просто складывает строку в буфер fifo. lcd_poll вызывается из main loop. LightElf(1581 знак., 26.07.2013 13:29 - 13:44)
- В вашем случае FIFO - это означает, что отправка символьных сообщений происходит всегда из одного места? Не проще ли работать с буфером символьного дисплея? Мне как показал Koyodza этот способ, я даже семисегментники перевел на этот способ. С mazur(34 знак., 26.07.2013 14:51)
- Ну нет, lcd_put можно из разных мест звать. С буфером в моем случае не лучший вариант. Текст для дисплея (кроме нескольких сообщений об ошибках) поступает снаружи устройства и содержит вперемешку еще всякие дополнительные коды (команды контроллера LightElf(205 знак., 26.07.2013 15:07)
- 1 - В том-то и прикол, что с буфером без разницы с чем работать. Это независимый модуль. А модули устройств уже из буфера отправляют символы. Все независимо. Как в вашем FIFO определить знакоместа символов? Вот я хочу отправить на 1 строку, mazur(66 знак., 26.07.2013 15:31)
- У меня ни текст, ни его форматирование, ни спецэффекты, ни тип дисплея неизвестны на этапе компиляции прошивки. - LightElf(26.07.2013 16:18 - 16:31)
- В смысле? Как это неизвестны? Как вы пишете тогда программу, если вам неизвестно с чем вы работаете, какие возможности вам доступны. Спецэффекты бесполезны в случае знакосинтезирующих дисплеев и семисегментников. - mazur(26.07.2013 16:39)
- Я пишу программу, которая будет работать с любым дисплеем, имеющим интерфейс типа HD44780. Я не знаю заранее его разрешение (от 1x8 до 4x40), конкретную кодировку и все такое прочее (у VFD от Futaba кодировка вообще левая, дисплеи от МЭЛТ работают LightElf(284 знак., 26.07.2013 17:28 - 17:31)
- Хочу заметить, что вы с mazur-ом о разных уровнях абстракции беседуете. - rezident(26.07.2013 17:36)
- Ну, Ксения о конкретной проблеме заикнулась. Что у нее проблемы с задержками при работе с дисплеем. Мои соображения, что она говорила о модуле для работы с конкретным дисплеем. Поэтому, если упоминаются разные уровни абстракции, то получается, что mazur(177 знак., 26.07.2013 18:17)
- Наверно. Мое дело - плата с прошивкой. Кто-то подключит к ней какой-то дисплей. Кто-то другой напишет управляющий софт (на сервере). Кто-то третий придумает выводимый текст. Желательно, чтобы все эти "кто-то" не парили каждый раз мозг мне :) - LightElf(26.07.2013 17:49)
- Хочу заметить, что вы с mazur-ом о разных уровнях абстракции беседуете. - rezident(26.07.2013 17:36)
- Я пишу программу, которая будет работать с любым дисплеем, имеющим интерфейс типа HD44780. Я не знаю заранее его разрешение (от 1x8 до 4x40), конкретную кодировку и все такое прочее (у VFD от Futaba кодировка вообще левая, дисплеи от МЭЛТ работают LightElf(284 знак., 26.07.2013 17:28 - 17:31)
- В смысле? Как это неизвестны? Как вы пишете тогда программу, если вам неизвестно с чем вы работаете, какие возможности вам доступны. Спецэффекты бесполезны в случае знакосинтезирующих дисплеев и семисегментников. - mazur(26.07.2013 16:39)
- У меня ни текст, ни его форматирование, ни спецэффекты, ни тип дисплея неизвестны на этапе компиляции прошивки. - LightElf(26.07.2013 16:18 - 16:31)
- 1 - В том-то и прикол, что с буфером без разницы с чем работать. Это независимый модуль. А модули устройств уже из буфера отправляют символы. Все независимо. Как в вашем FIFO определить знакоместа символов? Вот я хочу отправить на 1 строку, mazur(66 знак., 26.07.2013 15:31)
- Ну нет, lcd_put можно из разных мест звать. С буфером в моем случае не лучший вариант. Текст для дисплея (кроме нескольких сообщений об ошибках) поступает снаружи устройства и содержит вперемешку еще всякие дополнительные коды (команды контроллера LightElf(205 знак., 26.07.2013 15:07)
- В вашем случае FIFO - это означает, что отправка символьных сообщений происходит всегда из одного места? Не проще ли работать с буфером символьного дисплея? Мне как показал Koyodza этот способ, я даже семисегментники перевел на этот способ. С mazur(34 знак., 26.07.2013 14:51)
- Я начинаю понимать, что мне придется просто свой исходник привести, бо косноязычен зело и описать словами не могу. - LightElf(26.07.2013 12:17)
- Про какой дисплей вы говорите? Если взять ЖКИ на HD44780, то команда очистки 1,5 мс. Установили таймер, новое состояние автомата, новую точку входа прототреда, вышли. Делаете свои дела дальше. При следующей итерации проверка таймера. Время вышло? mazur(360 знак., 25.07.2013 20:16 - 20:19, youtube)
- Ну вот как-то примерно так. lcd_put просто складывает строку в буфер fifo. lcd_poll вызывается из main loop. LightElf(1581 знак., 26.07.2013 13:29 - 13:44)
- Здрасти! Пауза же не в конце процедуры стоит, а после КАЖДОГО выведенного на дисплей символа впадает в ожидание. Если я при первом же ожидании в Main loop вернусь, то следующие цифры никогда не будут прописаны. - Ксения(25.07.2013 15:19)
- Никакого тупика. Решение для обгона есть, но вы его упорно игнорируете -> - SciFi(25.07.2013 13:41, ссылка)
- Есть такой трюк, как несколько лупов поменьше, в прерываниях таймеров с соответствующими приоритетами и вложениями. Одна беда - на AVR этот трюк не катит ;) - Vladimir Ljaschko(25.07.2013 16:42)
- Я пользую timer.c, честно выкушенный из стека uIP - неблокирующиеся софтверные таймеры. - LightElf(25.07.2013 13:16)
- элементарно (автомат состояний), но оно надо? сделайте один проект под ось, потом будете просто задачи добавлять/менять - AVF(25.07.2013 13:15)
- Странно это слышать от вас. Да запросто это сделать в программе Main Loop. Стараюсь писать свои программы без долгих зацикливаний. Потихоньку перетаскиваю этот принцип на си. К примеру ваш пример. С дисплеем. mazur(3447 знак., 25.07.2013 05:55 - 06:23, youtube)
- А если, к примеру, у вас Proc_Heat_Init_2 ожидания не дождется ("один год"), то у вас вся Main loop от этого в пробку встанет? - Ксения(25.07.2013 13:23)
- Вы про программный косяк или как работает Proc_Timer? Или про то, что RTOS по времянке или завершению задачи переключится на другую? mazur(838 знак., 25.07.2013 15:22 - 15:35)
- А если, к примеру, у вас Proc_Heat_Init_2 ожидания не дождется ("один год"), то у вас вся Main loop от этого в пробку встанет? - Ксения(25.07.2013 13:23)
- при нличии свободного счётчика - запросто. Д.ARMоед(478 знак., 25.07.2013 01:31)
- Это не поможет. Число на дисплее приходится обновлять каждую секунду, а беда в том, что почти половину из этой секунды пожирает Display_Step(). Причем расходуется не на дело, а на таймауты. Не будь этих таймаутов, то Display_Step() можно было хоть Ксения(318 знак., 25.07.2013 13:05)
- Поможет. Display_Step() рубить нельзя. Д.ARMоед(829 знак., 25.07.2013 14:14)
- -> SciFi(82 знак., 25.07.2013 13:07, ссылка, ссылка)
- Смотрела уже, но пока не в восторге. Буду разбираться, в какой код это выливается. Чудес не бывает, protothreads это или нет, должна быть идея о том, как это делается. Последнее дело тыкать пальцем в чужие библиотеки, полагая, что те делают дело Ксения(26 знак., 25.07.2013 13:14)
- Уже обсуждалось -> SciFi(726 знак., 25.07.2013 13:28, ссылка)
- Это же всего лишь набор макросов, нет там ничего сверхестественного. - =AlexD=(25.07.2013 13:27)
- Но какая-то кривота в них чуствуется. - Apтём(25.07.2013 15:51)
- Смотрела уже, но пока не в восторге. Буду разбираться, в какой код это выливается. Чудес не бывает, protothreads это или нет, должна быть идея о том, как это делается. Последнее дело тыкать пальцем в чужие библиотеки, полагая, что те делают дело Ксения(26 знак., 25.07.2013 13:14)
- Это не поможет. Число на дисплее приходится обновлять каждую секунду, а беда в том, что почти половину из этой секунды пожирает Display_Step(). Причем расходуется не на дело, а на таймауты. Не будь этих таймаутов, то Display_Step() можно было хоть Ксения(318 знак., 25.07.2013 13:05)
- Как вам таймаут в один год? :) - Скрипач(25.07.2013 00:36)
- Да не вопрос! А лучше сразу 10 :-) SciFi(41 знак., 25.07.2013 08:41)
- У меня есть алгоритмы с задержкой 1год :) Работают. Нужно только озаботится сохранением значения таймеров при пропадании питания. - Скрипач(25.07.2013 08:53)
- попросить юзера продлить лицензию? :> - Snaky(25.07.2013 08:58)
- У меня есть алгоритмы с задержкой 1год :) Работают. Нужно только озаботится сохранением значения таймеров при пропадании питания. - Скрипач(25.07.2013 08:53)
- Да не вопрос! А лучше сразу 10 :-) SciFi(41 знак., 25.07.2013 08:41)
- Решение возможно: испльзуйте конечные автоматы (так кажется называлось), оно же - автоматное программирование. Apтём(227 знак., 25.07.2013 00:08)
- Очевидно, вы не в курсе, что существует protothreads. Как и многие из нижеподписавшихся, впрочем. - SciFi(24.07.2013 23:57)
- co-routines от FreeRTOS то же самое что protothreads? - _VVB(27.07.2013 16:17, )
- Ага. Только в FreeRTOS приделали ещё и некий планировщик для них. - SciFi(27.07.2013 16:53)
- co-routines от FreeRTOS то же самое что protothreads? - _VVB(27.07.2013 16:17, )
- посмотрите protothreads - Vit(24.07.2013 23:57)
- Берете библиотеку Protothreads и пишете как ни в чем не бывало. Скрипач(308 знак., 25.07.2013 19:52 - 22:05, ссылка)