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

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

+1

Как можно программными методами отследить случайный переход на случайную точку программы?
Я от этого контролем данных защищаюсь - см. мой предыдущий пост. Подсчётом их CRC, сравнением с инверсией и т.д.
ИМХО в случае несанкционированного перехода, данные и в регистрах и в ОЗУ, несоответствующие программе будут.
Это не 100% конечно. Но и CRC у порченных данных тоже совпасть может!
А если программа хотя-бы диапазоны данных проверяет - то и больших бед не натворит. И восстановиться потом можно будет!
Дон Амброзио
Цитата(zltigo @ Feb 13 2008, 13:02) *
Для неокрепших умов наивно предполагающих, что проблему отсутствия нормального сквозного проектирования системы можно решить в конце цепочки программными "защитами" будет, наверное, небесполезно.

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

Просто в этой теме рассматривается маленькая часть огромного вопроса обеспечения надёжности систем(ведь нельзя в одной теме объять не объятное). А Вы ёрничаете
galjoen
Цитата(galjoen @ Feb 13 2008, 13:19) *

Я тут ещё старый анекдот вспомнил. Как раз в тему.
Один программист у другого спрашивает. Почему у тебя два одинаковых jmp подряд стоят? Тот отвечает. Это на случай того, что 1-й не сработает.
Однажды поймал себя на желании именно так и сделать! В смысле два одинаковых jmp подряд поставить!!!
Дон Амброзио и другие участники этой ветки, вы себя на таком желании не ловили? А может и ставили? Если так - значит я с вами одной крови.
mig2002
Возвращаясь к первоначальному вопросу могу посоветовать применить при написании программы теорию графов.
Нужно нумеровать состояния программы. При переходе в новое состояние, анализировать предыдущее и т.д.
На практике ввести переменную STATE, задавать ей значение только перед переходом в новое состояние.
Дон Амброзио
Цитата(Schtirlitz @ Feb 13 2008, 13:01) *
А как быть с вероятностью сбоя программы обнаружения сбоев?

А для этого я использую такую организацию кода, когда все участки друг друга тестируют. Т.е. когда вся программа предстваляет собой как бы детектор сбоев и вся её организация направлена на то, чтобы как можно раньше определить наличие и причину сбоя. Хотя конечно разумеется никакие программные навороты не дадут 100% обнаружения сбоев.

Цитата(Schtirlitz @ Feb 13 2008, 13:01) *
Не нужно изобретать велосипед: если нужна вероятность отказа устройства 10 в минус 9-й степени - применяйте резервирование, мажоритарные схемы итд.

Я в курсе.

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

Цитата(galjoen @ Feb 13 2008, 13:19) *
Как можно программными методами отследить случайный переход на случайную точку программы?


И как же ? По вашему мнению?


Я вот например имею некоторые мысли (даже не мысли, а реально работающие программы, в которых это отслеживается (с некоторой долей вероятности успеха разумеется)), но хотел бы услышать сперва Ваши

Цитата(mig2002 @ Feb 13 2008, 14:01) *
Возвращаясь к первоначальному вопросу могу посоветовать применить при написании программы теорию графов.
Нужно нумеровать состояния программы. При переходе в новое состояние, анализировать предыдущее и т.д.
На практике ввести переменную STATE, задавать ей значение только перед переходом в новое состояние.

Спасибо... Что-то подобное и делаю, только использую не STATE а регистр кода доступа к логическому сегменту
adc
Цитата(galjoen @ Feb 13 2008, 13:19) *
Цитата
Как можно программными методами отследить случайный переход на случайную точку программы?

Я от этого контролем данных защищаюсь - см. мой предыдущий пост. Подсчётом их CRC, сравнением с инверсией и т.д.
ИМХО в случае несанкционированного перехода, данные и в регистрах и в ОЗУ, несоответствующие программе будут.

Но ведь сравнение то у вас происходит на программом уровне а не на аппаратном! А если программа перескочит туда где нет проверки на совпадение CRC?
Потом проверка данных после каждой операции мне кажется несколько избыточной. smile.gif

Цитата(Дон Амброзио @ Feb 13 2008, 14:14) *
И как же ? По вашему мнению?

Есть предложение в начале каждой операции(подпрограммы) загружать в озу константы , а в конце считать контрольную сумму этих чисел и записывать также в озу. Далее по прерыванию от таймера(включенного при инициализации) проверять соответствие текущих констант в озу и их контрольной суммы. Если не соответствует принимать меры.
Конечно тоже не 100% метод... но всеже.. smile.gif
mig2002
В принципе, однозначного решения данного вопроса быть не может
Решение нужно выбирать для конкретной задачи. Можно ипользвать и программные методы, и аппаратные. Нужно только определиться с приоритетами: быстродействие или надежность. Хотя понятие надежности тоже относительное. А степень надежности должна определяться стоимостью обрабатываемой информации.
Дон Амброзио
Цитата(mig2002 @ Feb 13 2008, 14:43) *
В принципе, однозначного решения данного вопроса быть не может

Оно и понятно. А Вы как решаете проблему обнаружения в программе несанкционированных переходов?

Цитата(mig2002 @ Feb 13 2008, 14:43) *
А степень надежности должна определяться стоимостью обрабатываемой информации.

Оно и понятно .. Нет смысла применять супер-пупер методы увеличения надёжности для управления ёлочной гирляндой

Цитата(mig2002 @ Feb 13 2008, 14:43) *
Можно ипользвать и программные методы, и аппаратные.
Разуметцо


Цитата(adc @ Feb 13 2008, 14:25) *
Потом проверка данных после каждой операции мне кажется несколько избыточной. smile.gif

А что Вам MCU жалко? Да бростье Вы..Он же железный... Пусть работает lol.gif
А если серьёзно, то обоснованность применения избыточности кодирования и избыточности в затратах памяти, времени CPU и т.п. ресурсах определяется решаемой задачи... Реально делал когда у меня в одном процессоре работали 3 одинаковых потока, которые делали одно и тоже с 3-мя копиями одних и тех же данных. А потом результаты проверялись мажоритарным голосованием
Дон Амброзио
Вообще сейчас скажу крамольную мысль (только чур не бить ногами)

