Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Защита секция кода во FLASH в ATmega
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4, 5, 6
galjoen
Цитата(Rst7 @ Feb 17 2008, 14:07) *
И, тем не менее, если человеку очень захочется свалить такую систему - он ее свалит. Пример - ЧАЭС.

+1
Тут я-бы ещё про CRC (мой конёк) написал. ИМХО CRC прекрасно от случайных помех защищает. Против человека или вируса (за которым тот-же человек стоит) CRC бессильна!
Rst7
Цитата
Появилась возможность использовать более сложную дуракоустойчивую технику, свалить из штатных режимов работы оператор замучается. От действий оператора в непредсказанных аварийных режимах, естественно завист многое.


Оно то конечно, дай бог... Но, как сказал один кэп - "не асилит ваша система противостоять пьяному матросу с топором", люди ведь всегда способ найдут...

Цитата
Интересует.


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

Цитата
я претензии имею - ложно сработала задув газом и порошком полэтажа здания, где стояло мое оборудование


Бывает. Подмели порошочек и дальше работаем. У нас случай был один... Баллоны с порошком на уровнях снаружи одного здания стояли, система управления - в соседнем, расстояние 20 метров. Кабеля на пиропатроны по металлической эстакаде со здания на здание шли. В процессе пусконаладки подключили кабеля к пиропатронам, на другой стороне - висят в воздухе возле приборов, в клемники не вкручены. Вечером уехали с объекта, а ночью гроза, куда долбануло - хз, но 5 тонн порошка насыпало. Выстрелили все пиропатроны. Утром приехали - а там уже все чистенько, все хорошо... Так что и без микропроцессорной аппаратуры бывает стреляет, а тут говорят - вот PC слетает smile.gif)

Цитата
а стойка высотой под метра два с немерянной красы Windows GUI.


Это "Радий" видимо. У них там мозг под WinCE катается. Знаем таких. Самое смешное, что требования по АЭС они может и выполнили, а вот требования именно по пожарным делам - еле асилили сертификацию, захода с третьего. И то, нет у меня твердой уверенности, что третий заход был без "оказания материальной помощи" нужным людям...
zltigo
Цитата(Rst7 @ Feb 17 2008, 15:28) *
Оно то конечно, дай бог... Но, как сказал один кэп - "не асилит ваша система противостоять пьяному матросу с топором", люди ведь всегда способ найдут...

Меры против "пьяных матросов с топорами", "пьяных диспетчеров с ключами", "пьяных летчиков с самолетами", "и пьяных мотостелков в БМП" предпринимаются задолго до поступов к БЩУ и РЩУ.
На горизонте маячат кораблики, на ближлежайших горах зенитные батареи, вокруг ров с водой, немалое количество военизированной охраны регулярно устраивающей натурные тренировки. Здание энергоблока монолитом за один непрерывный процесс отлито из бетона. Железа тоже вбухано не меряно. Бетон качественный - не для строительства жилых домов - швейцарским ножем сколь-нибудь заметной царапины оставить не удалось. Топором - топром полагаю, можно, но только царапину.
Гермозона вообще сплошное железо.
В пределах Ядерного Острова человеческй фактор на контроле прохода сведен к минимуму, но на подходе к щитам управления техника несколько раз дублируется, но не заменяется, людьми. Сигнализация не только пожарная smile.gif, видеонаблюдение, прослушивание разговоров....
Цитата
Бывает. Подмели порошочек и дальше работаем.

Ага, подмели sad.gif. Стойки с оборудованием, вентиляторы, кондиционеры, мягкая мебель....
Цитата
Это "Радий" видимо.

Не в курсе - просто на БЩУ оборудование рядом стояло.
Цитата
а вот требования именно по пожарным делам...

По пожарным? Все как обычно - здоровые баллоны, манометры, толстые шланги под потолок, трубы и форсунки на потолке, насколько понимаю все достаточно стандартное.


Цитата(Rst7 @ Feb 17 2008, 15:28) *
У них там мозг под WinCE катается...

Под Win, естественно ставленным не из десктопного дистрибутива, у многих что катается. Рабочие места, пожалуй, даже все.
SasaVitebsk
Знаете что мне это напомнило?
"За революцию 1917 отдельное спасибо русским. Весь мир стал жить лучше." biggrin.gif
Перефразируя
"За Чернобль отдельное спасибо русским и украинцам, надёжность реакторов во всём мире значительно возросла."

Кстати техника там была не в ответе. Там её поотключали просто при испытании "на выбеге".
tyro
Обсуждение стало плодотворным, даже модератор втянулся, но, к сожалению, не совсем по теме.
Может кто-то из спецов подведет итог всем предложениям по защите кода с краткими комментариями конкретно по предложенным способам (кодам)? Так сказать ИТОГО в положительном балансе по (промежуточному?) результату обсуждения. мне кажется, что для простых смертных это было-бы полезно.
singlskv
Цитата(tyro @ Feb 17 2008, 18:20) *
Так сказать ИТОГО в положительном балансе по (промежуточному?) результату обсуждения.

Не претендуя на звание суперспеца, адепты проверки всего и вся так еще и не ответили на
часть моих вопросов, хотелось бы услышать например про защиту кода при использовании 32бит
команд....
Dog Pawlowa
Цитата(tyro @ Feb 17 2008, 19:20) *
Обсуждение стало плодотворным, даже модератор втянулся, но, к сожалению, не совсем по теме.
Может кто-то из спецов подведет итог всем предложениям по защите кода с краткими комментариями конкретно по предложенным способам (кодам)? Так сказать ИТОГО в положительном балансе по (промежуточному?) результату обсуждения. мне кажется, что для простых смертных это было-бы полезно.

Да в положительном балансе реплики модератора только и присутствуют smile.gif
Я бы сформулировал так - при наличии жестких требований к обнаружению сбоя проблема должна решаться комплексно, в первую очередь (на мой взгляд) на уровне архитектуры процессорного ядра.
WHALE
Цитата(Dog Pawlowa @ Feb 17 2008, 19:15) *
Я бы сформулировал так - при наличии жестких требований к обнаружению сбоя проблема должна решаться комплексно, в первую очередь (на мой взгляд) на уровне архитектуры процессорного ядра.

