Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Защита секция кода во FLASH в ATmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4, 5, 6
Дон Амброзио
А кто как защищает код в MCU от несанкционированного выполнения в результате случайного перехода из одной точки программы в другую от воздействия помехонесущего электромагнитного поля (искажения записанного в счётчике команд значения). А?

Приведу пример
--------------------
lab_1_input: ldi R16 , $00
mov R16 , $98
...
lab_1_output: mov R17 , R5
-----------------------
lab_2_1_input: mov R18, R17


Т.е. допустим программа предусматривает переход к выполнению кодового фрагмента, начинающегося с метки lab_2_1_input только после отработки до конца фрагмента [lab_1_input;lab_1_output]

А представим , что от помехи произошёл случайный переход из произвольной точки 1-го фрагмента кода в произвольную точку 2-го фрагмента кода....

Как вы ПРОГРАММНО отлавливаете такие ситуации?

Т.е. как Вы реализовываете в своих программах для микроконтроллеров ATmega механизм защиты FLASH-памяти от несанкционированного выполнения кода. Ну т.е. как контролировать, что в данный фрагмент кода вошли не где попало, а через строго определённые на этапе проектирования программы, точки

Цитата(Дон Амброзио @ Feb 11 2008, 20:36) *
А кто как защищает код в MCU от несанкционированного выполнения в результате случайного перехода из одной точки программы в другую от воздействия помехонесущего электромагнитного поля (искажения записанного в счётчике команд значения).

Кстати, причины такого случайного джампа могут быть не только в разрушении PC.
Может также случайным образом измениться содержимое ячейки FLASH или содержимое хранимой в ОЗУ таблицы переходов... В любом случае МОЖЕТ произойти переход в точку некоторого логического сегмента кода, которая не предусмотрена данным логическим сегментом FLASH
Liseev
А как вы будете защищать "механизм защиты от несанкционированного выполнения"?
А механизм защиты механизма защиты?
А от прямого попадания молнии? smile.gif

Используйте WDT от "случайных" зависаний ну и, пожалуй, проверяйте CRC программного кода.
Здесь эта тема броде бы обсуждалась
Дон Амброзио
Цитата(Liseev @ Feb 11 2008, 21:05) *
Используйте WDT от "случайных" зависаний

ИМХО, "случайные зависания" в граммотно разработанной программе невозможны так что и необходимость применения WDT практически равна нулю


Цитата(Liseev @ Feb 11 2008, 21:05) *
проверяйте CRC программного кода
Проверяю

Цитата(Liseev @ Feb 11 2008, 21:05) *
Здесь эта тема броде бы обсуждалась

Обсуждалась...А отслеживаю темы подобной тематики
Непомнящий Евгений
Ну как вариант - расставить assert-ы по всей проге, для рантайм- проверки предусловий и постусловий функций. Если assert не выполняется - ахтунг.
Liseev
Цитата(Дон Амброзио @ Feb 11 2008, 21:40) *
ИМХО, "случайные зависания" в граммотно разработанной программе невозможны

если в грамотно разработанной программе вы допускаете
Цитата(Дон Амброзио @ Feb 11 2008, 20:42) *
что от помехи произошёл случайный переход из произвольной точки 1-го фрагмента кода в произвольную точку 2-го фрагмента кода

то должны также допускать и другие варианты некорректной работы программы, в том числе и случайные зависания, а посему использование WDT обязательно wink.gif
Дон Амброзио
Цитата(Непомнящий Евгений @ Feb 11 2008, 22:26) *
Ну как вариант - расставить assert-ы по всей проге, для рантайм- проверки предусловий и постусловий функций. Если assert не выполняется - ахтунг.

Что-то подобное и делаю.


Правда не знал, что эти переменные называются "assert-ы" 07.gif

Цитата(Liseev @ Feb 11 2008, 22:32) *
если в грамотно разработанной программе вы допускаете

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

Допускаю...
Поэтому и тему создал тут http://electronix.ru/forum/index.php?showtopic=43223

Хотя реально.. Из опыта эксплуатации своих программ я увидел, что "случайных зависаний" не присходит, а вот "случайных джампов" сколько угодно


Цитата(galjoen @ Feb 11 2008, 22:04) *
Вообще то я там WDRF искал и не находил smile.gif . А обстановка с помехами там ещё та! Недалеко 6 кВ 1кА. И всё это тиристорами коммутируется.

Взято из поста #76 здесь http://electronix.ru/forum/index.php?showt...mp;#entry363289
SasaVitebsk
Цитата(Дон Амброзио @ Feb 11 2008, 22:40) *
ИМХО, "случайные зависания" в граммотно разработанной программе невозможны так что и необходимость применения WDT практически равна нулю


Liseev писал вам правильно, а вы наводите тень на плетень. Естественно, ни о каких программных зависаниях речь не может идти. Но "зависание", как таковое, это не бездействие процессора. Если процессор "завис" после помехи или сбоя - это значит он попал в какой то цикл. Причём цикл обычный, "правильный", только в "неправильное" время. Из этого состояния его и вытягивает WDT.

Предложу вам свой метод вставки WDT.

1) Программа отлаживается полностью без WDT.
2) Анализируется текст программы. Выявляются минимальное число мест, где нельзя обойтись без сброса WDT. Надо чётко понимать, чем больше вы ввалите WDR, тем ниже вероятность выведения проца из ступора после сбоя (выше вероятность, что он зациклится там, где предусмотрен WDR).
3) Определяется минимальное время, достаточное для работы без "вылета".
4) Анализируются прерывания. (Здесь кто-то предлагал ставить WDR в регулярных прерываниях. На мой взгляд это возможный, но не самый лучший вариант)
5) В местах установки вами WDR желательно программно анализировать остальные параметры работы программы. Например известные признаки разрешения прерываний, максимальная длительность нахождения программы в том или ином цикле и так далее.
6) Программа инициализации должна анализировать состояние и причину сброса. Должна обеспечивать полную инициализацию всего используемого оборудования, включая умолчания. Сама инициализация должна проводится максимально быстро либо обеспечивать "теневую" работу. Иными словами, в оптимале, чтобы пользователь не замечал пересброса системы.

Тестируется.
Дон Амброзио
Цитата(SasaVitebsk @ Feb 12 2008, 00:34) *
Liseev писал вам правильно, а вы наводите тень на плетень.

Странный у вас метод ведения дисскусии


Цитата(SasaVitebsk @ Feb 12 2008, 00:34) *
Но "зависание", как таковое, это не бездействие процессора.

Да что Вы говорите...Прям открытие для меня сделали..А я прям не знал

Цитата(SasaVitebsk @ Feb 12 2008, 00:34) *
Если процессор "завис" после помехи или сбоя - это значит он попал в какой то цикл. Причём цикл обычный, "правильный"

Ещё раз повторяю (Вы что не читатель? Почему я должен повторять?):
В правильно разработанной (грамотной) программе таких циклов (а значит и зависаний) быть не может!!!


Цитата(SasaVitebsk @ Feb 12 2008, 00:34) *
Предложу вам свой метод вставки WDT.