Чем более чувствительна программа к аппаратным сбоям тем лучше

Т.е. если правильно и грамотно разработанная программа начинает ЗАМЕТНО глючить от каких либо помех, то это здорово. Потому что гораздо хуже если в программе чего-то глюкануло, а мы этого не заметили и считаем что всё ОК
galjoen
Цитата(adc @ Feb 13 2008, 14:25) *
Но ведь сравнение то у вас происходит на программом уровне а не на аппаратном! А если программа перескочит туда где нет проверки на совпадение CRC?

Как я и писал там-же, я это делаю в основном цикле (не RTOS). По 1-му байту за цикл. На это меньше 20 тактов уходит. Из них сам подсчёт CRC16 - 10 тактов. А ухожу на восстановление только если два раза подряд CRC не совпало. А команда wdr у меня только в основном цикле стоит. Если я туда попадать перестану - собака сработает. Но ни разу ещё не срабатывала! У меня все логи пишутся.
А вот проверка CRC данных бывало срабатывала.
Цитата(adc @ Feb 13 2008, 14:25) *
Потом проверка данных после каждой операции мне кажется несколько избыточной. smile.gif

А я далеко не на все данные их инверсию завожу. А только на важнейшие. Несанкционированное изменение которых разрушительно скажется. Например N сектора в файле в который писать буду. И их в основном цикле ещё тоже перепроверяю. По 1й переменной за цикл. Это совсем быстро. Срабатывало.
А ещё в основном цикле CRC32 всей программы считаю. По 1-му слову за цикл. Ни разу не срабатывало.
А ещё если байтная переменная может иметь только несколько значений (< 86), я их не последовательно, а через 3, 5 или 7 увеличиваю. И за запрещёнными состояниями слежу. Срабатывало.

А вообще, всё это у меня началось после того, как я испытания на ЭМС прошел. Со 2й попытки. Всего лишь класс B. Но жесткость была максилальная. На наносекундных импульсах проблеммы были.
А у вас как с ЭМС? С наносекундными импульсами? Если скажете, что от них не сбивается (класс A) - не поверю!!!
Дон Амброзио
Цитата(defunct @ Feb 13 2008, 15:13) *
Так красиво ответить на хамские посты, глубочайший respect!

А кто хамил? И где? И почему бы Вам свои благодарности было не написать в привате? Зачем тему-то замусоривать?
defunct
Цитата(Дон Амброзио @ Feb 12 2008, 01:31) *
2) Что можно применить кроме WDT высказлся только Непомнящий Евгений, а что же остальные?

Вы же и так все знаете, зачем Вам еще что-то советовать?!

Цитата
Но это я конечно погорячился, но если встанет такая дилема - я пойду на это

Горячий испанский парень.


Цитата
Вот Вам ответ.. От себя лишь добавллю термин "счётчик-ограничитель количества итераций цикла" Вам о чём-нибудь говорит?

это еще что за зверь такой "счетчик ограничитель". В RTOS каждая задача - это бесконечный цикл.

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

Слова дойстойные анекдота. smile.gif

Цитата
Тема то у нас гораздо шире.. Или просто никто больше не знает других методов "борьбы" с явлением, указанном в названии темы?

тема ваша тупая на самом деле, и в том виде в каком задача поставлена в первом посте - не имеет решения вообще.

Цитата
Не звизди..

Куда смотрят модераторы?! Пора бы немного остудить гарячего парня.

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

50% боксер / 50% сторожевая собака © какой-то мультик

Цитата
Чуть-чуть пошевелить мозгами для Вас мучение?

опять хамство.

Цитата
У меня наприммер в моих программах работающих в среде моей же RTOS

smile.gif

Цитата
Спасибо Вам большое...Я давно уже хотел Вам это предложить... Да стеснялся.. Боялся Вас обидеть...

полное хамство.

Цитата
А кто хамил? И где? И почему бы Вам свои благодарности было не написать в привате? Зачем тему-то замусоривать?

Вы. В каждом посте. Потому что меня Ваша манера ведения дискуссии просто бесит. Пришел всезнающий барин, и давай всем объяснять какаие они л...и., какой уж тут приват.
Тему эту уже не замусоришь, она и так замусорена вашими постами "от и до".
Rst7
Цитата
А у вас как с ЭМС? С наносекундными импульсами? Если скажете, что от них не сбивается (класс A) - не поверю!!!


У меня стандарт на оборудование (EN54) требует не сбиваться, максимум - кратковременное нарушение индикации (ну типа, когда статразряд влетает в светодиод, он подмигивает wink.gif ). И работает.
mig2002
Цитата(Дон Амброзио @ Feb 13 2008, 14:09) *
Оно и понятно. А Вы как решаете проблему обнаружения в программе несанкционированных переходов?

Я использую и STATE, и WDT, и программные таймауты. А вообще стараюсь писать, чтобы была однозначность во всех ситуациях. А что касается несанкционированных помех и т.д., то эти вопросы лучше решать другими способами (экранами, фильтрами, убрать подальше от источника помех.....).
IgorKossak
Считаю своим долгом всем напомнить, что неплохо бы поостыть и прекратить обсуждать личности.
adnega
Недавно дорабатывал текстовое информационное табло. Разработчиком была допущена ошибка в проектировании ПП, в результате табло "ловило" помехи очень стабильно. Инженерам приходилось выезжать на место и пересбрасывать питание.

Во-первых, доработал программу. Табло реализовывало динамическую развертку (100Гц). В разверточном прерывании вставил WDR после проверки нескольких таймаутов. Логика такая:
1. Разверточное прерывание нужно всегда, т.е. это гарантированная точка входа с частотой 100Гц. Его задача разворачивать ВидеоОЗУ;
2. Поставил таймаут на прием данных по последовательному интерфейсу. Задача приемника принять данные и поместить их в буфер;
3. Поставил таймаут в MAINLOOP. В главном цикле проверялось пришли ли новые данные и при необходимости записывалось ВидеоОЗУ;
4. В разверточном прерывании проверял таймауты от приемника и главного цикла, если они не истекли, то сбрасывал сторожевой таймер.