А в не жестких?Для обычных девайсов на чем-нить дешевом без всяких излишеств,зависон которых
не приведет к пожарам/взрывам,но которые тоже хочется как-нить защитить от слетов при ударах молнии,бросков питания и т.д?Я из треда пока уловил одну здравую мысль-сброс собаки делать в специальном самом низкоприоритетном потоке(я тупо сбрасывал до сих пор в системном таймере sad.gif ).
Rst7
Цитата(WHALE @ Feb 17 2008, 18:32) *
Я из треда пока уловил одну здравую мысль-сброс собаки делать в специальном самом низкоприоритетном потоке(я тупо сбрасывал до сих пор в системном таймере :( ).

Рекомендую задуматься вот о чем еще, в догонку - использование двух собак, внутренней и отдельной внешней, которая контролирует активность (правильную) на какой либо лапке камня. Такое решение применено в сименсовских мобильниках.
WHALE
такое решение применено еще в советской аппаратуре 80-х годов на 580вм80-внешний 555 таймер,выход которого сидит на сбросе проца и сбрасываемый портом процессора.Проверено-при бросках питания виснет очень даже хорошо.
zltigo
Цитата(Rst7 @ Feb 17 2008, 20:20) *
Такое решение применено в сименсовских мобильниках.

Вы глубоко знаете софт сименсовских мобильников? Думаю, что там просто внутренний совсем не используется, ибо использование простых, дубовых внешних ресетчиков и собак потенциально более надежно и независимо от проблем возникающих на кристале. Особенно,это касается собак зависимых от тактовых генератров.
WHALE
ну в AVR собака тоже от отдельного генератора тактируется.
Rst7
Цитата(zltigo @ Feb 17 2008, 20:03) *
Вы глубоко знаете софт сименсовских мобильников? Думаю, что там просто внутренний совсем не используется


Да, знаю. Используются оба. В разных задачах сбрасываются. Тот, который внешний, требует сброса с определенным интервалом, не быстрее, не медленнее определенных ворот. Такого плана WDT, кстати, в XMega. Для SL45 (ядро C166) и S75 (ядро ARM9) могу завтра код продемонстрировать соответствующий (есть просто .idb, хорошо мною разобранные), у любого другого в течении часа по отладочной печати найду.
zltigo
Цитата(Rst7 @ Feb 17 2008, 22:07) *
..могу завтра код продемонстрировать соответствующий..

Да нет, я верю.
Цитата
Тот, который внешний, требует сброса с определенным интервалом, не быстрее, не медленнее определенных ворот.

На то он и внешний, дабы быть продвинутым.
SasaVitebsk
Цитата(WHALE @ Feb 17 2008, 20:32) *
А в не жестких?Для обычных девайсов на чем-нить дешевом без всяких излишеств,зависон которых
не приведет к пожарам/взрывам,но которые тоже хочется как-нить защитить от слетов при ударах молнии,бросков питания и т.д?Я из треда пока уловил одну здравую мысль-сброс собаки делать в специальном самом низкоприоритетном потоке(я тупо сбрасывал до сих пор в системном таймере sad.gif ).


А в нежёстких - продуманный алгоритм + WDT. Ничего другого пока не придумали.
И посмотри там один из первых моих постов, - я там по пунктам. Там я уже говорю, что сброс в прерывании (без ОС) равно как и сброс в сист. таймере - некоректный подход (равно как и тупое вставляние WDR во все циклы). Так как в Вашем случае могут загинуть все процессы, а таймер будет весело щёлкать. То же самое с циклами, - по сбою вы попадаете в цикл где весело щёлкаете WDR и глухо висите.

Чтобы этого не происходило число WDR должно быть минимальным, период - подобран, в цикле где стоит WDR должен осуществляться контроль важнейших параметров режима работы программы. (В вашем случае - специальный низкоприоритетный процесс). К числу параметров - разрешение прерывания, наличие работы всех процессов), возможные другие.
WHALE
Cпасибо,Саша.
А на практике все таки,как убедиться,что все процессы живы,а не
весело щёлкаете WDR и глухо висите
AHTOXA
Цитата(WHALE @ Feb 18 2008, 02:13) *
А на практике все таки,как убедиться,что все процессы живы,а не
весело щёлкаете WDR и глухо висите


Например, завести набор флажков. При WDR сбрасывать. А в каждом критичном месте программы - взводить свой флажок. При очередном сбросе WDR - проверить, все ли флажки взведены. Если не все, то висим.
Можно усложнить, ждать взвода флажков несколько циклов.
WHALE
Цитата(AHTOXA @ Feb 18 2008, 00:21) *
Например, завести набор флажков. При WDR сбрасывать. А в каждом критичном месте программы - взводить свой флажок. При очередном сбросе WDR - проверить, все ли флажки взведены. Если не все, то висим.
Можно усложнить, ждать взвода флажков несколько циклов.

Спасибо,что-то такое я и представлял.А если пара-тройка задач асинхронные и главное требуют обслуживания с периодом больше периода срабатывания собаки?
singlskv
Цитата(WHALE @ Feb 18 2008, 00:13) *
А на практике все таки,как убедиться,что все процессы живы,а не
весело щёлкаете WDR и глухо висите
а на практике, делаем примерно так:
при загрузке определяем источник ресета, если было не от power on , то регестрируем ошибку.,
делаем заглушки на все незадействованные прерывния(если есть связь с верхом то предаем это на верх ), запускаем автомат контроля использования стека/рам, запускаем автомат контроля
использования текущего размера системного тика....

дальше просто работаем, и что удивительно, все контролируем...
AHTOXA
Цитата(WHALE @ Feb 18 2008, 02:27) *
Спасибо,что-то такое я и представлял.А если пара-тройка задач асинхронные и главное требуют обслуживания с периодом больше периода срабатывания собаки?


Тогда флажка не хватит, нужен счётчик. При получении флажка от такой задачи счётчик сбрасываем. При неполучении - увеличиваем. Когда значение счётчика превысит порог - висим.
Dog Pawlowa
Цитата(WHALE @ Feb 17 2008, 20:32) *
А в не жестких?Для обычных девайсов на чем-нить дешевом без всяких излишеств,зависон которых
не приведет к пожарам/взрывам,но которые тоже хочется как-нить защитить от слетов при ударах молнии,бросков питания и т.д?Я из треда пока уловил одну здравую мысль-сброс собаки делать в специальном самом низкоприоритетном потоке(я тупо сбрасывал до сих пор в системном таймере sad.gif ).

Ну, недостаток сброса в системном таймере неоднократно обсуждался (например, получение команды HALT. Не знаю правда, есть ли она в AVR smile.gif - уже привито ). Я обычно использую достаточный минимум - в системном прерывании взводится флаг, в основном кольце по этому флагу непосредственно сбрасывается WDT.

Вообще-то я хотел написать, что для обычных дивайсов следует идти не от умозрительных заключений об успешной или неуспешной ловле сбойных состояний, а стандартном тестировании приборов по стандартным методикам. Если доктор прав, и вероятность сбоя в нормальных условиях десять в минус восьмой, то программными извращениями можно ее улучшить на порядок или ухудшить на порядок - и при этом ничего не почувствовать. "Опыт - критерий истины". Все удары молнии, броски по питанию и прочие неприятности давно уже стандартизованы. Протестили - и вперед.
А программирование - никакое это не искусство, и это такое среднее ремесло, давно уже привлекающее только тех, кто больше ничего делать не умеет. На этой высокой ноте разрешите пойти спать. sleep.gif


Цитата(singlskv @ Feb 18 2008, 01:42) *
при загрузке определяем источник ресета, если было не от power on , то регестрируем ошибку.,