1) Программа отлаживается полностью без WDT.
2) Анализируется текст программы. Выявляются минимальное число мест, где нельзя обойтись без сброса WDT. Надо чётко понимать, чем больше вы ввалите WDR, тем ниже вероятность выведения проца из ступора после сбоя (выше вероятность, что он зациклится там, где предусмотрен WDR).
3) Определяется минимальное время, достаточное для работы без "вылета".
4) Анализируются прерывания. (Здесь кто-то предлагал ставить WDR в регулярных прерываниях. На мой взгляд это возможный, но не самый лучший вариант)
5) В местах установки вами WDR желательно программно анализировать остальные параметры работы программы. Например известные признаки разрешения прерываний, максимальная длительность нахождения программы в том или ином цикле и так далее.
6) Программа инициализации должна анализировать состояние и причину сброса. Должна обеспечивать полную инициализацию всего используемого оборудования, включая умолчания. Сама инициализация должна проводится максимально быстро либо обеспечивать "теневую" работу. Иными словами, в оптимале, чтобы пользователь не замечал пересброса системы.


И как всё это можно применить в многозадачной среде RTOS?
http://electronix.ru/forum/index.php?showtopic=43223
galjoen
Цитата(Дон Амброзио @ Feb 11 2008, 20:42) *
mov R16 , $98


Такой команды у AVR нет.
Цитата(SasaVitebsk @ Feb 12 2008, 00:34) *
5) В местах установки вами WDR желательно программно анализировать остальные параметры работы программы. Например известные признаки разрешения прерываний, максимальная длительность нахождения программы в том или ином цикле и так далее.

+1
Добавлю. Желательно анализировать стек. Если это в основном цикле (а там и стоит ставить WDR) то ук-ль стека д.б. = RAMEND (или как вы его установили). А если это подпрограмма (прерывание) - то диапазон разрешённых значений указателя стека (RAMEND-X)..(RAMEND-2) (с некоторым запасом). А ещё, что в вершине стека лежит. Откуда эта подпрограмма (прерывание) была. вызвана. Тоже диапазон.

Работает
SasaVitebsk
Цитата(Дон Амброзио @ Feb 12 2008, 01:52) *
Ещё раз повторяю (Вы что не читатель? Почему я должен повторять?):
В правильно разработанной (грамотной) программе таких циклов (а значит и зависаний) быть не может!!!


Вы даже не понимаете что вы пишете. Не понимаете самой сути зависания, а ещё пытаетесь ехидничать. Через год перечитаете свои топики - будет стыдно.

Ладно попытаюсь вам объяснить.

Представьте себе правильно написанную программу, которая отработана и не содержит не единой ошибки. В ней находится следующий текст например:

Код
...
ReadLptEPP:
    sbic    pinc,LptSTB    ; Строб пришёл?
    rjmp    ReadLptEPP    ; иначе повторить
    sbic    pine,WRITE    ; Если запись HOST, то продолжить
    rjmp    errLptEPP    ; иначе ошибка
    in        wl,ILPT        ; ввод данных в wl
    sbi        portc,WAIT    ; подтвердить
rwaitNoLptSTB:
    sbis    pinc,LptSTB    ; Строб сняли?
    rjmp    rwaitNoLptSTB; иначе повторить
    cbi        portc,WAIT    ; подтвердить
    ret
...


Теперь представьте себе что произошёл сбой в работе процессора и программа попала в ReadLptEPP либо rwaitNoLptSTB. Не по логике работы программы, а по сбою. Если для вас это непонятно, то представьте, что произошла ошибка во время перехода процессора, либо во время сбоя исказился PC, либо исказился стек и произошёл возврат не туда. Ну что доступно объясняю? Более того чтобы не исказилось и кудабы проц не пошёл, то он заткнётся в каком-нибудь цикле!!!! Это то понятно? В любой программе правильно написаной десятки либо тысячи циклов. Что тут непонятно? Но если ваша программа, например, сидит в цикле ожидания символа из UARTа, а он туда не должен придти, по той банальной причине, что вы не делали запроса и не потому что программа неправильно написана, а потому, что произошёл сбой и программа попала туда, куда не должна была попасть.

Что тут не ясно?
Дон Амброзио
Цитата(SasaVitebsk @ Feb 12 2008, 01:45) *
Что тут не ясно?

Мне всё ясно... Вы привели продемонстрировали сейчас КАК НЕ НАДО ПИСАТЬ ПРОГРАММЫ на примере неправильной организации программы..Я Вам еще раз повторяю: в граммотно спроектированной программе вечных циклов быть не должно не при каких искажениях данных и регистров!!!!



Цитата(SasaVitebsk @ Feb 12 2008, 01:45) *
во время сбоя исказился PC, либо исказился стек и произошёл возврат не туда

Вот в этом, собственно, и вопрос темы. Как спроектировать программу, чтобы она детектировала приведённые Вами явления. Надеюсь из моих объянений и примеров Вы поняли, что Watchdog тут поможет также как козе пятая нога, ибо в граммотно спроетированной программе вечные циклы невозможны


Хочу заметить, Господа что я прекрасно себе представляю, что [u]абсолютно все случаи несанкционированного использования кода программно обнаружить невозможно[/u] (а может есть MCU с аппаратной реализацией деления и защиты кода во FLASH?).

Цитата(galjoen @ Feb 12 2008, 01:05) *
Такой команды у AVR нет.
Согласен.. описАлся


Цитата(galjoen @ Feb 12 2008, 01:05) *
Если это в основном цикле

Какой ещё основной цикл в многозадачной многопоточной среде RTOS? И там стеков не один, а несколько...Причём как стеки PC, так и стеки данных
SasaVitebsk
Цитата(Дон Амброзио @ Feb 12 2008, 03:02) *
Мне всё ясно... Вы привели продемонстрировали сейчас КАК НЕ НАДО ПИСАТЬ ПРОГРАММЫ на примере неправильной организации программы....

Надеюсь из моих объянений и примеров Вы поняли, что Watchdog тут поможет также как козе пятая нога, ибо в граммотно спроетированной программе вечные циклы невозможны
Хочу заметить, Господа что я прекрасно себе представляю, что [u]абсолютно все случаи несанкционированного использования кода программно обнаружить невозможно[/u] (а может есть MCU с аппаратной реализацией деления и защиты кода во FLASH?).


Простите пожалуйста О ВЕЛИКИЙ.
Мне надо ещё долго учиться правильности написания программ. А также правильности её организации.
Да вот ещё незадача - разработчики компилятора C IAR (а я по своей дурости его использую как и тысячи других ещё вами не просвещённых) в своих библиотеках тоже совершенно безграмотно пишут. Например при обращении к EEPROM. Безусловно надо всё переписать. Завтра же возьмусь. Правда придётся заказывать новые чипы, так как новый правильный код в старые увы не влезет.

Да и завтра же отпишусь на Atmel, Intel, Dallas, Philips, TI и прочие конторы, что для правильно написанной программы "Watchdog тут поможет также как козе пятая нога, ибо в граммотно спроетированной программе вечные циклы невозможны".

С уважением,
ваш почитатель.
Дон Амброзио
Цитата(SasaVitebsk @ Feb 12 2008, 02:11) *
Простите пожалуйста О ВЕЛИКИЙ.
Мне надо ещё долго учиться правильности написания программ. А также правильности её организации.
Да вот ещё незадача - разработчики компилятора C IAR (а я по своей дурости его использую как и тысячи других ещё вами не просвещённых) в своих библиотеках тоже совершенно безграмотно пишут. Например при обращении к EEPROM. Безусловно надо всё переписать. Завтра же возьмусь. Правда придётся заказывать новые чипы, так как новый правильный код в старые увы не влезет.