Таким образом, я гарантировал, что разверточное прерывание будет всегда; не зависнет конечный автомат приемника (таймаут приемника) и принятые данные попадут в буфер; в главном цикле принятые данные из буфера перепишутся в ВидеоОЗУ, развертка которого гарантирована.

Табло, по-прежнему, прекрасно ловило все помехи, но не уходило в ступор (инженерам не приходится ездить и пересбрасывать питание). После аппаратных доделок табло перестало ловить помехи.

Вот.
defunct
Цитата
После аппаратных доделок табло перестало ловить помехи.

Представим, что у нас в МК прошит бутлоадер. В нем есть потенциально фатальная для девайса команда стирания страницы флеш, тогда единственным направлением для защиты от "случайных прыжков" - будет правильное проектирование ПП и снижение уровня помех.
galjoen
Цитата(Rst7 @ Feb 13 2008, 15:50) *
У меня стандарт на оборудование (EN54) требует не сбиваться, максимум - кратковременное нарушение индикации (ну типа, когда статразряд влетает в светодиод, он подмигивает wink.gif ). И работает.

Рискну предположить, что у вас всё работает из-за того, что всё это достаточно большое, и в железном корпусе. Я это условие как-то в том посте упустил.
У меня-то пластмассовый корпус 120*60*32 мм. И когда они этот гвоздик, в котором 8 кВ за единицы наносекунд нарастает, к корпусу подносят (к разным местам), то до процессора и других микросхем - от него менее 15 мм расстояние. Это почище той зажигалки, которой Дон Амброзио свои процессоры тестирует. Пробовали экраны металлические делать - эффект 0-й, а удорожание не 0-е. И всё равно это не поможет т.к. кабеля-то наружу торчат. От них тоже сбивается.

Но всё само восстанавливается (класс B )

Цитата(defunct @ Feb 13 2008, 17:09) *
Представим, что у нас в МК прошит бутлоадер. В нем есть потенциально фатальная для девайса команда стирания страницы флеш, тогда единственным направлением для защиты от "случайных прыжков" - будет правильное проектирование ПП и снижение уровня помех.

У меня тоже бутлоадер есть в области загрузчика. Перед тем как программировать я CRC переменных проверяю. Согласен, что защита не 100%. Может ведь и после проверки прыгнуть. Но 99.9%. А если быть точным - то отношение кол-ва команд с которых бутлоадер несанкционированно запустится к 65536 (столько слов у AVR с 128 в конце).
Rst7
Цитата
У меня-то пластмассовый корпус 120*60*32 мм.


И в подобных корпусах есть приборчики. Там система будь-здоров, всяких разных приблуд и в пластмассовых корпусах и в металлических - дофига. Все работает.
defunct
Цитата(galjoen @ Feb 13 2008, 16:34) *
Может ведь и после проверки прыгнуть. Но 99.9%. А если быть точным - то отношение кол-ва команд с которых бутлоадер несанкционированно запустится к 65536 (столько слов у AVR с 128 в конце).

угу, прыжек же "случайный" можно папасть в любую точку, по законам Мерфи попадем ровно на erase sequence после всех проверок. Защититься тут никак нельзя, а вот предотвратить "командировку для устранения последствий" - можно. Например, можно хранить копию основной прошивки во внешней eeprom'ке, при старте бутлоадером проверить CRC прошивки, если не совпадает - то попытаться загрузить прошивку из внешней eeprom.

Я собсно хочу отметить, что задача автора ветки - нерешаемая. Ее можно только обойти, но не решить.
Дон Амброзио
Цитата(defunct @ Feb 13 2008, 18:12) *
угу, прыжек же "случайный" можно папасть с любую точку, по законам Мерфи попадем ровно на erase sequence после всех проверок.

Ага.. Но у меня в конце каждой итерации записи страницы стоит тоже проверка "а была ли действительно санкционирована запись" и если нет - восстанавливаем странцу из копии программы (у меня в флэшаке всегда храниться 3 копии программы: одна активированная, а 2 в дезактивированном виде)

Так что.. Опять мимо

Цитата(defunct @ Feb 13 2008, 17:09) *
Представим, что у нас в МК прошит бутлоадер. В нем есть потенциально фатальная для девайса команда стирания страницы флеш

Надо проектировать программу так, чтобы стирание одной единственной страницы флэш не было фатальным . Как? Смотрите выше

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

Но как я уже писал и другие говорили, что какая бы высокая надёжность не обеспечивалась граммотным проектированием железа применяя программные методы можно увеличить это надёжность ещё больше
galjoen
Цитата(Rst7 @ Feb 13 2008, 17:41) *
И в подобных корпусах есть приборчики. Там система будь-здоров, всяких разных приблуд и в пластмассовых корпусах и в металлических - дофига. Все работает.

У меня есть знакомый. Очень уважаемый человек! Он всегда рассказывает, что огородом совсем не занимается, а там у него все очень хорошо растёт. При этом он явно даёт понять, что у него все растения так хорошо растут просто из уважения к нему.
Надеюсь, вы Rst7, не такой уважаемый человек. Объясните, как-же у вас в таких корпусах от наносекундных помех ничего не сбивается? Вы экраны ставите? Или как вы этого добиваетесь?

Только без обид. Rst7, заранее извиняюсь! Простите, что первое на ум пришло написал. А стирать жалко.
Дон Амброзио
Цитата(defunct @ Feb 13 2008, 15:47) *
это еще что за зверь такой "счетчик ограничитель".

"На свете есть много такого, мой друг, Горацио, что и не снилось нашим мудрецам"(С)

Цитата(defunct @ Feb 13 2008, 18:12) *
Я собсно хочу отметить, что задача автора ветки - нерешаемая. Ее можно только обойти, но не решить.


Принимается

Я немного неправильно сформулировал задачу.

Я написал в исходном сообщении: А кто как защищает код в MCU от несанкционированного выполнения в результате случайного перехода из одной точки программы в другую от воздействия помехонесущего электромагнитного поля (искажения записанного в счётчике команд значения). А?