Зачем же? На практике можно продолжить работу - подумаешь, сброс прошел?
Работать! Вернуться на то же место. Не под ОС, конечно smile.gif
singlskv
Цитата(Dog Pawlowa @ Feb 18 2008, 01:05) *
Зачем же? На практике можно продолжить работу - подумаешь, сброс прошел?
Работать! Вернуться на то же место. Не под ОС, конечно smile.gif
Дык, конкретно здесь, только для того что бы знать что оно было,
если в рамках поставленной задачи нам пофиг, было или нет, мы можем просто проигнорировать....
а если не пофиг, можем и запомнить....что был сбой ....
Дон Амброзио
Цитата(bill_vs @ Feb 16 2008, 18:56) *
Подскажите, пожалуйста, как Вы определили, что сбился PC, а не R16?

Согласен...Мог и R16 сбитцо..Мог и SREG_Z... Была ещё такая тестовая прога:

; Зажечь светодиод
ldi R16 , 0b11011111
out PortC , R16
;------------------
Loop:
cli
wdr
rjmp Loop
;---------------
Crash:
; Погасить светодиод
ldi R16 , 0b11111111
out PortC , R16
rjmp Loop
;---------------------------
rjmp Crash
rjmp Crash
rjmp Crash
rjmp Crash
.....
rjmp Crash
rjmp Crash
rjmp Crash
rjmp Crash
;------------------------------



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

Цитата(Baser @ Feb 16 2008, 21:08) *
Да какое потребителю дело, какое количество сбоев происходит в купленной им системе и какое количество сбоев система фиксирует.

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

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

Цитата(Baser @ Feb 16 2008, 21:08) *
А обеспечить отсутствие последствий сбоев чисто программными методами невозможно.

Ещё один мне "Америку открывает" twak.gif Повторяетесь , Господа.. По кругу уже начинаем топтаться.

Повторяю для "не четателей а писателей": я ниразу не отрицал необходимости впервую очередь аппаратных решений для обеспечения надёжности


Цитата(Baser @ Feb 16 2008, 21:08) *
Взрослый человек утверждает, что применяет десятки различных методов программных защит, хранит несколько копий прошивки во флеш и т.д. и т.п.
Напрашивается вывод: судя по всему, вам платят по часам, а не по конечному продукту и никто не ограничивает вас во времени разработки.

А Вам за что платят деньги? За то, что Вы штампуете посредственные программы? Зато быстро?
А что? Для Вас очень затруднительно написать прогу с обнаружением и разруливанием сбоев? Тогда я вообще не понимаю за что Вам платят деньги

Цитата(Baser @ Feb 16 2008, 21:08) *
От реалий рынка все это крайне далеко.

А реалии рынка - эта гнать вал? Т.е. не нормальные программы, а, простите, посредственное фуфло? И что? Есть люди, которые за это фуфло ещё готовы платить деньги?


Цитата(Baser @ Feb 16 2008, 21:08) *
Иначе писать программы за реальное время по вашим методам просто невозможно.

....
Все же остальное, это, как я уже писал, или искусство ради искусства, или что-то, напоминающее маниакальную фобию.

Если для Вас это всё слишком сложно, то почему Вы вообще работаете в области эмбедерства? Может лучше носками торговать?

Цитата(arttab @ Feb 16 2008, 21:36) *
и если что то сбойнет с последствиями, то Вы долго будите колотить себя пяткой в грудь, что это было внешнее воздействие, плохое заземление, слабая защита от грозы и помехи по питанию.

Вот поэтому я "соломки подстелю" в виде спец. организации проги, чтобы сбои были по максимуму обнаружены и устранены их отрицательные последствия... Ибо какой бы у Вас супернадёжный девайс не был, лучше перебдеть, чем недобдеть. Да, "программные методы" не дают 100% гарантии обнаружения сбоя. А из-за 99,99% Вы и "мараться не будете"?

Цитата(Dog Pawlowa @ Feb 18 2008, 01:05) *
Зачем же? На практике можно продолжить работу - подумаешь, сброс прошел?

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

Цитата(singlskv @ Feb 17 2008, 19:06) *
адепты проверки всего и вся так еще и не ответили на часть моих вопросов, хотелось бы услышать например про защиту кода при использовании 32бит команд....

А если подумать? Или Вы задаёте этот вопрос, просто чтоб продемонстрировать, что "против лома нет приёма"?. И что? Да..Это действительно тот случай, когда "против лома нет приёма".. Я же Вам уже говорил..И не один раз.. Что программа не может обнаружить 100% всех возможных сбоев.. Тогда к чему Ваш вопрос?

Цитата(Дон Амброзио @ Feb 18 2008, 02:30) *
Или Вы задаёте этот вопрос, просто чтоб продемонстрировать, что "против лома нет приёма"?. И что? Да..Это действительно тот случай, когда "против лома нет приёма".. Я же Вам уже говорил..И не один раз.. Что программа не может обнаружить 100% всех возможных сбоев.. Тогда к чему Ваш вопрос?

Вот например Вы если будете знать, что Вам 100% на голову свалиться или плита или кирпич. От кирпича Вас может спасти каска, а от плиты..уж извините...Ничего не поможет... И что? Вы даже каску не оденете следуя Вашей логике, которую Вы тут всем пытаетесь навязать.. Да?
Baser
Цитата(Дон Амброзио @ Feb 18 2008, 01:30) *
А Вам за что платят деньги? За то, что Вы штампуете посредственные программы? Зато быстро?
Вы удивительно догадливы, именно за это smile.gif За одним мааааленьким исключением: пока еще никто на качество моей работы не жаловался. А вот на скорость - да, бывает rolleyes.gif говорят, нужно быстрее.

Цитата
А что? Для Вас очень затруднительно написать прогу с обнаружением и разруливанием сбоев? Тогда я вообще не понимаю за что Вам платят деньги
См. выше

Цитата
Если для Вас это всё слишком сложно, то почему Вы вообще работаете в области эмбедерства? Может лучше носками торговать?
Да вот, виноват laughing.gif мозгами вышел, скучно мне носки продавать.

Лааадно! Пора спать biggrin.gif
defunct
Цитата(_Pasha @ Feb 17 2008, 10:58) *
для чего сваять простенькую модель:
Код
while(1)
{
  _IJMP(random(0xffff));// *)
}


Методика:
1. забили весь флеш, чтобы 0xFF было минимум.
2. Запомнили CRC
3. ставим эту байду на несколько часов
4. Отвечаем 2 defunct smile.gif

ВОПРОС О СОСТОЯТЕЛЬНОСТИ МОДЕЛИ:
покакит ли это все с псевдослучайными числами с нормальным распределением?
Очень жду комментариев.

Не покатит. После первого же IJMP, возврата в while(1) не будет, а к сожалению генератор псевдо-случайных чисел будет давать всегда одно и то же число, с высокой долей вероятности - безопасное.

Поэтому модель лучше сделать такой:
1. random'ом или перебором заполнять регистры.
2. делать ICALL внутрь функции в которой выполняется SPM