Да и завтра же отпишусь на Atmel, Intel, Dallas, Philips, TI и прочие конторы, что для правильно написанной программы "Watchdog тут поможет также как козе пятая нога, ибо в граммотно спроетированной программе вечные циклы невозможны".

С уважением,
ваш почитатель.

А Вы ещё ИАРу напишите, что у них неправильный ИАР...

А вообще "нЕчего на зеркало пенять коли рожа кривая"(с) Если Вы не хотите чуть-чуть больше подумать на стадии проектирования программы, то тут уже Вам не ИАР, не Atmel ни кто-либо ещё уже не поможет

Кстати, Господа!! Хочу заметить вот что:

1) Вы мне хорошо расписали необходимость применения WDT в простейшей программе типа СуперЛуп и даже объяснили, где лучше вставлять команду сброса WDT для этого случая... Но при этом ничего не сказали о специфике применения WDT для случая многопоточных приложений в вытесняющей RTOS
2) Что можно применить кроме WDT высказлся только Непомнящий Евгений, а что же остальные?

Цитата(SasaVitebsk @ Feb 12 2008, 02:11) *
Да и завтра же отпишусь на Atmel, Intel, Dallas, Philips, TI и прочие конторы, что для правильно написанной программы "Watchdog тут поможет также как козе пятая нога, ибо в граммотно спроетированной программе вечные циклы невозможны".

Да и ещё пожалуйтесь не то, что ихний Watchdog не помогает в случаях бездарного написания програмы
galjoen
Цитата(Дон Амброзио @ Feb 12 2008, 02:08) *
Какой ещё основной цикл в многозадачной многопоточной среде RTOS? И там стеков не один, а несколько...Причём как стеки PC, так и стеки данных

А я про RTOS ничего и не писал. Прочтите внимательно!
И отвечал не вам, Дон Амброзио, а SasaVitebsk - и у него в том посте даже слова такого не было "RTOS".

А насчёт вечных циклов - согласен. Не должно их быть. Кроме основного (ну это не про RTOS, я RTOS не употребляю). Счётчик какой-нибудь уменьшаемый д.б. Если он до 0 досчитает - из этого цикла аварийный выход. Только вот куда выходить? Бывает, что это основной вопрос! Вот в таких случаях я стек и анализирую. Еще CRC16 той области ОЗУ, где глобальные настройки записаны, проверяю. Когда глобальная настройка изменяется - я CRC16 этой области конечно пересчитываю (при запрещённых прерываниях).

А для счётчика хорошо пара регистров R24, R25 подходит. Адресоваться по ним как по X, Y или Z нельзя, а команду sbiw R24,xx - применять можно. Перед циклом, где зависание теоретически возможно я пишу:
Цитата
ldi R24,low(макс_кол-во_циклов)
ldi R25,high(макс_кол-во_циклов)

А в самом цикле:
Цитата
sbiw R24,1
breq Аварийный_выход

Думаю и на C что-то подобное написать не проблема. Но я C для AVR не применяю. Попробовал - понял, что перед ассемблером преимуществ не вижу, одни недостатки. Хотя программы до 40 кБайт(20 кСлов) для AVR писал.


А вообще, ВЕЛИКИЕ - хватит ссорится!
arttab
Средства должны оправдывать цели.
уровень защиты от сбоя накладывает расходы (время, более "крутой" мк и пр.) на проект. можно дойти и до дублирования мажоритарности и пр.
Абсолютную защиту не создать да и не всегда она нужна.
Если в случае сбоя мк будет остановлен с выводом кода ошибки, то будет видно что есть проблемы и можно попытаться выяснить какие, а автоперезапуск их скроет.
Или здесь обсуждаются чисто теоретические обоснования устойчивой работы изделия при сбои мк? Может тогда сформулировать необходимые меры для разной степени устойчивости изделия?
Дон Амброзио
Цитата(arttab @ Feb 12 2008, 04:45) *
Средства должны оправдывать цели.
уровень защиты от сбоя накладывает расходы (время, более "крутой" мк и пр.) на проект. можно дойти и до дублирования мажоритарности и пр.
Абсолютную защиту не создать да и не всегда она нужна.
Если в случае сбоя мк будет остановлен с выводом кода ошибки, то будет видно что есть проблемы и можно попытаться выяснить какие, а автоперезапуск их скроет.
Или здесь обсуждаются чисто теоретические обоснования устойчивой работы изделия при сбои мк? Может тогда сформулировать необходимые меры для разной степени устойчивости изделия?

Как Вы считаете, что более надёжно:

1) Вероятность сбоя устройства равна 10 в минус 9 степени; вероятность того, что этот сбой система не обнаружит (не зарегистрирует) и соотвтетственно не предпримит ни каких мер равна 50%
2) Вероятность сбоя устройства равна 10 в минус 3 степени; вероятность того, что этот сбой система не обнаружит (не зарегистрирует) и соотвтетственно не предпримит ни каких мер равна 0,0000001%

И что более надёжно? "Надёжная" система, сбои которой просто не обнаруживаются
или "ненадёжная" система, у которой 99,99999999% сбоев обнаруживаются и предпринимаются соответствующие меры по устранению их последствий


Как говорится: лучше перебдеть, чем недобдеть.

Ибо нафига мне "суперпупернадёжная" система, у которой происходит один сбой в год, но он НЕ ОБНАРУЖИВАЕТСЯ СИСТЕМОЙ. Я лучше возьму систему, у которой сбои происходят каждый день, ну у которой эти сбои НЕ ПРОХОДЯТ НЕЗАМЕЧЕННЫМИ СИСТЕМОЙ


Т.е. я предлагаю даже УХУДШАТЬ надёжность работы девайса за счёт увеличения вероятности обнаружения сбоя

Цитата(Дон Амброзио @ Feb 12 2008, 07:59) *
Т.е. я предлагаю даже УХУДШАТЬ надёжность работы девайса за счёт увеличения вероятности обнаружения сбоя
Но это я конечно погорячился, но если встанет такая дилема - я пойду на это


Цитата(arttab @ Feb 12 2008, 04:45) *
Если в случае сбоя мк будет остановлен с выводом кода ошибки, то будет видно что есть проблемы и можно попытаться выяснить какие, а автоперезапуск их скроет.
Вот вот.... Пусть и прочтут это сторонники идеи, что использование WDT достаточно для обеспечения надёжной работы программы
VladimirYU
Цитата(Дон Амброзио @ Feb 12 2008, 08:05) *
Ибо нафига мне "суперпупернадёжная" система, у которой происходит один сбой в год, но он НЕ ОБНАРУЖИВАЕТСЯ СИСТЕМОЙ. Я лучше возьму систему, у которой сбои происходят каждый день, ну у которой эти сбои НЕ ПРОХОДЯТ НЕЗАМЕЧЕННЫМИ СИСТЕМОЙ

Как Вы думаете, что лучше вовремя принятое лекарство и продолжение работы, или госпитализация с инфарктом и точный диагноз. Надежная система должна иметь возможности самовосстановления работоспособности в кратчайшее время, для этого WDT в комплексе с другими мерами, например, элементарное протоколирование работы программы в области __nо_init не требует значительных расходов. А о том, что программы надо писать правильно не вижу смысла обсуждать.
Дон Амброзио
Цитата(VladimirYU @ Feb 12 2008, 09:23) *
Как Вы думаете, что лучше вовремя принятое лекарство

