Просто радость

Все-таки запустил на платке умного дома диспетчер задач от Дихальта. Очень хотелось вникнуть в принципы работы ОСРВ, поэтому писать старался сам, на основе теории из статьи, но в итоге код отличается от авторского только именами переменных. Очень понравилось. Теперь буду переводить прошивку умного дома на ОСРВ.
  • 0
  • 09 октября 2011, 18:43
  • enq

Комментарии (29)

RSS свернуть / развернуть
тоже всё делаю щас на этом же диспетчере, всё работает как надо, тока недавно обнаружил гадкую багу: через равные промежутки времени контроллер ребутится((( никто не наблюдал этого явления??
0
  • avatar
  • RomiX
  • 09 октября 2011, 19:46
прочитал комент, кинул взгляд на дисплей… и таки да, в ребуте. на моем N минут работает норм, потом ребутится каждую секунду, потом опять норм. DI, реквестуем багфикс!
0
Вы там собаку гладить не забываете?
0
а она и не включена даже… я хз даже как ее включить.
0
по умолчанию — включена, в функции инициализации
0
инициализацию сам писал. там настройка таймера и очистка очередей.
0
выключил уже давно, с ней ещё больше проблем было…
0
DI не причём тут! Перепроверяйте задачи и таблицу оных! У меня была такая бага из-за того, что вызывалась задача, не прописанная в таблице. В итоге контроллер попадал на какой-то левый адрес, там находил $FFFF, игнорировал его и методично перебирал байты в ПЗУ. До тех пор, пока не переваливал через ноль и начинал программу сначала. Что практически эквивалентно перезагрузке.
Лично я с тех пор ставлю после табицы задач предохранительный RET. Можно ещё перед ним что-нибудь сигнальное вставить
0
да я тоже думаю что это изза этого, тока ещё возможно что он переходит по нулевому адресу
0
я кста недавно по аналогии диспечер переписывал. сделал задачи на кольцевых буферах, индексы начала, конца и т.п. в итоге работает чуть быстрее, но флеша чуть больше занимает. на сколько больше не замерял, ибо надо еще оптимизировать.
0
Нашел причину тупняка с уходом на нулевой адрес. У мееня было:

#define maxTasks 7
#define maxTimers 3

а еше лучше не делать так:

void task1(){
....какой-то код....
setTask(anotherTask);
setTimerTask(task1, число);
}


исправил эти места, ребутов (точнее уходов на 0) больше не было.
0
  • avatar
  • enq
  • 10 октября 2011, 19:26
И как оно влияет?
0
баг больше не проявляется.
0
Это я понял. Меня интересует механизм возникновения бага и его лечения. И ты кстати показал что исправил, но не показал на что.
0
Длины очередей задач и таймеров сделал равными, а из той задачи убрал setTask(anotherTask). Т.е., как я понял, задачи надо ставить чем-нибудь одним: либо setTask(), либо setTimerTask(). после 1,5 суток ровной работы просто ОС зависла. Или может просто завис сам дисплей, бывает.
0
Следите за атомарностью добавления в очередь. Чтобы выборка адреса и внесение в очередь были атомарными. Причем закрытыми от выборки адреса и до записи в очередь. Иначе может быть лажа — адрес взялся, а в прерывании перехватило и в ту же ячейку загнало другую задачу. А по выходу из прерывания записанное тут же затерлось, т.к. адрес то уже был взят. И опа задачу профукали. А профукали задачу — оборвалась цепь и часть функционала проги отвалилась :)
0
Гм, а сама функция добавки задачи за своей атомарностью не следит?
0
Сейчас, в то версии что я юзаю для своих проектов — следит. В то что было тогда на сайте хз.
0
а вспомнил: у меня setTask заканчивается командой sei(). Когда она вызывается из прерывания, начинается каша.
0
Ну и не забывайте, что я в своем блоге КРАЙНЕ РЕДКО даю готовые решения. Это не более чем набросок, концепт раскрывающий идею, в котором обязательно есть баги и не факт что когда я их найду у себя потом я их исправлю в архивах на сайте. Мне банально лень. Так что ко всему надо подходить весьма критически и все перепроверять. А лучше писать самому с нуля. Испльзуя оригинал лишь как пищу для размышлений.
0
Или взять таки готовый продукт, а не концепт.
0
А ты знаешь кладезь удобоваримых готовых продуктов? Чтобы вот куда угодно и с чем угодно? Да еще чтобы просто и понятно, а не «я тут эту херню воткнул, черт знает что что там внутри, но вроде работает и ладно»
0
Ну как бы любой готовый продукт — это именно «я тут эту херню воткнул, что там внутри хз, но работает». А под «готовым продуктом» я имел в виду ртос, написанную именно для применения и распространения, где фиксятся баги и все такое.
0
Ну так их и так миллион, зачем плодить еще один?

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

У меня была изначально мысля развить все это дело до полноценной своей rtos (поэтому то оно так и называлось изначально), но после я еще раз подумал и не стал заморачиваться, т.к. текущий функционал диспетчера покрывает 99% моих нужд. А что надо сверх дописываю по мере надобности.
0
Я и не предлагал его допилить. Я сказал, что если уж берешь готовое — то брать следует готовый к употреблению, допиленный продукт, а не учебную демонстрашку. Демонстрашка же нужна, чтобы вдохновиться и написать свой велосипедик.
0
А последнее время вообще тяготею к автоматному программированию. На диспетчер очень так удобно навешиваются автоматы, вписываясь в него как родные.
0
А вот про это подробней. Можно статейкой, если ее не придется ждять неделю (или, того хуже, месяц/полгода/год).
0
Была же уже статья про автоматное программирование. В курсе статей про архитектуру программ.
0
Нет, именно про то, как именно «На диспетчер очень так удобно навешиваются автоматы, вписываясь в него как родные».
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.