Результат могу сразу сказать - рано или поздно - свалится smile.gif
Дон Амброзио
Цитата(defunct @ Feb 18 2008, 04:49) *
Поэтому модель лучше сделать такой:
1. random'ом или перебором заполнять регистры.
2. делать ICALL внутрь функции в которой выполняется SPM

Результат могу сразу сказать - рано или поздно - свалится smile.gif

Была ещё такая тестовая прога:

; Зажечь светодиод
ldi R16 , 0b11011111
out PortC , R16
;------------------
Loop:
cli
wdr
rjmp Loop
;---------------
Crash:
; Погасить светодиод
ldi R16 , 0b11111111
out PortC , R16
rjmp Crash
;---------------------------
rjmp Crash
rjmp Crash
rjmp Crash
rjmp Crash
.....
rjmp Crash
rjmp Crash
rjmp Crash
rjmp Crash
;------------------------------


Максимум на 10 "трыке" пьзозажигалки светодиод гас. Если "удачно" подключить к корпусу девайса проводок, идущий от "земли" пьезозажигалки и "удачно" приложить точку приложения искры.


Вот и говорите после этого, что порча PC маловероятна 08.gif
_Pasha
Цитата(defunct @ Feb 18 2008, 04:49) *
Поэтому модель лучше сделать такой:
1. random'ом или перебором заполнять регистры.
2. делать ICALL внутрь функции в которой выполняется SPM

Результат могу сразу сказать - рано или поздно - свалится smile.gif

Спасибо, уже дошло.
Остановлюсь на чуть исправленном
варианте

А еще интересно, как это Доктор так лихо чиркает пьезоспичкой, что у него все стабильно сбивается.
Вчера вечером чиркал-чиркал -- все нормально.
Доктор, Вы случаем эти киловольты на корпус не наводите ?
Блин, пока писал, Доктор уже сам ответил.
Так вот, когда нормы ESD sensitivity нарушаются, то к чему камлания?
Явно же ж кто-то виноват. А подвиг одного, как известно, - это преступление другого.
И что самое печальное - паранойя не только профессиональная болезнь, она еще и заразная.
_Sam_
Цитата
Была ещё такая тестовая прога:

По проге:
1 .А вы там случаем DDRC не забыли проинициализировать?
2. И ещё зачем там в цикле CLI? Понятно было бы перед циклом, но в цикле не очень понятно. Это тоже с каким то тестированием связано?

Просто эти мелочи позволяют соменению закрасться.

По поводу защиты от "случайных" jump:
Допустим наша программа состоит из блоков Check - это всяческие проверки о которых тут писалось и блока Run - в этом блоке выставляются управляющие сигналы, действия которых нельзя отменить(ну к примеру "Пуск ракеты" это всё конечно утрировано).
В итоге получим
Код
    if(Check){
        Run
    }

В результате случайного джампа мы попали в Run....

Конструкция
Код
    if(Check){
        Run
        if(!Check)
            отменить Run
    }

не покатит в силу специфики применения. Т.е. в этом случае задача всё таки нерешаемая или я не прав?

Конечно если программа будет на 99,(9) % состоять из Check, а оставшаяся часть будет Run всё равно будет ненулевая вероятность пуска ракеты.

P.S.
Дон Аброзио, если не составит большого труда и это не является большим секретом могли бы показать стандартную обвязку вашего MCU(цепи питания, резета, развязка входов выходов)? Eстесно готовые схемы не надо. Просто в общем виде типа как в апп ноте рисуют. А то получается вы всегда приводите программу без схемы и говорите что сбоит программа, а может дело то и не в бобине.
Дон Амброзио
Цитата(Дон Амброзио @ Feb 18 2008, 10:22) *
Была ещё такая тестовая прога ...

На основании этх тестов я понял, что всё же лучше попытаться обнаруживать в программе эти случайные джампы. После этого я решил проверить "а как же с ОЗУ? Оно не портиться?" И модифицировал прогу так, что она у меня непрерывно совершала тест ОЗУ. "А как же порча ячеек FLASH?" - подумал я. Короче, сделал и непрерывный тест флэшь. Короче у меня крутились 2 потока и ядро RTOS. Один поток непрерывно тестил ОЗУ, другой флэшь. И плюс оба потока были "сконструированы" так, что обнаруживали (разумеетцо не со 100% вероятностью) случайные дампы.

Выяснилось, что:
а) Чаще всего проц вываливался на обработчик случайного джампа
б) Потом на обработчик порчи ОЗУ
в) На обработчик порчи флэша (после проверки флэщи программатором выяснялось, что на самом деле флэшь не портилась, а переход на обработчик вызывался порчей ОЗУ во время теста флэшь)


Хотя конечно нельзя утверждать со 100%-й уверенностью, что переход на соотвествующий обработчик сбоя был вызван соответствующей ему причиной. Например переход на обработчик порчи ОЗУ запросто мог быть вызван случайным джампом. Хоть это и менее вероятно (за счёт того, что у меня программа организована специальным образом + некоторые аксиомы по вероятности, которыми я руководствовался), но исключить такую вероятность нельзя

Цитата(_Pasha @ Feb 18 2008, 10:26) *
Так вот, когда нормы ESD sensitivity нарушаются, то к чему камлания?

А что? Реальные помехи просто обязаны подчиняться нормам ESD 01.gif А то их в тюрьму посадят если они нарушат нормы ESD? lol.gif



Цитата(_Sam_ @ Feb 18 2008, 10:32) *
По проге:
1 .А вы там случаем DDRC не забыли проинициализировать?

Не забыл.. Иначе бы светодиод не зажёгся... Кстати , да... Погасание светодиода в конкретно этой программе могло быть вызвано и случайным изменением PortC, ddrC... А вообще у меня была куча различных тестовых программ (всех вариантов и не упомнишь) . Поэтому я в своих примерах на форуме пишу только часть кода, из которой можно понять основную идею теста


Цитата(_Sam_ @ Feb 18 2008, 10:32) *
2. И ещё зачем там в цикле CLI? Понятно было бы перед циклом, но в цикле не очень понятно. Это тоже с каким то тестированием связано?

Просто эти мелочи позволяют соменению закрасться.

Может это и паранойа (как некоторые выражаются) но для надёжности. Я всегда так пишу когда мне нужен гарантированный программный СТОП. И написать однц 1-тактовую команду меня не сильно затрудняет. Так же как процессор не сильно затрудняет её выполнить

Цитата(_Sam_ @ Feb 18 2008, 10:32) *
По поводу защиты от "случайных" jump:
Допустим наша программа состоит из блоков Check - это всяческие проверки о которых тут писалось и блока Run - в этом блоке выставляются управляющие сигналы, действия которых нельзя отменить(ну к примеру "Пуск ракеты" это всё конечно утрировано).
В итоге получим
Код
    if(Check){
        Run
    }

В результате случайного джампа мы попали в Run....