Дык в описанных коллегами случаях ПРАВИЛЬНОГО лекарства и не будет поскольку диагноз не будет установлен
Непомнящий Евгений
ИМХО, стратегия поведения после обнаружения ошибки целиком зависит от назначения устройства. Иногда лучше молча перезагрузиться, иногда - сообщить об ошибке и остановить работу...
VladimirYU
Цитата(Непомнящий Евгений @ Feb 12 2008, 09:39) *
ИМХО, стратегия поведения после обнаружения ошибки целиком зависит от назначения устройства. Иногда лучше молча перезагрузиться, иногда - сообщить об ошибке и остановить работу...

+1
SasaVitebsk
Цитата(Дон Амброзио @ Feb 12 2008, 03:31) *
Да и ещё пожалуйтесь не то, что ихний Watchdog не помогает в случаях бездарного написания програмы


У меня есть изделие - модемы на пуле в телекоме. Так вот уже скоро 10 лет будет как они не выключаются. За это время три раза источники менял - кондёры высыхают. Предыдущие стояли - неделю отработать не могли.

Короче давайте спорить о вкусе устриц с теми кто их ел.

Перепиши пожалуйста мой бездарно написанный кусок проги из 10 строчек на одарённо написанный - хочу увидеть. Раз ты разглагольствуешь - должен же ты отвечачь за свои слова. Хотябы немного. Я думаю там совершенно понятен смысл.

Я жду.
Дон Амброзио
Цитата(SasaVitebsk @ Feb 12 2008, 11:41) *
У меня есть изделие - модемы на пуле в телекоме. Так вот уже скоро 10 лет будет как они не выключаются. За это время три раза источники менял - кондёры высыхают. Предыдущие стояли - неделю отработать не могли.

Короче давайте спорить о вкусе устриц с теми кто их ел.

Перепиши пожалуйста мой бездарно написанный кусок проги из 10 строчек на одарённо написанный - хочу увидеть. Раз ты разглагольствуешь - должен же ты отвечачь за свои слова. Хотябы немного. Я думаю там совершенно понятен смысл.

Я жду.



А Вы вообще кроме себя тут кого-нибудь читаете?
Цитата(galjoen @ Feb 12 2008, 03:33) *
....
А насчёт вечных циклов - согласен. Не должно их быть. Кроме основного (ну это не про RTOS, я RTOS не употребляю). Счётчик какой-нибудь уменьшаемый д.б. Если он до 0 досчитает - из этого цикла аварийный выход.

....
А для счётчика хорошо пара регистров R24, R25 подходит. Адресоваться по ним как по X, Y или Z нельзя, а команду sbiw R24,xx - применять можно.



Вот Вам ответ.. От себя лишь добавллю термин "счётчик-ограничитель количества итераций цикла" Вам о чём-нибудь говорит?
adc
Цитата(Дон Амброзио @ Feb 12 2008, 08:05) *
Цитата
Если в случае сбоя мк будет остановлен с выводом кода ошибки, то будет видно что есть проблемы и можно попытаться выяснить какие, а автоперезапуск их скроет.

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

Да будет Вам известно что для WDT в некоторых контроллерах есть отдельный вектор прерывания по переполнению WTD, который позволит проанализировать сбой не выводя программу на общий reset.
Дон Амброзио
Цитата(adc @ Feb 12 2008, 15:49) *
Вот вот.... Пусть и прочтут это сторонники идеи, что использование WDT достаточно для обеспечения надёжной работы программы

Да будет Вам известно что для WDT в некоторых контроллерах есть отдельный вектор прерывания по переполнению WTD, который позволит проанализировать сбой не выводя программу на общий reset.

Мне это хорошо известно.. Но я с такими пока не работал...

А что это у нас дискусиия зациклилась на обсуждении WDT? Тема то у нас гораздо шире.. Или просто никто больше не знает других методов "борьбы" с явлением, указанном в названии темы? 07.gif
Kris2007
А че такое бывает чтобы из-за электромагнитных помех грохнулся счетчик команд?
По моему это неудачные попытки нати существующую ошибку в коде. Не нашли списали на э.м помехи.

Импульсник на 3квт делали на атмеге. Там тАкие помехи идут и все ок. Я уж не говорю о других устройствах. Если некая помеха по питанию и на пине это еще понятно но случайная запись в PC ..
SasaVitebsk
Цитата(Дон Амброзио @ Feb 12 2008, 17:03) *
Мне это хорошо известно.. Но я с такими пока не работал...


А с какими ты работал? Сейчас практически все AVR "такие". Это когда-то на 1200 мне приходилось выкручиваться определяя источник.

Цитата
А что это у нас дискусиия зациклилась на обсуждении WDT? Тема то у нас гораздо шире.. Или просто никто больше не знает других методов "борьбы" с явлением, указанном в названии темы? 07.gif


Просто к моменту когда ты начал обдумывать свои "правильные" методики борьбы, человечество с этим уже работало и над этим думало не один десяток лет. И WDT оказался одним из самых эффективных методов борьбы с зависаниями и сбоями.

С чего ты взял, что я не ипользую таймауты к примеру? Потому, что ты не видишь счётчика бесконечных циклов? А вот такой вариант к примеру ты не встречал
Код
...
    lds    sek1,    s7; таймаут по S7
    ldi    tmess,    3; "NO CARRIER"
    ldi    wl,    CONNECTD
    rcall    oCTRL; Ловить "несущую"
...

Может я не просто ухожу из бесконечного цикла, но мне требуется ещё задавать максимальное ожидание и программировать вариант текстового сообщения при выходе?


А теперь ответь на простой вопрос, раз уж ты уходишь от переписывания моей процедуры.
1) Чем счётчик циклов лучше WDT?
И ещё пару. Данная процедура ждёт пока пойдёт сообщение от терминальной программы. Это сообщение может поступить, например через 40 минут.
2) Как настроить бесконечный цикл чтобы обеспечить данное требование? Или будем пересбрасывать работающую прогу?
Хорошо - упростим задачу. Например событие происходит через 3 минуты максимум. Допустим ты настроил на выход из бесконечного цикла на 4 минуты.
3) Нормально если у тебя устройство будет выходить из возможного виса через 5 минут?

Главное ответь на первый вопрос. Меня это очень интересует.
Дон Амброзио
Цитата(Kris2007 @ Feb 12 2008, 16:21) *
А че такое бывает чтобы из-за электромагнитных помех грохнулся счетчик команд?

Бывает, бывает. Молодой человек. Я написал тестовую прогу для ATmega8 которая представляет собой следующее:

.cseg
.org 0
;-----------------
.set Number = 0
;-----------------
Begin_Loop :
.set Number = Number +1
ldi R16 , Number
nop
...
nop
cpi R16 , Number
breq PC+0x02
rjmp Crash
;-----------------
.set Number = Number +1
ldi R16 , Number
nop
...
nop
cpi R16 , Number
breq PC+0x02
rjmp Crash
;-----------------
.set Number = Number +1
ldi R16 , Number
nop
...
nop
cpi R16 , Number
breq PC+0x02
rjmp Crash
;-----------------------
......
......
......
;-----------------
.set Number = Number +1
ldi R16 , Number
nop
...
nop
cpi R16 , Number
breq PC+0x02
rjmp Crash
;-----------------------
rjmp Begin_Loop
;-----------------------
Crash :