А правильно бы надо было так (ведь именно это меня и интересует):

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



Цитата(galjoen @ Feb 13 2008, 17:34) *
Согласен, что защита не 100%.

Вот я и говорю, что не 100% но всё же эффект ведь налицо от применения "программных методов"
Что эти Господа так упираются против использования программных методов обнаружения сбоев? Не понимаю

Цитата(mig2002 @ Feb 13 2008, 16:20) *
А что касается несанкционированных помех и т.д., то эти вопросы лучше решать другими способами (экранами, фильтрами, убрать подальше от источника помех.....).

Конечно лучше... И плюс для подстраховки рассыпать в проге код обнаружения случайных джампов...Так...На всякий пожарный
defunct
Цитата(Дон Амброзио @ Feb 13 2008, 17:51) *
(у меня в флэшаке всегда храниться 3 копии программы: одна активированная, а 2 в дезактивированном виде)

Так что.. Опять мимо

А почему Вы восприняли это на свой счет? sad.gif
Я же не знал, что и как у Вас реализовано, и соотв. не мог критиковать вашу реализацию.
А вот сейчас уже могу smile.gif - что делать если основная прошивка занимает >50% флеша?

На этом форуме вообще-то не принято друг-друга подкалывать.
Тему можно сделать интересной, и без скандальных постов.
Дон Амброзио
Цитата(defunct @ Feb 13 2008, 20:16) *
Я же не знал, что и как у Вас реализовано, и соотв. не мог критиковать вашу реализацию.А вот сейчас уже могу smile.gif - что делать если основная прошивка занимает >50% флеша?