Конструкция
Код
    if(Check){
        Run
        if(!Check)
            отменить Run
    }

не покатит в силу специфики применения. Т.е. в этом случае задача всё таки нерешаемая или я не прав?

Конечно если программа будет на 99,(9) % состоять из Check, а оставшаяся часть будет Run всё равно будет ненулевая вероятность пуска ракеты.

А если подумать?
У меня "запуск ракеты" от одной команды невозможен. Ибо у меня железо выполено таким образом, что релюшка, запускающая "ядерную ракету" ( biggrin.gif ) включается как минимум 2-мя пинами, сигналы на которых устанавливаются в разных точках программы. Так что даже если на один из пинов в результате сбоя будет подан сигнал "Enable RUN", то на другом-то пине такого сигнала не будет. И Америку не придётся с карты стирать ластиком lol.gif
_Pasha
Цитата(Дон Амброзио @ Feb 18 2008, 10:59) *
А что? Реальные помехи просто обязаны подчиняться нормам ESD 01.gif А то их в тюрьму посадят если они нарушат нормы ESD? lol.gif
************************************
У меня "запуск ракеты" от одной команды невозможен.


1. На реальные помехи - реальная экранировка подсобного хозяйства и реальные техусловия
2. Пример решения на уровне архитектуры: см. MC68HC908MR08(freescale) понятие "WRITE-ONCE REGISTER"
Rst7
Цитата
А что? Реальные помехи просто обязаны подчиняться нормам ESD А то их в тюрьму посадят если они нарушат нормы ESD?


Нормы эти, как и пайка солдатская, выработаны годами изучения вопроса. С достаточной степенью точности они описывают реальный мир. Кроме того, испытания в соответствии с данными нормами (испытания должны быть проведены соответствующей структурой, на соответствующем оборудовании, закончены выдачей соответствующих документов, подтверждающих соответствие) дают Вам полное право при наезде на Вас плана "у Вас устройство глючит из-за помех" замерить эти помехи непосредственно на объекте и при превышении просто послать заказчика на йух или, например, снять с него дополнительные деньги за доработку устройства под условия заказчика. Обычно заказчики идут на второй вариант, им спокойней.

Но хотел я не то сказать. Я уже писал про полсотни резисторов выше, видимо никто не прочитал пост. Хочу поставить вопрос так - на плате есть камень с надежностью, ну, 1e-5 и 50 резисторов с надежностью 1e-6 (это близкие к реальности цифры). Возникают 3 вопроса:
1. Какова общая надежность?
2. Что будет с результирующей надежностью, если надежность камня будет 1e-7 (например, программными методами)
3. (Задается после получения ответов на вопросы 1, 2) Стоит ли овчинка выделки?
_Sam_
Цитата
А если подумать?

Ведь PC не из особого теста леплен и если он сбивается, то сбиваются и все остальные регистры.

А если у нас без случайного джампа на Run произошло изменение DDRC и PORTC таким образом, что эти два сигнала выставвились. Ластик в руки и вперёдsmile.gif Конечно тут пора вспомнить, что мы не говорим о 100% ловле сбоев и говорим только о случайных джампах wink.gif Но тут та собака и порыта:
1. Во многих применениях интересна 100% работа без сбоев, а сбоящие поделки быстро потеряют долю рынка.
2. Вероятность того что в случае помехи сбойнул только PC близка к нулю. А значит тема о случайных джампах бессмыслена.


p.s.
1. Про корпус это сильно, если на реальном объекте на корпус фазу подать или не заземлить, то будет уже не до вашей программы, если она конечно не ракеты пускаетsmile.gif. А если она ракеты пускает, то такая ситуация с корпусом невозможна ибо думаю тама проверок на эту тему тьма.
2. Если резет оставить в воздухе и вашу тестовую программу загрузить в MCU, то зажигалку и на корпус вешать не прийдётсяsmile.gif Вот где поле непаханное светодиод будет то зажигаться, то гаснуть.

Ну про 100% эт я погорячился - ничто не вечно под луной, но думаю понятно что я имел ввидуsmile.gif
Дон Амброзио
Цитата(Rst7 @ Feb 18 2008, 11:12) *
С достаточной степенью точности они описывают реальный мир.

Вот вот. Но эта точность - не 100%. Поэтому всегда сущестует вероятность ситуации, которая "бывает и хуже....Но реже lol.gif ."...Т.е. проскочит например такая помеха раз в месяц. Ваш девайс глюканет и запустит "ядерную ракету". А Вы придёте измерять помеху. Неделю произмеряете и ничего не найдёте. А наследующий день бах. Опять такая помеха. Поэтому я не понимаю, почему многие из ответивших здесь на форуме так упорно сопротивляются против того, чтобы добавить надёжности девайсу (надёжности в смысле не предотвращения сбоев, а их своевременного обнаружения и устранения). Упираются ногами, руками, рогами и прочими частями тела. Почему?

Цитата(_Sam_ @ Feb 18 2008, 11:27) *
Ведь PC не из особого теста леплен и если он сбивается, то сбиваются и все остальные регистры.

А если у нас без случайного джампа на Run произошло изменение DDRC и PORTC таким образом, что эти два сигнала выставвились. Ластик в руки и вперёдsmile.gif

Писал же уже 07.gif Вы не четатиль, чтоли? 07.gif

"А если подумать?
У меня "запуск ракеты" от одной команды невозможен. Ибо у меня железо выполено таким образом, что релюшка, запускающая "ядерную ракету" ( ) включается как минимум 2-мя пинами, сигналы на которых устанавливаются в разных точках программы. Так что даже если на один из пинов в результате сбоя будет подан сигнал "Enable RUN", то на другом-то пине такого сигнала не будет. И Америку не придётся с карты стирать ластиком "


Цитата(Rst7 @ Feb 18 2008, 11:12) *
Стоит ли овчинка выделки?

Зачем спрашивать если Вы заранее знаете какой будет ответ при такой формулировке задачи? 07.gif
Нет. Не стоит.

Но тут есть один нюанс. Что Вы понимаете под надёжностью MCU. Если вероятность выхода из строя какого-то его аппаратного узла, то это одно. А если вероятность сбоя из-за помех - это другое

Цитата(_Sam_ @ Feb 18 2008, 11:27) *
А если у нас без случайного джампа на Run произошло изменение DDRC и PORTC таким образом, что эти два сигнала выставвились.

Дык с точки зрения теории вероятности вероятность любого мыслимого события больше нуля. Весь вопрос в том, насколько больше
Rst7
Цитата
Но тут есть один нюанс. Что Вы понимаете под надёжностью MCU. Если вероятность выхода из строя какого-то его аппаратного узла, то это одно. А если вероятность сбоя из-за помех - это другое


Прибор или выполняет свои функции или не выполняет. На самом деле пофиг - отпал резистор или сбойнул камень.

Все-таки, подумайте над расчетом надежности Ваших устройств.

Цитата
Дык с точки зрения теории вероятности вероятность любого мыслимого события больше нуля. Весь вопрос в том, насколько больше