; Зажечь светодиод
...

; Остановиться
;------------------------
После подачи помехи в виде электромагнитной наводки от пьёзозажигалки мне удавалось как зажечь светодиод

Цитата(Kris2007 @ Feb 12 2008, 16:21) *
Импульсник на 3квт делали на атмеге. Там тАкие помехи идут и все ок. Я уж не говорю о других устройствах. Если некая помеха по питанию и на пине это еще понятно но случайная запись в PC ..

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

Цитата(SasaVitebsk @ Feb 12 2008, 16:36) *
А с какими ты работал? Сейчас практически все AVR "такие"

Не звизди.. twak.gif
"Все такие" говоришь? А как же ATmega 8, 8515, 8535, 64, 128..А?

Цитата(Дон Амброзио @ Feb 12 2008, 18:54) *
А как же ATmega 8, 8515, 8535, 64, 128..А?
В них по WDT происходит полноценный сброс, а не прерывание

Цитата(SasaVitebsk @ Feb 12 2008, 16:36) *
Просто к моменту когда ты начал обдумывать свои "правильные" методики борьбы, человечество с этим уже работало и над этим думало не один десяток лет. И WDT оказался одним из самых эффективных методов борьбы с зависаниями и сбоями.

Дык с зависаниями или сбоями? Вы уж определитесь.. Ибо понятие "сбой" гораздо шире понятия "зависание"

Цитата(SasaVitebsk @ Feb 12 2008, 16:36) *
раз уж ты уходишь от переписывания моей процедуры.

Странный ты.. Ну на тебе твою переделанную процедуру (хотя я же объяснял тебе выше как это сделать. Неужели для тебя это так сложно? 07.gif )

...
ldi R25 , high ( Border_Counter)
ldi R24 , low ( Border_Counter)
ReadLptEPP:
sbiw R25:R24 , 1
breq Crash
sbic pinc,LptSTB ; Строб пришёл?
rjmp ReadLptEPP ; иначе повторить
...
SasaVitebsk
Цитата(Дон Амброзио @ Feb 12 2008, 20:18) *
Не звизди.. twak.gif
"Все такие" говоришь? А как же ATmega 8, 8515, 8535, 64, 128..А?

В них по WDT происходит полноценный сброс, а не прерывание

Используйте m88, m165, m1281...

Цитата
Дык с зависаниями или сбоями? Вы уж определитесь.. Ибо понятие "сбой" гораздо шире понятия "зависание"

А что по вашему есть "зависание"?

Цитата
Странный ты.. Ну на тебе твою переделанную процедуру (хотя я же объяснял тебе выше как это сделать. Неужели для тебя это так сложно? 07.gif )

...
ldi R25 , high ( Border_Counter)
ldi R24 , low ( Border_Counter)
ReadLptEPP:
sbiw R25:R24 , 1
breq Crash
sbic pinc,LptSTB ; Строб пришёл?
rjmp ReadLptEPP ; иначе повторить
...

На частоте 14745600 максимальное время - 22мс. При 4-ёх байтном счётчике ~ 40 минут.
Итак вопрос чем ваш вариант лучше применения WDT? Не будем здесь обсуждать 1.5 кратное увеличение длины кода и прочие нюансы. Вчём прелесть? Я действительно хочу понять вашу мысль.

Дело в том, что некоторые применяют как раз противоположные подходы. К примеру, для перехода в 0 инициализируют WDT и делают цикл. Вот как раз отрывок из Atmel-овского avr231
Код
                        case TYPE_RESET:
                            busReplyByte(ERROR_OK);
                            for(;;);
Дон Амброзио
Цитата(SasaVitebsk @ Feb 12 2008, 20:00) *
К примеру, для перехода в 0 инициализируют WDT и делают цикл.

Это не для "перехода в 0" делается , а для перевода микроконтроллера в определённое исходное состояние, именуемого сбросом

Цитата(SasaVitebsk @ Feb 12 2008, 20:00) *
Используйте m88, m165, m1281...
Не я выбираю MCU: что мне дали, то я и юзаю ( я последнее время больше программером работаю, хотя я могу и платы разводить, и схемы проектировать). Мне дают готовый девайс и я пишу для него прогу

Цитата(SasaVitebsk @ Feb 12 2008, 20:00) *
А что по вашему есть "зависание"?
Вы точно не читаете то, что уже написано. Я же написал выше, что " понятие "сбой" гораздо шире понятия "зависание"". Из чего следует, что зависание - это частный случай сбоя и зависание далеко не исчерпывает все возможные виды сбоев
Rst7
Цитата
Не я выбираю MCU: что мне дали, то я и юзаю ( я последнее время больше программером работаю, хотя я могу и платы разводить, и схемы проектировать). Мне дают готовый девайс и я пишу для него прогу


Ну тогда Вы себе сами ногу простреливаете wink.gif Если не можете настоять на нужном камне при разработке железа, то будете всю жизнь мучаться smile.gif

Другое дело - бывают разработки, когда каждая копейка на счету, там будешь и экономить, и извращаться так, что мало не кажется. Но, я так понимаю, к Вам это не относится.
Дон Амброзио
Цитата(Rst7 @ Feb 12 2008, 21:23) *
Если не можете настоять на нужном камне при разработке железа, то будете всю жизнь мучаться smile.gif
Что значит мучиться? Вам что? Утюг на живот ставят чтоли? А я люблю помучиться. Не люблю простые задачи. Чем сложней задача, тем лучше я её решу, поскольку буду работать не спустя рукава, с леньцой, а с огоньком

Цитата(Rst7 @ Feb 12 2008, 21:23) *
Другое дело - бывают разработки, когда каждая копейка на счету, там будешь и экономить, и извращаться так, что мало не кажется.

Вот вот

Цитата(Rst7 @ Feb 12 2008, 21:23) *
Но, я так понимаю, к Вам это не относится.
Откуда такие выоды 07.gif


Цитата(Rst7 @ Feb 12 2008, 21:23) *
будете всю жизнь мучаться smile.gif

Чуть-чуть пошевелить мозгами для Вас мучение? 07.gif
Ну не знаю, не знаю.. А для меня в кайф когда проблема сложная
SasaVitebsk
Цитата(Дон Амброзио @ Feb 12 2008, 21:14) *
Вы точно не читаете то, что уже написано. Я же написал выше, что " понятие "сбой" гораздо шире понятия "зависание"". Из чего следует, что зависание - это частный случай сбоя и зависание далеко не исчерпывает все возможные виды сбоев


А что именно здесь читать? Вы считаете что вы ответили на вопрос? С моей точки зрения вы его обошли. Правда не удачно.

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

Видете как просто? По объёму написанного - столько же. Так почему просто не ответить на поставленный вопрос?

Далее - исходя из этого - WDT лучше помогает чем ваши ограничители. Какой в них смысл? Таймауты применяют при работе с внешним оборудованием, для того, чтобы диагностировать сбой в работе оного. Диагностировать, для того чтобы обработать ошибку определённым образом. Например если не получили ответа от rs485, посылаем повторный запрос, если произошёл сбой при работе с ЖКИ - сбрасываем и перерисовываем. Но если в результате "не ответа" нечего делать? Если уровень сбоя превышает возможности его обработки, в этом случае идёт полная перезагрузка процессора. И аппаратный аварийный рестарт - всегда был более лучшим средством чем программный.
Дон Амброзио
Цитата(SasaVitebsk @ Feb 12 2008, 22:16) *
Их (результатов) может быть всего два вида. Первый - вылет на сброс, второй - "зависание" (зацикливание).
Очень упрощённый взгляд на проблему. Результатом сбоя явлются либо материальный ущерб, либо (в худшем случае) человеческие жертвы