1)Использовать другой MCU с бОльшим количеством FLASH
2)Уменьшить программу
3) Придумать что-то ещё(например выделить во FLASH какой-нибудь буфер страницы на 4; пишем новую страницу туда; пишем ещё одну копию новой страницы в буфер; затем считываем в ОЗУ содержимое старой страницы, которую хочем изменить; пишем её в буфер; ещё раз считываем в ОЗУ содержимое старой страницы; пишем её в буфер; далее стираем требуемую страницу и пишем новое содержимое ТАКИМ ОБРАЗОМ СТИРАНИЕ ОДНОЙ СТРАНИЦЫ FLASH НЕ БУДЕТ ФАТАЛЬНЫМ


Цитата(defunct @ Feb 13 2008, 20:16) *
На этом форуме вообще-то не принято друг-друга подкалывать.

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

Цитата(Дон Амброзио @ Feb 13 2008, 21:22) *
1)Использовать другой MCU с бОльшим количеством FLASH
2)Уменьшить программу
3) Придумать что-то ещё(например выделить во FLASH какой-нибудь буфер страницы на 4; пишем новую страницу туда; пишем ещё одну копию новой страницы в буфер; затем считываем в ОЗУ содержимое старой страницы, которую хочем изменить; пишем её в буфер; ещё раз считываем в ОЗУ содержимое старой страницы; пишем её в буфер; далее стираем требуемую страницу и пишем новое содержимое ТАКИМ ОБРАЗОМ СТИРАНИЕ ОДНОЙ СТРАНИЦЫ FLASH НЕ БУДЕТ ФАТАЛЬНЫМ
И не думал. Ведь я как никто заинтересован этой темой и в нормальных ответах в ней, а не в обсуждении моей персоны

К тому же между установкой бита SPMEN и командой SPM даётся 4 такта на "раздумье". Туда можно засунуть код:
OUT SPMCR , R16
; ---------------
SBRS R17 , 7
RJMP CRASH
;-----------------
SPM

Цитата(Дон Амброзио @ Feb 13 2008, 21:31) *
ТАКИМ ОБРАЗОМ СТИРАНИЕ ОДНОЙ СТРАНИЦЫ FLASH НЕ БУДЕТ ФАТАЛЬНЫМ

Разумеетцо если сбои не сыпяться слишком часто. К примеру не чаще чем раз в секунду. В противном случае (т.е. если частота сбоев в программе из-за помех больше чем раз в секунду) можно смело отправлять девайс на помойку
galjoen
Цитата(Дон Амброзио @ Feb 13 2008, 21:35) *
Цитата(defunct @ Feb 13 2008, 20:16) *

На этом форуме вообще-то не принято друг-друга подкалывать.

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

А я Дон Амброзио спасибо хочу сказать. Только в этой ветке про STATE узнал. Теперь буду применять. Пусть некоторые меня после этого признания будут ламером считать. Сам-то я знаю, что я ого-го! А те, кто на безобидные приколы обижается, сами виноваты. Дон Амброзио - токо не надо меня прикалывать. Мы ведь с вами друзья...
defunct
Цитата
А кто как организует код программы, чтобы программа детектировала (обнаруживала) случайные переходы из одной точки программы в другую, вызванные воздействием помехонесущего электромагнитного поля

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

Итого лечить надо только 1 и 2.

Первое лечится с помощью дублирования кода программы. Определяется и устраняется эта ошибка при очередной перезагрузке устройства. Как правило после такого сбоя устройство перезагружается по WDT.

Второе - система продолжает работать но часть функций отказала. Лечится перезагрузкой, перезагрузка делается опять с помощью WDT.

Вопрос в том где и как сбрасывать WDT чтобы последствия сбоя были 100% устранены. Решить этот вопрос можно например введя мониторинг статуса каждой задачи. Если используется RTOS, то сделать это достаточно просто - idle task (задача с самым низким приоритетом) периодически оцнивает состояние каждой задачи, если все задачи в порядке - WDT сбрасывается. Состояние же каждой задачи должно определяться индивидуально, для каждой задачи свой отдельный таймаут.

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

Статус первой задачи всегда Ок (коль уж в нее попали, то стало быть она работает).
Статус 2-й задачи переходит в состояние Alert если счетчик отправленных пакетов не изменяется в течение заданного таймаута.
Статус 3-й задачи определяется таймаутом "за n секунд не принято ни одного байта"
Статус 4-й задачи определяется аналогично 2-й
и наконец статус 5-й - аналогично 3-й.

Если хотя бы одна задача не в порядке, то в задаче 1 запрещаем прерывания и подвешиваем систему циклом
while( K * WDT_CYCLE)
__no_operation();

где
WDT_CYCLE - константа, соответвующая количеству циклов эквивалентное интервалу WDT.
K - коэффициен >1, для гарантии сброса МК.

Если вдруг получается так, что мы выходим из этого цикла. Тогда WDT вероятно тоже сбойнул - пытаемся:
1. Выполнить аппаратный сброс (если заранее предусмотрели управление внешней схемой сброса).
2. Выполнить прыжек по RESET вектору (т.к. хуже уже все равно не будет).


PS: До сих пор, против "случайных прыжков" этих программных мер мне хватало с головой.
Дон Амброзио
Цитата(defunct @ Feb 14 2008, 02:51) *
Детектировать случайный переход из одной точки программы в другую своевременно и безболезненно для текущей выполняющейся программы невозможно.

В корне не согласен с этой аксиомой(откуда Вы это взяли). 100% случайных джампов конечно никогда не отловить. А вот если предположить что джампы на любую величину смещения относительно заданной точки равновероятны, то можно отловить большинство случайных джампов.. Отловить в смысле обнаружить в программе, что случайный джамп имел место. Выше уже приводилось по крайней мере 2 метода как это сделать

Цитата(defunct @ Feb 14 2008, 02:51) *
Как правило после такого сбоя устройство перезагружается по WDT.

С чего Вы это взяли? Допустим во FLASH некоторый код изменился так, что вместо команды установки флага "Пришёл пакет извещения о пожаре" будет команды сброса этого флага. И девайс будет работать нормально просто в любом случае будет считать, что у него всё ОК и никакого пожара нет. И соответственно никакого зацикливания/зависания не произойдёт, а девайс при этом будет находиться в неисправном состоянии

Цитата(defunct @ Feb 14 2008, 02:51) *
Второе - система продолжает работать но часть функций отказала. Лечится перезагрузкой

Сама по себе перезагрузка, как таковая, ничего не лечит. Она просто сбрасывает MCU периферию в исходное состояние. Более того, она не позволит установить причину перезагрузки. Например если зацикливание было вызвано самопроизвольным изменением регистра UBRR из-за чего UART перестал принимать пакеты извне или случайым сбросом флага разрешения прерываний от UART, то после перезагрузки вся периферия сброситься в исходное состояние и мы не узнаем "а чё это было-то?"


Цитата(defunct @ Feb 14 2008, 02:51) *
если все задачи в порядке - WDT сбрасывается. Состояние же каждой задачи должно определяться индивидуально, для каждой задачи свой отдельный таймаут.

А кто будет считать этот тайм-аут?
defunct
Цитата(Дон Амброзио @ Feb 14 2008, 02:13) *
В корне не согласен с этой аксиомой(откуда Вы это взяли). 100% случайных джампов конечно никогда не отловить.

Потому что:
1. Они случайны, а это значит что можно прыгнуть из "RET" одной функции на "RET" другой.
2. Есть вероятность сбоя детектора, поясню - достаточно мощная EM помеха, способная привести к прыжку бог знает куда, также легко может нарушить содержимое памяти.

Ну и Вы сами говорите что 100% нельзя отловить, а раз 100% нельзя отловить то зачем их ловить?!

Чаще выгоднее мониторить конкретные узлы МК. И делать recovery там где это возможно, но не всегда это возможно вообще...

А вообще, советую поработать с ARM, прыжки случайные там отлавливаются самим процессором на раз аппаратурой процессора. Сильная EM помеха приводящая к случаному прыжку и Вы раньше или позже, но 100% попадете в один из трех Exception'ов DABT/PABT/UNDEFABT.
Дон Амброзио
Цитата(Дон Амброзио @ Feb 14 2008, 03:30) *
то после перезагрузки ...

Пардон..Пардон..Прошу прощения

Совсем упустил из вида , что Вы юзаете Меги у которых при наступлении тайм-аута WDT проц не сбрасывается, а переходит на вектор прерывания
defunct
Цитата(Дон Амброзио @ Feb 14 2008, 02:30) *
С чего Вы это взяли? Допустим во FLASH некоторый код изменился так, что вместо команды установки флага

Не о том речь. Конечно сбой надо продетектить, и он продетектится в idle таск'е, если система до этого сама не прыгнет по reset вектору.
Речь о том, что до сброса мы не сможем отдетектить нарушение FLASH. Ну это просто очень накладно пересчитывать CRC флеша постоянно в процессе работы.

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

Ну здрасти. Она переводит устройство в безопастное состояние.
Представьте, что Ваше устройство управляет котлом, и в результате сбоя может произойти взрыв. Сделав перезагрузку, мы вернемся в безопасное, 100% контроллируемое состояние.

Цитата
Например если зацикливание было вызвано самопроизвольным изменением регистра UBRR из-за чего UART перестал принимать пакеты извне или случайым сбросом флага разрешения прерываний от UART, то после перезагрузки вся периферия сброситься в исходное состояние и мы не узнаем "а чё это было-то?"

Это уже не важно, т.к. боримся мы с EM помехой по условию задачи, а не со сбоем UART'a.
Ну всмысле какая нам разница что UBRR изменялся до перезагрузки, если мы его все равно перенастраиваем заново.

Цитата
А кто будет считать этот тайм-аут?

idle таск'е - в той единственной задаче, которая может сбрасывать WDT.
Дон Амброзио
Цитата(defunct @ Feb 14 2008, 03:33) *
Потому что:
1. Они случайны, а это значит что можно прыгнуть из "RET" одной функции на "RET" другой.

Можно.. Но так как эти реты составляют от силы 1% в программе, то это процесс маловероятный... Я ещё раз повторюсь: все 100% "прыжков" обнаружить не возможно, но 90% - вполне. А это значит, что мы увеличим надёжность нашего девайса в 10 раз: раньше было 100 необнаруживаемых сбоев, а стало 10


Цитата(defunct @ Feb 14 2008, 03:33) *
Есть вероятность сбоя детектора

Да есть...Но она гораздо меньше чем основного кода..Почему.. Да потому что вкрапления кода детектирования случ. джампов очень маленькие по размеру и выполняются очень малое время по сравнению с временем работы основного кода

Цитата(defunct @ Feb 14 2008, 03:33) *
Ну и Вы сами говорите что 100% нельзя отловить, а раз 100% нельзя отловить то зачем их ловить?!

Ответил выше (см. "в 10 раз").
Т.е. Вы считаете, что если я применив спец.методы построения программы сделаю так, что она будет обнаруживать всего лишь 90% случайных джампов, то Вы считаете уменьшение количества не обнаруженных сбоев в 10 раз эта такая мелочь, ради которой и не стоило утруждаться?
defunct
Цитата(Дон Амброзио @ Feb 14 2008, 02:49) *
Т.е. Вы считаете, что если я применив спец.методы построения программы сделаю так, что она будет обнаруживать всего лишь 90% случайных джампов, то Вы считаете уменьшение количества не обнаруженных сбоев в 10 раз эта такая мелочь, ради которой и не стоило утруждаться?

Вообще-то да. Потому что к фатальным последствиям приведет как раз неучтенный случай из оставшихся 10%. А раз все не покрывается, то "овчинка выделки не стоит".
Дон Амброзио
Цитата(defunct @ Feb 14 2008, 03:33) *
А вообще, советую поработать с ARM, прыжки случайные там отлавливаются самим процессором на раз аппаратурой процессора.

Здорово... Я бы конечно лучше бы юзал процессоры, в которых АППАРАТНО заложен контроль доступа к отдельным логическим сегментам кода.. Представляете как бы было здорово.. Разметил флешь на сегменты и потом чтобы перейти из сегмента А в сегмент В нужно записать сначала номер В в спец. регистр защиты памяти... Пусть мы скаканули из-за помехи из А в В... Но проц этот аппаратно обнаруживает путём анализа: соответствует ли содержимое регистра защиты памяти и номер сегмента , в котором мы находимся в данный момент... Хотя и в этом случае прыжки из одной части сегмента в другую часть этого же сегмента были бы не обнаруживаемымм

Цитата(defunct @ Feb 14 2008, 03:45) *
Ну здрасти. Она переводит устройство в безопастное состояние.

Не согласен.... Сброс может длиться 64 мС и более.. А я ручками обнаружив случайный джам через 50 мкС переведу все порты в безопасное состояние.

Дык всё же Вы какие процы используете? Вы вроде говорили, что те, у которых по таймауту WDT происходит не сброс , а прерывание

Цитата(defunct @ Feb 14 2008, 03:45) *
Ну всмысле какая нам разница что UBRR изменялся до перезагрузки, если мы его все равно перенастраиваем заново.

Большая... Нам нужно вести статистику сбоев... А она подразумевает классификацию сбоев... Эта статистика позволит нам потом выявить самое слабое место устройства и принять соответствующие меры


Цитата(defunct @ Feb 14 2008, 03:45) *
idle таск'е - в той единственной задаче, которая может сбрасывать WDT.
А поподробней... Т.е. эта задача обслуживает счётчики всех потоков и если какой-то оказывает, что наступил тайм-аут, то idle поток выполняет команду wdr и ждёт сброса? Так чтоли?
defunct
Цитата(Дон Амброзио @ Feb 14 2008, 02:56) *
Здорово... Я бы конечно лучше бы юзал процессоры, в которых АППАРАТНО заложен контроль доступа к отдельным логическим сегментам кода.. Представляете как бы было здорово..

Так в чем вопрос - переходите на ARM с MMU. В старших моделях (920T и выше) мало того, что каждому килобайту памяти можно настроить параметры доступа, так еще определяется и "выровнянность" кода. А если прыгнули внутри одного блока - то DATA_ABORT обеспечен, т.к. сбой произойдет из-за искаженных данных. Но и в младших моделях некоторые прелести MMU есть, а цена такая же как и на меги.

Цитата
Дык всё же Вы какие процы используете? Вы вроде говорили, что те, у которых по таймауту WDT происходит не сброс , а прерывание

разные. и те что с прерывание от WDT и те, что только со сбросом..

Цитата
Большая... Нам нужно вести статистику сбоев... А она подразумевает классификацию сбоев... Эта статистика позволит нам потом выявить самое слабое место устройства и принять соответствующие меры

Может тогда проще снимать слепок всей периферии и RAM'a. Складывать куда-то во внешний eeprom. Потом вычитывать его и анализировать. Это будет много надежней, достоверней и информативней чем то, что программа сможет обнаружить сама.

Цитата
А поподробней... Т.е. эта задача обслуживает счётчики всех потоков и если какой-то оказывает, что наступил тайм-аут, то idle поток выполняет команду wdr и ждёт сброса? Так чтоли?

Да именно так, чтобы свести риск пропуска сбоя до минимума.
Критическим задачам короткий таймаут, некритическим - большой.
Дон Амброзио
Цитата(defunct @ Feb 14 2008, 03:55) *
Вообще-то да. Потому что к фатальным последствиям приведет как раз неучтенный случай из оставшихся 10%. А раз все не покрывается, то "овчинка выделки не стоит".

Странная логика... Но ведь если не применить эти методы то вероятность этих фатальных последствий возрастёт в 10 раз.... А если учесть , что у вас 10 000 девайсов работают.. Получается вообще говоря не хилая защита... Т.е. вместо 100 000 не обнаруженных сбоев у Вас будет только 10 000... А 90 000 (каждый из которых мог бы если его не обнаружить стать фатальным) Вам удасться предотвратить... И эта по Вашему ерунда?

Цитата(defunct @ Feb 14 2008, 04:06) *
Может тогда проще снимать слепок всей периферии и RAM'a. Складывать куда-то во внешний eeprom. Потом вычитывать его и анализировать. Это будет много надежней, достоверней и информативней чем то, что программа сможет обнаружить сама.

Да это было бы здорово, но для атмег на практике не реализуемо

Цитата(defunct @ Feb 14 2008, 04:06) *
Да именно так, чтобы свести риск пропуска сбоя до минимума.
Критическим задачам короткий таймаут, некритическим - большой.


Да...Но дело всё в том, что время между двумя запусками IDLE задачи может оказаться в десятки раз больше тайма-аута самых критических задач... Например у меня для самых критических по времени задач тайм-аут составляет 6 мС... А Время между запусами IDLE-потока колеблется от 1 до 10 Сек
defunct
Цитата(Дон Амброзио @ Feb 14 2008, 03:21) *
Да это было бы здорово, но для атмег на практике не реализуемо

Почему?!
Что мешает по прерыванию WDT вычитать все регистры периферии, переинициализировать UART и выдать слепок памяти "как есть" в консоль. После чего девайс уходит на перезагрузку.

Как минимум
m88/m168/m640/1/m1280/1/ и т.п.
позволяют так сделать.

Цитата
Но дело всё в том, что время между двумя запусками IDLE задачи может оказаться в десятки раз больше тайма-аута самых критических задач... Например у меня для самых критических по времени задач тайм-аут составляет 6 мС... А Время между запусами IDLE-потока колеблется от 1 до 10 Сек

Ну это уже конкретная реализация системы..
Для такой реализации можно перенести WDR в kernel-level задачу. Но идея остается неизменной - команда WDR должна быть одна на всю программу, и должна вызываться только тогда когда достоверно известно, что все задачи в порядке.
Дон Амброзио
Цитата(defunct @ Feb 14 2008, 04:34) *
Почему?!
Что мешает по прерыванию WDT вычитать все регистры периферии, переинициализировать UART и выдать слепок памяти "как есть" в консоль. После чего девайс уходит на перезагрузку.

Как минимум
m88/m168/m162/m640/1/m1280/1/ и т.д.
позволяют так сделать.

Но в этом случае опять же устройство будет делать всё это само.... Я думал Вы подразумеваете "вычитывание" содержимого периферии внешним узлом например с помощью SPI.
А так как Вы говорите конечно можно сделать.. Но ведь не факт, что не покоцался сам код передатчика по UART
defunct
Цитата(Дон Амброзио @ Feb 14 2008, 03:40) *
Но в этом случае опять же устройство будет делать всё это само.... Я думал Вы подразумеваете "вычитывание" содержимого периферии внешним узлом например с помощью SPI.
Нет, внешним узлом никак....
Цитата
А так как Вы говорите конечно можно сделать.. Но ведь не факт, что не покоцался сам код передатчика по UART

Дык, разместите этот код в секции бутлоадера и поставьте Fuse защиты от SPM. Будет полная гарантия того, что код обработчика WDT - жив.
Rst7
Цитата(galjoen @ Feb 13 2008, 17:53) *
Объясните, как-же у вас в таких корпусах от наносекундных помех ничего не сбивается? Вы экраны ставите? Или как вы этого добиваетесь?


Да нет там экранов. Просто выполнено как положено, не раз тут методики правильного проектирования обсуждали. Хотя, кое-где этими методиками пренебрегли и имели на первой итерации испытаний бледный вид и зад в мыле (потому как отправляли человека, который проводил испытания, пить кофе, а за это время костылями переделывали, потом, конечно, правили платы (как один прибор испытания прошел, до сих пор поражаюсь, там такая петля была по земле, жуть... видно было, что сейчас упадет, но асилил. Быстренько бросили гвоздь поверх и все сразу полегчало) и схемотехнику (тут обычно ничего страшного, просто там забыли суппрессор или там забыли что-то)). А с другой стороны, например, центральный прибор с основным мозгом четыре круга нарезал по нс и мкс, потому как мелочь всякая в комплекте с ним проверялась и хоть бы хны...

Цитата
Только без обид. Rst7, заранее извиняюсь! Простите, что первое на ум пришло написал. А стирать жалко.


Да ладно. Не увлекайтесь только...
galjoen
Цитата(defunct @ Feb 14 2008, 03:33) *
Ну и Вы сами говорите что 100% нельзя отловить, а раз 100% нельзя отловить то зачем их ловить?!

CRC тоже 100% защиты не даёт. CRC16 не более чем в 65536 раз защищённость повышает, а CRC32 не более чем в 0x100000000 раз. Что тогда и CRC не пользоваться? Это-же не 100%!
Цитата(defunct @ Feb 14 2008, 03:45) *
Конечно сбой надо продетектить,

+1
Цитата(defunct @ Feb 14 2008, 03:45) *
Речь о том, что до сброса мы не сможем отдетектить нарушение FLASH. Ну это просто очень накладно пересчитывать CRC флеша постоянно в процессе работы.

Совершенно не накладно. В задаче с наименьшим приоритетом по 1-му слову за раз. У меня это основной цикл. У вас это idle таск. Только срабатывать это должно не сразу. А например, когда 2 раза подряд CRC не совпало.
Цитата(defunct @ Feb 14 2008, 04:06) *
Так в чем вопрос - переходите на ARM с MMU. В старших моделях (920T и выше) мало того, что каждому килобайту памяти можно настроить параметры доступа, так еще определяется и "выровнянность" кода. А если прыгнули внутри одного блока - то DATA_ABORT обеспечен, т.к. сбой произойдет из-за искаженных данных. Но и в младших моделях некоторые прелести MMU есть, а цена такая же как и на меги.

У ARM код из ОЗУ берётся. А в ОЗУ код гораздо больше изменениям от помехи подвержен, чем во FLASH. Хотя-бы при переписывании его туда.
singlskv
Цитата(Дон Амброзио @ Feb 14 2008, 04:26) *
Странная логика... Но ведь если не применить эти методы то вероятность этих фатальных последствий возрастёт в 10 раз....

Клевые у Вас помехи, не подскажите где Вы их берете ? smile.gif
И прыгают они у Вас исключительно на код, а на данные размещенные во флеш
видимо никогда не прыгают, и на 32битные команды прыгают исключительно с
выравниванием по началу команды, в середину команды ни-ни, незя... 07.gif

Не отсыпите пару кило таких помех для прикручивания к своим проектам ?
А то, все как-то больше, непослушные помехи попадаються, так и норовят прыгнуть
куда-нить не туда... biggrin.gif
defunct
Цитата(galjoen @ Feb 14 2008, 09:11) *
Совершенно не накладно. В задаче с наименьшим приоритетом по 1-му слову за раз. У меня это основной цикл. У вас это idle таск. Только срабатывать это должно не сразу. А например, когда 2 раза подряд CRC не совпало.

Это вариант. Только я считаю, что это лишнее..
Ну просто не будет программа работать нормально если часть флеша слетит по причине прыжка на erase sequence в бутлоадере, не вернемся мы оттуда в ОС... Следовательно тут как раз WDT помощник.
Ну а если предположить, что мы все-таки вернулись после erase sequence в ОС и продетектили нарушение флеш в основной программе, что дальше? Выход ведь тот же самый - сброс и запуск бутлоадера.

Цитата
У ARM код из ОЗУ берётся. А в ОЗУ код гораздо больше изменениям от помехи подвержен, чем во FLASH. Хотя-бы при переписывании его туда.

У мелких АРМов (конкурентов мег) есть FLASH. Хотите размещайте во флеш, не хотите - копируйте и запускайте в RAM.
Дон Амброзио
Цитата(galjoen @ Feb 14 2008, 10:11) *
У ARM код из ОЗУ берётся.

Ээээ...Тогда они однозначно менее надёжны, поскольку ОЗУ попортить помехе гораздо легче чем ПЗУ

Цитата(singlskv @ Feb 14 2008, 12:38) *
И прыгают они у Вас исключительно на код, а на данные размещенные во флеш
видимо никогда не прыгают

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

Цитата(Rst7 @ Feb 14 2008, 09:25) *
Просто выполнено как положено, не раз тут методики правильного проектирования обсуждали.


+


Цитата(Rst7 @ Feb 14 2008, 09:25) *
до сих пор поражаюсь, там такая петля была по земле, жуть...



Странно.. Я читал совершенно другие "методики правильного проектирования". Что наооборот землю надо пускать кольцом по краю платы
Дон Амброзио
Не секрет, что стоимость простых MCU упала до стоимости одного транзистора. Т.е. менее 1$.
Для разработчиков открылась возможность использования в ОДНОМ устройстве сразу несколько MCU.
Использовали ли Вы в своих разработках многопроцессорные конфигурации. Но не с целью добавить функциональность, а конкретно с целью увеличения надёжности работы устройства (горячее резервирование, мажоритарное голосование и т.д.)

Интересует что конкретно вы реализовывали в многопроцессорных конфигурациях и за счёт чего увеличивали надёжность.. Интересуют использованные вами принципы и нюансы реализации
zltigo
Цитата(Дон Амброзио @ Feb 14 2008, 18:56) *
Не секрет...

Для затравки 5 эпизод. http://www.iosifk.narod.ru/engineer_storys.htm

Moderator:
Перенес эту тему в существующую ветку. Если получится хоть сколь-нибудь конструктивное обсуждение - обещаю выделить в отдельную тему.
Rst7
Цитата
Странно.. Я читал совершенно другие "методики правильного проектирования". Что наооборот землю надо пускать кольцом по краю платы


Я немного не так выразился, видимо. Там просто минус питания проца был присоединен в такую точку, на которой потенциал сильно подпрыгивал при попадании на внешний интерфейс испытательного импульса (или непосредственно в минус этого интерфейса, соединенного с землей, или в плюс, который соединен с минусом через суппрессор). Надежно было убрано организацией пути тока мимо этого отростка. Так что там не совсем петля была...
singlskv
Цитата(Дон Амброзио @ Feb 14 2008, 18:35) *
Прыгают и на данные, но я данные храню в специальном дезактивированном формате, поэтому если даже проц запрыгнет на данные ничего ужасного не произойдёт...
Ой..., а Вы не просветите нас про Ваш дезактивированный формат ? или еще
не придумали как это должно выглядеть... biggrin.gif
Ну и как-то вопрос про 32бит команды был обойден, не нравятся неудобные вопросы ?
Дон Амброзио
Цитата(singlskv @ Feb 14 2008, 21:10) *
Ой...

Да ничо, ничо lol.gif

Цитата(singlskv @ Feb 14 2008, 21:10) *
а Вы не просветите нас про Ваш дезактивированный формат ? или еще
не придумали как это должно выглядеть...

Почему же...Придумал.. И давно уже юзаю...У меня данные храняться в команде CPI Rd , K.
Как Вы, конечно же знаете, код этой команды 0011KKKK ddddKKKK. Отсюда 12 из 16 бит ячейки флэшь можно заюзать под данные. Т.е. 25% объёма флешь мы теряем в случае такого способа хранения данных.. Но зато !!!! Если в результате случайного джампа проц попадёт на область данных, то он просто выполнить цепочку команд CPI Rd , K а в конце области данных у меня стоит джамп JMP CRASH
singlskv
Цитата(Дон Амброзио @ Feb 14 2008, 21:35) *
Почему же...Придумал.. И давно уже юзаю...У меня данные храняться в команде CPI Rd , K.
Как Вы, конечно же знаете, код этой команды 0011KKKK ddddKKKK. Отсюда 12 из 16 бит ячейки флэшь можно заюзать под данные. Т.е. 25% объёма флешь мы теряем в случае такого способа хранения данных.. Но зато !!!! Если в результате случайного джампа проц попадёт на область данных, то он просто выполнить цепочку команд CPI Rd , K а в конце области данных у меня стоит джамп JMP CRASH
Хотелось бы увидеть реальный пример хранения ну например таблиц CRC16 modbus в
"дезактевированном" состоянии.... laughing.gif
Цитата
Нет в ATmega-х таких команд
Ээээ..., Вы правда знаете все команды ATmega ?
LDS,STS это какие-то другие команды ? не 32 бит ?
Ну уж просветите, наш Гуру...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.