А с точки зрения квантовой теории и немыслимого
_Pasha
Цитата(Rst7 @ Feb 18 2008, 11:12) *
2. Что будет с результирующей надежностью, если надежность камня будет 1e-7 (например, программными методами)


Я бы сказал, судя по теме, надежность камня где-то 1е-4 biggrin.gif

Цитата(_Sam_ @ Feb 18 2008, 11:27) *
1. Про корпус это сильно, если на реальном объекте на корпус фазу подать или не заземлить, то будет уже не до вашей программы, если она конечно не ракеты пускаетsmile.gif.


Пробовали. Случайно,конечно. А Вы что подумали? smile.gif
И ничего страшного не происходит. Если нет свободных ног в Hi-Z состоянии, опять же.

Цитата(Дон Амброзио @ Feb 18 2008, 11:28) *
Поэтому я не понимаю, почему многие из ответивших здесь на форуме так упорно сопротивляются против того, чтобы добавить надёжности девайсу (надёжности в смысле не предотвращения сбоев, а их своевременного обнаружения и устранения). Упираются ногами, руками, рогами и прочими частями тела. Почему?[/size][/b][/i][/u]


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

Кой-чего вспомнил.
Прошлым летом один мой привод (кстати, движимый тривиальной мегой-8) залило водой. 380!!!
И что? И ничего: аппаратная защита от КЗ не дала начаться безобразию, проц рабочий, флеш целый, eeprom(!) целый, хотя возможность записи в программе есть. Нога какая-то второстепенная выгорела, не помню. Короче, ПРОСУШИЛ - ПОМЕНЯЛ ПРОЦ - ВПЕРЕД! Все живы по сей день.
Rst7
Цитата
Весь вопрос в том, насколько больше


Вот на это Вам ответит теория надежности.


Цитата
Потому что тема трудно формализуется.


Ничего подобного. Весь математический аппарат есть. Соответствующий раздел форума недалеко.
_Sam_
Цитата
Писал же уже Вы не четатиль, чтоли?

Ну кто ещё не "четатиль" это большой вопрос!

Я ж писал в предыдущем своём посте :
Цитата
А если у нас без случайного джампа на Run произошло изменениеDDRC и PORTC таким образом, что эти два сигнала выставвились.


Цитата
Если вероятность выхода из строя какого-то его аппаратного узла, то это одно. А если вероятность сбоя из-за помех - это другое

Вы читаете, что пишет Rst7? Похоже не всё!

А по поводу стороны проблемы затронутой Rst7 вот есть полезная статейка
Dog Pawlowa
Цитата(Дон Амброзио @ Feb 18 2008, 12:44) *
Дык с точки зрения теории вероятности вероятность любого мыслимого события больше нуля. Весь вопрос в том, насколько больше.

Классика теории вероятности -
У блондинки спрашивают:
- Какая вероятность, что ты встретишь на улице динозавра?
- 50%. То ли встречу, то ли нет.
_Pasha
Цитата(_Sam_ @ Feb 18 2008, 11:51) *
А по поводу стороны проблемы затронутой Rst7 вот есть полезная статейка

А по статейке выходит, что программа+проц = последовательное соединение блоков?
_Sam_
Цитата
Дык с точки зрения теории вероятности вероятность любого мыслимого события больше нуля. Весь вопрос в том, насколько больше

Дык вы же не хотите считать эти вероятности, вы интуитивно полагаете, что ваши программные нагромаждения существенно их изменят!

Почему вы считаете что вероятность случайного джампа выше чем выставление одновременно двух сигналов на порте? Ведь возможно ситуация когда вы всё проверили выставили первый сигнал и в этот же момент помеха выставила второй! Всё тупик.

Цитата
Пробовали. Случайно,конечно. А Вы что подумали?

Ну например если на корпус шкафа электроавтоматики попадёт фаза соприкосновение с ним радости не доставитsmile.gif

Цитата
А по статейке выходит, что программа+проц = последовательное соединение блоков?

Неа мы ж тута обсуждаем безошибочные проги, которые ещё к тому же и исправляют баги глючных MCU:) Т.ч. надо брать надёжность MCU и надёжность MCU c меганадёжной прогой, которая ловит баги MCU biggrin.gif
Дон Амброзио
Цитата(Rst7 @ Feb 18 2008, 11:48) *
Прибор или выполняет свои функции или не выполняет. На самом деле пофиг - отпал резистор или сбойнул камень.

Согласен.. Просто надёжность в с смысле отсутствия необнаруженных сбоев от помех и постоянные (в смысле, не временные) отказы отдельных аппаратных узлов MCU - это другое.
Если 2-й параметр MCU и имеет такой же примерно порядок величины как , например, резистор. То первый хуже в 100 000 раз и более. Так что применение описанных мной методов обоснованно

Цитата(Rst7 @ Feb 18 2008, 11:51) *
Вот на это Вам ответит теория надежности.
Ничего подобного. Весь математический аппарат есть. Соответствующий раздел форума недалеко.

Цитата(_Sam_ @ Feb 18 2008, 11:51) *
Вы читаете, что пишет Rst7? Похоже не всё!

А по поводу стороны проблемы затронутой Rst7 вот есть полезная статейка



А вы, Господа хорошие, вообще понимаете разницу между надёжностью программ и надёжностью железа? И что теория надёжности программ имеет свою специфику? Мне кажется что нет. Ибо тогда бы Вы знали, например, что понятие износа/старения , применяемое сплошь и рядом в теории надёжности железа, для программ не применимо.

Цитата(Dog Pawlowa @ Feb 18 2008, 11:55) *
Классика теории вероятности -
У блондинки спрашивают:
- Какая вероятность, что ты встретишь на улице динозавра?
- 50%. То ли встречу, то ли нет.

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

Цитата(_Pasha @ Feb 18 2008, 12:03) *
А по статейке выходит, что программа+проц = последовательное соединение блоков?

lol.gif

Во-во.. И я про тоже... Некоторые Господа пытаются перенести все методики рассчёта надёжности железа и на программу. Забывая о том, что программа не имеет такого понятия как износ/старение
_Sam_
Цитата
А вы, Господа хорошие, вообще понимаете разницу между надёжностью программ и надёжностью железа?

Ну вот приплыли 07.gif
Мы же обсуждаем так сказать идеальные программы в которых всё предусмотрено(имеются ввиду все ситуации с бессбойным MCU) и каким образом не допустить, чтобы глюки MCU не испортили нам программной идеальности. Т.е как программным способом отловить аппаратный сбой, нарушающий ход выполнения программы или искажающий регистры или ОЗУ. Или я уже что-то не понимаю? 05.gif

Цитата
Некоторые Господа пытаются перенести все методики рассчёта надёжности железа и на программу.