Цитата(SasaVitebsk @ Feb 12 2008, 22:16) *
Причём понятно, что проц не сразу туда попадает, а с момента сбоя - попадает в ближайший цикл, который не может пройти.

Видете как просто?

Такая простота хуже воровства и граничит с полной профессиональной некомпетентностью

Цитата(SasaVitebsk @ Feb 12 2008, 22:16) *
попадает в ближайший цикл, который не может пройти.
Да нет таких в нормальной продуманной программе. Сколько раз Вам повторять


Цитата(SasaVitebsk @ Feb 12 2008, 22:16) *
Таймауты применяют при работе с внешним оборудованием
А в многопоточных RTOS не применяется? У меня наприммер в моих программах работающих в среде моей же RTOS я контролирую до 50-ти таймаутов различных внешних и внутренних событий
SasaVitebsk
Цитата(Дон Амброзио @ Feb 12 2008, 23:56) *
Очень упрощённый взгляд на проблему. Результатом сбоя явлются либо материальный ущерб, либо (в худшем случае) человеческие жертвы
Такая простота хуже воровства и граничит с полной профессиональной некомпетентностью


Давайте также затронем проблему сбоев в свете глобального потепления, а также влияние этих сбоев на пищеварение человека в условиях весенного недостатка витаминов в организме. Тогда у форумчан будет более полное представление об этом сложном и многогранном поведении кремния.

Я, ввиду некомпетентности и неспособности в полной мере осознать размах вашей натуры, больше участвовать в сей дискуссии не буду.
Дон Амброзио
Цитата(SasaVitebsk @ Feb 13 2008, 00:34) *
Я, ввиду некомпетентности и неспособности в полной мере осознать размах вашей натуры, больше участвовать в сей дискуссии не буду.
Спасибо Вам большое...Я давно уже хотел Вам это предложить... Да стеснялся.. Боялся Вас обидеть... Я конечно благодарен Вам за ликбез по использованию WDT (о которой я разумеется за более чем 15 лет работы с MCU и понятия не имел).

P.S. Жаль только что дисскуссия в этой теме зациклилась вокруг WDT (я рассчитывал услышать чего-нибудь новенькое, а тут опять про WDT) и Вы сработали сейчас ватчдог таймером и вывели дисскуссию (я надеюсь) из этого цикла
arttab
хорошо что не подрались...

может для начала определить с какими сбоими в работе мк боремся и в серии или до.

например можно создать следующие темы:
- изменение PC внешним воздействием и как и нужно ли с этим бороться;
- сбой работы АЛУ .....;
- отказ АЛУ....;
- сбой чтения из flash;
- выход из строя ячеек flash.

и средства борьбы можно разделить на внешние (по отношению к мк и внутренние - программные и аппаратные).

вопрос интересный и важный
adc
Цитата(Дон Амброзио @ Feb 12 2008, 19:18) *
Странный ты.. Ну на тебе твою переделанную процедуру (хотя я же объяснял тебе выше как это сделать. Неужели для тебя это так сложно? 07.gif )
...
ldi R25 , high ( Border_Counter)
ldi R24 , low ( Border_Counter)
ReadLptEPP:
sbiw R25:R24 , 1
breq Crash
sbic pinc,LptSTB ; Строб пришёл?
rjmp ReadLptEPP ; иначе повторить
...

Всегда пишу именно так, но хочу заметить что попав в результате сбоя, к примеру, на метку ReadLptEPP (не загрузив константы в регистры) можно превысить допустимое значение ожидание со всеми вытекающими из этого последствиями.
Предпочитаю использовать WDT + обязательный выход из цикла по переполнению описанный Вами.
tyro
Цитата(Дон Амброзио @ Feb 12 2008, 08:05) *
1) Вероятность сбоя устройства равна 10 в минус 9 степени; вероятность того, что этот сбой система не обнаружит (не зарегистрирует) и соотвтетственно не предпримит ни каких мер равна 50%
2) Вероятность сбоя устройства равна 10 в минус 3 степени; вероятность того, что этот сбой система не обнаружит (не зарегистрирует) и соотвтетственно не предпримит ни каких мер равна 0,0000001%

И что более надёжно? "Надёжная" система, сбои которой просто не обнаруживаются
или "ненадёжная" система, у которой 99,99999999% сбоев обнаруживаются и предпринимаются соответствующие меры по устранению их последствий

Извините, что возможно немного не по теме. Обсуждается Защита секции кода во FLASH. Вероятность сбоя устройства равна 10 в минус 9 степени - это вероятность сбоя устройства из-за сбоя программы ? На каком интервале определена эта вероятность ( на выполнение одной команды, времени жизни всего устройства)? Сбой в программе отдельно взятого МК в системе приводит к 100% сбою системы ( это я к тому, что сначала рассматривалась программа, но вероятность ошибки в самой программе не рассматривается, долее говориться об устройстве а спрашивается о системе)?
Дон Амброзио
Цитата(adc @ Feb 13 2008, 09:12) *
Всегда пишу именно так, но хочу заметить что попав в результате сбоя, к примеру, на метку ReadLptEPP (не загрузив константы в регистры) можно превысить допустимое значение ожидание со всеми вытекающими из этого последствиями.

Согласен.. Просто я привык уже работать в среде мной же разработанной RTOS, где любой поток может быть вытеснен другим более высокоприоритетным потоком вообще говоря на случайное время. И как в этом случае Вы рассчитаете на сколько должен быть запрограммирован WDT? Поэтому в этом случае счётчик ограничитель количества итераций выглядит более предпочтитетельным. Тем более бывают задачи, где важно именно количество итерация цикла, а не время его выполнения


Цитата(adc @ Feb 13 2008, 09:12) *
Предпочитаю использовать WDT + обязательный выход из цикла по переполнению описанный Вами.

Хорошее решение.. Но только для программ не работающих в RTOS с вытесняющей многозадачностью.
Я же использую в многозадачной среде виртуальные таймеры и WDT, которые фактически являются обратными счётчиками CPU_Time потока. Т.е. у меня любой поток может посмотреть в любой момент своё CPU_Time - время, которое бы он выполнялся если бы он были один в системе. Фактически CPU_Time - это счётчик тактов выполнения кода потока. Отсюда можно делать следующее. Вы прикидываете сколько максимальное количество тактов будет выполняться поток от точки A до точки B. Инициализируете в точке A виртуальный WDT, а в точке B его реинициализируете новым значением. Если этот виртуальный WDT обнулиться до прихода CPU в точку B потока, то это сбой и система это отработает. Кроме максимального времени работы некоторого участка кода, которое контролируется виртуальным WDT. Я ещё контролирую минимальное.. Ведь если известно, например, что подсчёт CRC 256-ти байтного пакета не может быть меньше 547788 тактов (цифры взяты просто для иллюстрации примера) и мы попадаем на точку завершения подсчёта и видим, что этот участок кода выполнился за 10790 тактов - то ясно же что имеет место сбой....