Мне кажеться это финиш.
Дон Амброзио
Цитата(_Sam_ @ Feb 18 2008, 12:09) *
Ведь возможно ситуация когда вы всё проверили выставили первый сигнал и в этот же момент помеха выставила второй! Всё тупик.
Дык на всякую хитрую ж..у найдётся х..й с винтом... Это я к тому, что всегда существует верояность такой ситуации, когда уже ничего не поможет. И что? Если помогает в 99,99% случаев, а в 0,01% случаев не поможет. То такая защита не нужна? 07.gif

Цитата(_Sam_ @ Feb 18 2008, 12:43) *
Мне кажеться это финиш.
Т.е. от ответа на вопрос Вы уклоняетесь. Значит разницу между надёжностью программ и надёжностью железа не понимаете. Тогда о чём тогда вообще вести речь? 07.gif
_Pasha
Цитата(singlskv @ Feb 17 2008, 19:06) *
Не претендуя на звание суперспеца, адепты проверки всего и вся так еще и не ответили на
часть моих вопросов, хотелось бы услышать например про защиту кода при использовании 32бит
команд....

Опять же, дело в цене вопроса. И если не трогать CALL / JMP, то остается проблема избавления от LDS/STS. Тоже, имхо, решаемая за счет использования LDD/STD. Но,блин, асм...
Код
; Let's locate all globals in 64-byte sections!
.dseg
Timer:  .byte 2
Flags:  .byte  1
;.....................
Uart0_sta: .byte 1
; additional defines
.equ Sectn1_org = Timer
.set Active_Sectn = Sectn1_org

.macro  LDvar8; <rdst> <var-addr>
  ldd @0,Y+(@1-Active_Sectn)
.endm

#define Select_Section(SectName) .set Active_Sectn=SectName\ ldi16 yL,yH,Active_Sectn
; where ldi16 is a relevant macro

Исправил.
Дон Амброзио
Цитата(_Sam_ @ Feb 18 2008, 12:09) *
вы интуитивно полагаете, что ваши программные нагромаждения существенно их изменят!

Вы не четатиль чтоли? twak.gif
А зачем тогда я уже N раз в этой теме упомянал о разработанных мной тестовых программах и про то, что применённые мной методы давали значительный эффект, по сравнению с программами без использования методов обнаружения сбоев железа? Т.е. все свои предполжения и теоретические рассчёты я реально подтвердил на практике
Rst7
Цитата
Если 2-й параметр MCU и имеет такой же примерно порядок величины как , например, резистор. То первый хуже в 100 000 раз и более.


Откуда такая цифра? Пожалуйста, опишите методику ее получения.
Дон Амброзио
Цитата(_Sam_ @ Feb 18 2008, 11:51) *
А по поводу стороны проблемы затронутой Rst7 вот есть полезная статейка

А вот Вам полезная статейка http://www.referatik.com.ua/subject/67/30320/?page=2

Цитата оттуда:"Предварительные исследования показали, что для элементной базы
среднего качества (надежность 0.999 - “три девятки после запятой”) при
оптимальном сочетании скорости получения результата на его надежность в
вычислительной среде теоретически достижима достоверность получения
правильных результатов машинного счета в “двести девяток после запятой” при
замедлении темпа их получения в 300-400 раз [1], что эквивалентно
увеличению надежности до 200 порядков величины при введении сравнительно
небольшой вычислительной избыточности, приводящей к потере
производительности не более чем на 2-3 порядка, что уже на современном
уровне может компенсироваться подбором компьютеров требуемой
производительности.
"

Цитата(Rst7 @ Feb 18 2008, 13:16) *
Откуда такая цифра? Пожалуйста, опишите методику ее получения.

Моя программа инсталлирована более чем на 11000 девайсах. За 2,5 года эксплуатации сетей с моими девайсами было программами, зашитыми в них, было обнаружено порядка 170 000 сбоев, которые были программой же устранены (эту цифру взял из логов, которые регулярно раз в неделю смотрит обслуживающий персонал и заносит эту инфу в спец.журнал). За это же время вышло из строя 5 девайсов. Но в них вышел из строя не процессор. Из чего и следует эта цифра "более 100 000"

Цитата(Дон Амброзио @ Feb 18 2008, 13:26) *
Моя программа инсталлирована более чем на 11000 девайсах. За 2,5 года эксплуатации сетей с моими девайсами было программами, зашитыми в них, было обнаружено порядка 170 000 сбоев, которые были программой же устранены (эту цифру взял из логов, которые регулярно раз в неделю смотрит обслуживающий персонал и заносит эту инфу в спец.журнал). За это же время вышло из строя 5 девайсов. Но в них вышел из строя не процессор. Из чего и следует эта цифра "более 100 000"

Причём это сбои именно из-за ЭМС. Потому что у нас в лаборатории постоянно гоняется уже 2,5 года таже сеть из 87-ми девайсов, но только "на столе" без воздействия ЭМС. За 2,5 года было только 13 сбоев, обнаруженных системой... Так что программная защита от незамечания сбоев реально работает

Цитата(Дон Амброзио @ Feb 18 2008, 13:33) *
было обнаружено порядка 170 000 сбоев, которые были программой же устранены (эту цифру взял из логов, которые регулярно раз в неделю смотрит обслуживающий персонал и заносит эту инфу в спец.журнал).

Разумеетцо велось и взаимо тестирование девайсов, когда девайс не отвечал другому девайсу (например кварцевый генератор в девайсе от мороза не запустился) или отвечал не правильно. Для этого случая тоже велись свои логи и они в цифру "170 000" не вошли
galjoen
Цитата(_Pasha @ Feb 18 2008, 12:54) *
Опять же, дело в цене вопроса. И если не трогать CALL / JMP, то остается проблема избавления от LDS/STS. Тоже, имхо, решаемая за счет использования LDD/STD. Но,блин, асм...

Итак от LDS/STS избавились!!! (исправил - спасибо '_Pasha')
CALL / JMP - тоже исправимо!!!
Заменой на rjmp. Не реже, чем через каждые 4 кслова (чтоб rjmp дотягивался) ставим ещё один rjmp. И переходим через последовательность rjmp. Например так:
rcall m2proc ;(proc-PC)>4096, а вот (m2proc-PC)<4096
....;
m2proc: rjmp m1proc ; (m1proc-m2proc)<4096
....;
m1proc: rjmp proc ; (proc-m1proc)<4096
....;
proc:
...
ret
На асме это можно сделать с помощью макрокоманд с условной трансляцией. А компилятор C - переделать так, чтоб он про CALL / JMP "забывал". В смысле опцию компилятора такую создать.
Всё это шутка конечно, но в каждой шутке...

А вообще тут уместно будет басню Крылова вспомнить. Лиса и виноград называется. ИМХО многие на методы защиты, здесь поднятые потому ополчились - что сами этого не делают. И базу подводят - мол это я не делаю не потому, что не могу (не додумался, лень, руки кривые). А из идейных соображений!!! И намёками понять дают, что тем кто что-то такое использует - стыдно за это должно быть.
_Pasha
Цитата(galjoen @ Feb 18 2008, 13:48) *
[b]Итак от LDD/STD избавились!!!