Цитата(arttab @ Feb 13 2008, 05:02) *
хорошо что не подрались...

Да млин, всё-таки неприятно, когда человек не врубившись "что почём" начинает меня "мордой тыкать" в такую элементарщину, что создаётся впечатление, что либо человек меня принимает за полного ламера (и это с моим-то более чем 15-ти летним опытом разработчика девайсов на базе MCU) либо сам таковым и является

Цитата(arttab @ Feb 13 2008, 05:02) *
может для начала определить с какими сбоими в работе мк боремся ...

В этой теме я рассматриваю только один вид сбоев: несанкционированное выполнение код во FLASH, вызванное аппаратным сбоем.
Этот сбой проявляется в том, что осуществляется переход в запрещённую точку секции кода , либо в разрешённую, но тогда, когда условия для выполнения этой секции кода не наступили.

Среди основных причин этого сбоя можно назвать следующие:
1) Случайное изменение значение счётчика команд из-за помех
2) Случайное изменение содержимого в ячейке ОЗУ в области, где храниться таблица переходов
3) Случайное изменение ОЗУ стека или указателся стека, в результате чего после команд ret/reri мы "улетаем" не пойми куда


СЮДА Я НЕ ОТНОШУ те сбои в командах перехода, когда в программе содержиться ошибка, проявляющаяся в том, что при не которых наборах данных она вычисляет не верный адрес точки перехода

Цитата(Дон Амброзио @ Feb 13 2008, 12:21) *
В этой теме я рассматриваю только один вид сбоев: несанкционированное выполнение код во FLASH, вызванное аппаратным сбоем.
Этот сбой проявляется в том, что осуществляется переход в запрещённую точку секции кода , либо в разрешённую, но тогда, когда условия для выполнения этой секции кода не наступили.

Среди основных причин этого сбоя можно назвать следующие:
1) Случайное изменение значение счётчика команд из-за помех
2) Случайное изменение содержимого в ячейке ОЗУ в области, где храниться таблица переходов
3) Случайное изменение ОЗУ стека или указателся стека, в результате чего после команд ret/reri мы "улетаем" не пойми куда
СЮДА Я НЕ ОТНОШУ те сбои в командах перехода, когда в программе содержиться ошибка, проявляющаяся в том, что при не которых наборах данных она вычисляет не верный адрес точки перехода



Если сказать короче: здесь рассматривается сбой, проявлящийся в том, что происходит переход от одной точки программы к другой и этот переход не относиться к множеству всех возможных переходов, определённых на этапе разработки программы
Schtirlitz
Надо отделить мух от котлет. Ибо проблема надежности устройства не ограничивается только ПО микроконтроллера. Если у вас программные сбои происходят от разряда пьезозажигалки, то программа тут совершенно не причем- все проблемы решаются правильной трассировкой. Для этого и существуют испытания на ЭМС и разные группы жесткости устройств.

ИМХО для программиста достаточно встроенного WDT (правда некоторые спецы по надежности советуют использовать внешний) и грамотно написанной программы.

Вероятность отказа устройства 10 в минус 9 степени - это попахивает авиацией, резервированием и прочими усложнениями:-))
Для "гражданских" устройств 10 в минус 5 степени уже хорошо.
Дон Амброзио
Цитата(tyro @ Feb 13 2008, 10:56) *
Обсуждается Защита секции кода во FLASH. Вероятность сбоя устройства равна 10 в минус 9 степени - это вероятность сбоя устройства из-за сбоя программы ?
Вероятность сбоя устройства, явившегося причиной в сбое программы


Цитата(tyro @ Feb 13 2008, 10:56) *
Вероятность сбоя устройства равна 10 в минус 9 степени - это вероятность сбоя устройства из-за сбоя программы ? На каком интервале определена эта вероятность ( на выполнение одной команды, времени жизни всего устройства)?
Я же писал.. В течение года работы девайса.. А вообще Вы на цифры не обращайте - они взяты мной просто для иллюстрации моего примера


Цитата(tyro @ Feb 13 2008, 10:56) *
Сбой в программе отдельно взятого МК в системе приводит к 100% сбою системы
Согласен. Просто "система" в простейшем случае может состоять из одного МК и светодиода

Цитата(tyro @ Feb 13 2008, 10:56) *
это я к тому, что сначала рассматривалась программа, но вероятность ошибки в самой программе не рассматривается, долее говориться об устройстве а спрашивается о системе

Постепенно всё выясним.. Следите за темой

Цитата(Schtirlitz @ Feb 13 2008, 12:31) *
Вероятность отказа устройства 10 в минус 9 степени - это попахивает авиацией, резервированием и прочими усложнениями:-))
Для "гражданских" устройств 10 в минус 5 степени уже хорошо.

Повторю и для Вас: цифры взяты "от балды" просто для иллюстрации приведённого выше примера
adc
Цитата(Дон Амброзио @ Feb 13 2008, 12:26) *
В этой теме я рассматриваю только один вид сбоев: несанкционированное выполнение код во FLASH, вызванное аппаратным сбоем.
Этот сбой проявляется в том, что осуществляется переход в запрещённую точку секции кода , либо в разрешённую, но тогда, когда условия для выполнения этой секции кода не наступили.
Если сказать короче: здесь рассматривается сбой, проявлящийся в том, что происходит переход от одной точки программы к другой и этот переход не относиться к множеству всех возможных переходов, определённых на этапе разработки программы

Вы спрашивали почему тут все уперлись в WDT?. Объясняется это тем что это решение практически на уровни железа. Как можно программными методами отследить случайный переход на случайную точку программы? Даже если в программе большая часть функций направлена на контроль правильности выполнения кода, ни что не защитит программу от перехода на случайный адрес с последующим нарушением нормальной работы устройства.
Как мне кажется решение должно быть на уровне железа.. (внешние контролирующие устройства(тотже только внешний WDT), дублирующий контроллер(возможно выполняющий туже задачу) и т.п.) Это мое ИМХО.
galjoen
Цитата(adc @ Feb 13 2008, 09:12) *
Всегда пишу именно так, но хочу заметить что попав в результате сбоя, к примеру, на метку ReadLptEPP (не загрузив константы в регистры) можно превысить допустимое значение ожидание со всеми вытекающими из этого последствиями.
Предпочитаю использовать WDT + обязательный выход из цикла по переполнению описанный Вами.

В реальной задаче, я пишу это так:
Цитата
ldi R25 , high ( Border_Counter)
ldi R24 , low ( Border_Counter)
ReadLptEPP:
cpi R25, 1+high ( Border_Counter)
brcc Crash1
sbiw R25:R24 , 1
breq Crash2
sbic pinc,LptSTB ; Строб пришёл?
rjmp ReadLptEPP ; иначе повторить
...

В том посте я про cpi R25, 1+high ( Border_Counter) просто не упомянул. Можно конечно R25:R24 сравнивать с Border_Counter+1, но это уже не обязательно. А код и время добавляет.

А вообще все важные переменные (а к ним счётчики однозначно относятся) обязательно на диапазон проверяю. Это как минимум. Те переменные, которые редко меняются, храню в области ОЗУ защищённой CRC. Это CRC я при изменении переменной перерассчитываю (cli). А в основном цикле (не RTOS) по 1 байту за цикл их CRC считаю и потом сравниваю. А те переменные, которые часто меняются, их инверсией защищаю. Например переменная 4 байта, и её инверсия 4 байта. Когда пользуюсь - ксор с инверсией побайтно делаю, и на FF проверяю. Кстати у меня всегда два регистра из R2..R15 имеются, которые я один раз устанавливаю, и больше не меняю. Одим равный 0x00 (RG00), другой FF (RGFF). Так вот, чтоб переменную в регистры R16..R19 загрузить, пишу обычно так:
Цитата
ldi YL,low(VarXX)
ldi YH,high(VarXX)
ld R16,Y
ldd R20,Y+4
eor R20,R16
cpse R20,RGFF
rjmp Crash
ldd R17,Y+1
ldd R20,Y+5
eor R20,R17
cpse R20,RGFF
rjmp Crash
...

А ещё хочу сказать, что все ожидания более 0.05 мС, обязательно нужно в основной цикл (не RTOS) переносить!!! И если не готово - к другой задаче переходить. Там что-то ждётся - к следующей и т.д. Какие уж там 4 секунды ожидания!!!
Но если уж 4 секунды - где, в таком случае, в том цикле, который все дружно переписывали, столь любимая SasaVitebsk-ом, команда wdr???
Кстати с wdr у атмела глюки. В описании написано, что при WDP2=WDP1=WDP0=1 типовое значение при 3В 2200 мС, при 5В 2100 мС. В реальности: от 1500 до 1800 мС. Я из-за этого на две секунды засыпать не могу - собака будит раньше чем RTC.
Я теми AVR пользуюсь, у которых собака=сбросу. Но даже если у собаки свой вектор будет - что это изменит? Что в обработке запуска нельзя WDRF проверить? Конечно в стеке адрес, откуда собака сработала, будет (если стек не навернулся). Но это только на этапе отладки имеет значение. В реальном устройстве это ничего не даст - все программные глюки д.б. уже устранены.

Но вот узнали мы, что щас Crash, а дальше-то делать-то что? По идее надо лог записать, и хорошо-бы восстановиться с наименьшими потерями.

А у меня такой вопрос: кто нибудь здесь лог-ги пишет???
И куда пишите?

Я-то пишу в AT45DB642D. Потом их как файл из MassStorage читаю. Так вот заметил, что флешка по помехозащищённости похуже чем AVR будет! Если помеха не одиночная, а пачкой идёт - нифига мне в AT45DB642D записать без ошибок не удаётся. Как будто, кто-то рукой сеятеля FF там рассыпал. В смысле в буфере 1056 байт. Причем кол-во FF нарастает во времени. Те данные, которые я последними пишу почти не страдают. А первые все FF-ми покрыты. Хотя, конечно, последние данные - они самые важные.
Дон Амброзио
Цитата(Schtirlitz @ Feb 13 2008, 12:31) *
ИМХО для программиста достаточно встроенного WDT

Повторю и для Вас. Расскажите поподробней как использовать WDT в среде вытесняющей RTOS?
zltigo
Цитата(Дон Амброзио @ Feb 13 2008, 12:36) *
Постепенно всё выясним.. Следите за темой

Схоласты занимаются некоторыми "проблемами" гораздо дольше, нежели Вы c Вашим "более чем 15-ти летним опытом". "Проблемы" не решены. За темой следить не вижу ни малейшего смысла.
Дон Амброзио
Цитата(Schtirlitz @ Feb 13 2008, 12:31) *
Надо отделить мух от котлет. Ибо проблема надежности устройства не ограничивается только ПО микроконтроллера. Если у вас программные сбои происходят от разряда пьезозажигалки, то программа тут совершенно не причем- все проблемы решаются правильной трассировкой. Для этого и существуют испытания на ЭМС и разные группы жесткости устройств.

Я в курсе. Но повторю:
Как говорится: лучше перебдеть, чем недобдеть.

Ибо нафига мне "суперпупернадёжная" система, у которой происходит один сбой в год, но он НЕ ОБНАРУЖИВАЕТСЯ СИСТЕМОЙ. Я лучше возьму систему, у которой сбои происходят каждый день, ну у которой эти сбои НЕ ПРОХОДЯТ НЕЗАМЕЧЕННЫМИ СИСТЕМОЙ
Т.е. я предлагаю даже УХУДШАТЬ надёжность работы девайса если это позволит увеличить вероятность обнаружения всех сбоев
Dog Pawlowa
Цитата(zltigo @ Feb 13 2008, 13:42) *
За темой следить не вижу ни малейшего смысла.

А как модератор?
Чем раньше будет заткнут очередной фонтан доктора Туамосеца, тем плодотворнее будет форум.
Пусть он лучше на порнушных сайтах пишет.
Дон Амброзио
Цитата(adc @ Feb 13 2008, 12:39) *
Как можно программными методами отследить случайный переход на случайную точку программы?

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

Цитата(adc @ Feb 13 2008, 12:39) *
Даже если в программе большая часть функций направлена на контроль правильности выполнения кода, ни что не защитит программу от перехода на случайный адрес с последующим нарушением нормальной работы устройства.

Согласен, что программа от таких сбоев не защищает, но она может помочь в их обнаружении и оповещении о них.

Ибо нафига мне "суперпупернадёжная" система, у которой происходит один сбой в год, но он НЕ ОБНАРУЖИВАЕТСЯ СИСТЕМОЙ. Я лучше возьму систему, у которой сбои происходят каждый день, ну у которой эти сбои НЕ ПРОХОДЯТ НЕЗАМЕЧЕННЫМИ СИСТЕМОЙ


Цитата(adc @ Feb 13 2008, 12:39) *
Как мне кажется решение должно быть на уровне железа.. (внешние контролирующие устройства(тотже только внешний WDT), дублирующий контроллер(возможно выполняющий туже задачу) и т.п.) Это мое ИМХО.
Моё ИМХО такое же.. Но всё же лучше "соломки подстелить". Ибо лучше перебдеть, чем недобдеть


Цитата(zltigo @ Feb 13 2008, 12:42) *
За темой следить не вижу ни малейшего смысла.

А я никого и не заставляю читать эту тему или чтото писать в ней. Так же как оставляю за собой право НЕ ЧИТАТЬ и НЕ ОТВЕЧАТЬ в неинтересных мне темах
Schtirlitz
Цитата(Дон Амброзио @ Feb 13 2008, 12:44) *
Ибо нафига мне "суперпупернадёжная" система, у которой происходит один сбой в год, но он НЕ ОБНАРУЖИВАЕТСЯ СИСТЕМОЙ. Я лучше возьму систему, у которой сбои происходят каждый день, ну у которой эти сбои НЕ ПРОХОДЯТ НЕЗАМЕЧЕННЫМИ СИСТЕМОЙ
Т.е. я предлагаю даже УХУДШАТЬ надёжность работы девайса если это позволит увеличить вероятность обнаружения всех сбоев[/i]

А как быть с вероятностью сбоя программы обнаружения сбоев?
Не нужно изобретать велосипед: если нужна вероятность отказа устройства 10 в минус 9-й степени - применяйте резервирование, мажоритарные схемы итд.
zltigo
Цитата(Dog Pawlowa @ Feb 13 2008, 12:49) *
А как модератор?

А как Модератор - пусть пока обсуждают. Для неокрепших умов наивно предполагающих, что проблему
отсутствия нормального сквозного проектирования системы можно решить в конце цепочки программными "защитами" будет, наверное, небесполезно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.