* LDS/STS. Исправьтесь, пока не поздно, а то запинают. smile.gif
Короче, кривое выпрямляется, становится подобно пикам. Но получше, получше...
З.Ы. А с длинными джампами - проблема. На больших программах - сплошной изврат.
Я вот думаю, если все крутится под многопотоком, проще переделать выход из потока, чем совать rjmp куда ни попадя
Serg79
Да, есть такая проблема и называется она безопасность программного обеспечения. Способы ее решения зависят от работы девайса.

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

Чтобы было понятно, опишу немного пинцип работы девайса. Девайс висит на линии связи и ждет команды. По приходу команды он ее выполняет и отсылает ответ со своим состоянием. Вроде бы, что может быть проще. А нет, у заказчика возникает вопрос, а если ваша система сойдет с ума и начнет немного шалить, т.е. ей приходит команда сделай шаг вперед а она, собака такая, берет и делает два шага назад или наоборот ничего неделает, а в линию связи, эта скотина, отсылает ответ что выполнила команду правильно. Вы можете утверждать с пеной у рта, что этого не может происходить потому что это из области фантастики, НО ВЫ НИКОГДА НЕ ДОКАЖЕТЕ ЭТО СО 100 ПРОЦЕНТНОЙ ВЕРОЯТНОСТЬЮ (случаи перерубания топором проводников питания не расматриваются :-) ). Кстати, заказчик тоже технически грамотный и знает, что со 100 процентной вероятностью этого никто не докажет, поэтому он требует, чтобы вероятность того что система сойдет с ума а со стороны будет казаться что она вполне даже разумна была не выше 10 в -8 степени.

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

Теперь, как работает эта система:
1 - по линии связи приходит команда.
2 - процессор проводит тестирование внутрених узлов микропроцессора (из первого набора функций).
3 - производится межпроцессорный обмен.
4 - выполняется команда.
5 - процессор проводит тестирование внутрених узлов микропроцессора (из второго набора функций).
6 - отсылается ответ в линию связи.

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

Теперь постораюсь каждый пункт описать более подробно:
1) По приходу команды происходит проверка адреса в заголовке пакета (на одной линии висит несколько девайсов). Происходит проверка команды на пренадлежность ее ко множеству всех допустимых команд. Проверяется контрольная сумма пакета. Если все условия выполняются, то команда передается дальше по цепочке.
2) Происходит тестирование внутренних узлов микроконтроллера. К тестам внутренних узлов микроконтроллера относятся (в порядке выполнения): тест безусловных переходов (команды 'jmp', 'call' и т.д.), тест условных переходов и регистра 'SREG' ('brcs' и все ему подобные, также включает в себя проверку всех команд оперирующих с битами регистра 'SREG', 'clz' и все ему подобные), тест первой половины регистров общего назначения (РОН) (к ним относятся те регистры, которые компилятор GCC позволяет изменять при вызове функций без востанавления их первоначального состояния "r18-r27", "r30-r31"), тест второй половины регистров общего назначения ("r0-r17", "r28-r29"), тест оперативной памяти, проверка 'CRC' flash-памяти содержашей код программы, тест группы команд логических операций, тест группы команд арифметических операций, тест групы команд пересылки данных, тест АЦП (на двух точках контрольного напряжения), тест таймеров (удостоверямся что они шелкают в соответствии с установлеными делителями).
3) При межпроцессорном обмене происходит обмен поступившей командой, а также флагами прохождения тестов узлов микроконтроллера.
4) Выполняем команду.
5) Все тоже самое что в пункте 2, только вторым набором функций тестирования. Это сделано для того что бы, если по какой то причине тест из первого набора даст ложное 'OK' на ошибку, то тест из второго набора сможет зафиксировать данную ошибку (звучит глупо, но иногда это срабатывает :-) ).
6) Вот сдесь мы можем утверждать, что у нас все хорошо с заданной вероятностью. О чем и попытаемся сказать в линию связи. :-)

Сделаю несколько замечаний:
1 - Не прохождение тестов из пункта 2 и 5 приводит к переводу устройства в защитный отказ (это такой отказ из которого система недолжна выходить даже при сбросе и востановлении питания).
2 - Не следует сразу же входить в защитный отказ при непрохождении какого то одного из тестов (например: тест оперативной памяти), мы используем счетики непрохождения тестов и если они переполняются то уже переводим устройство в защитный отказ. Это обусловленно тем что микропроцессору свойственно изредка подглючивать, особенно в сложной электромагнитной обстановке. И еще, удачное прохождение теста не должно сразу сбрасывать данный счетчик в нуль, мы обычно делаем так: при ошибки счетчик увеличивается на два, при прохождении теста счетчик уменьшается на один. До скольки расти счетчику, решать Вам.
3 - Если представленная выше цепочка пунктов не выполняется в течении 'n-го' времени то система переводится в безопасное состояние. Выход из безопасного состояния в рабочее происходит по выполнению всех пунктов данной цепочки. Обычно это происходит если одна из линий связи обрывается и соответственно один из процессоров не получает команды, это обнаруживается на межпроцессорном обмене.
4 - По возможности все данные программы которые сохраняют свои значения между вызовами функций должны формироваться динамически. Например, флаги прохождения тестов формируются динамически и если какой то из тестов не прошел, то это будет отловленно на межпроцессорном обмене. Так же в пакет команды и ответа по линии связи надо вводить постоянно изменяемое поле для того, что бы это приводило к изменению контрольной суммы. Да и вообще статические данные склонны к накоплению ошибок.

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

P.S. Все что описано выше нельзя расматривать как руководство к построению безопасного программного обеспечения, т.к. ПО построеное на данных принципах еще не получило заключение экспертизы, потверждающее его безопасность.

И еще, прежде чем что либо доказывать, проводиться привязка программного продукта к классу который напрямую связан с тяжестью состояния оказа. Вот например какое разделение по классам производится стандартом для сертификации бортового авиационного ПО согласно RTCA DO-178B (или его европейского аналога EUROCAE ED-12B):
A ) Катастрофическое - состояние, не совместимое с безопасным полетом и посадкой.
B ) Опасное - состояние, при котором функциональные способности летательного аппарата (ЛА) или способности экипажа справляться с неблагоприятными условиями управления достигают нижних пределов безопасности. Экипаж не может выполнять свои задачи аккуратно и полностью.
C ) Существенное - состояние, при котором функциональные способности ЛА или способности экипажа справляться с неблагоприятными условиями управления снижены до существенных пределов. Имеет место существенное увеличение нагрузки на экипаж или ухудшение эффективности работы экипажа.
D ) Несущественное - состояние, не приводящее к значительным потерям безопасности управления ЛА.
E ) Не влияющее - состояние, никак не влияющие на способности управления ЛА.

Уже начинаете чувствовать, что не все так просто :-) . Так что на этом фоне все высказывания типа: "'watchdog' панацея от всех твоих проблем", в самом общем случае вызывает улыбку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.