|
|
  |
Как заполнить свободную память?, программная защита |
|
|
|
Sep 27 2007, 15:27
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378

|
Цитата(namelos @ Sep 25 2007, 16:38)  Доброе время суток, господа эмбеддеры. Написал программу в AVRStudio-WinAVR 20070525(avr gcc 4.1.2) . В целях защиты хотелось бы заполнить сводное место Flash-памяти "rjmp 0" и посчитать CRC всего кода программы для проверки целостности. Подскажите пожалуйста, как мне это реализовать. Если можно поподробнее. Заранее спасибо. Чтобы проц поменьше слетал , очень важно !!! сделать правильную разводку питания на проц. Как показывает опыт , при правильной разводке питания может даже не потребоваться собака ( если конечно же речь не идёт о сверхмощьных ЭМ помехах вблизи ) . Это первое . Если хочется побольше надёжность , - совет - не жмитесь и ставьте внешний тактовый генератор . В крайнем случае , если такой возможности нет , то включите у проца бит максимальной амплитуды тактового сигнала . Но внешний генератор вне конкуренции . Не жмитесь на фильтрацию по питанию . Очень непомешает внешний супервизор с отличным от Brown-out проца значением . Т.е. например Brown-out проца заводишь на 4 вольта , а внешний применяешь со значением 4,5 вольта ( например MCP-450 производства Microchip ). Если внешний сброс не применяешь , то через 1 килоом вывод сброса на питание проца , и его же через 0,1 микрофарата об землю. Собаку я включал последний раз лет 5 назад . При тысячах едениц выпущенной продукции вроде бы нареканий нет. Что касается rjmp 0 , то как правильно уже было замечено , должно быть jmp 0 , но смысл в этом нулевой . При старте можно сделать проверку CRC кода (ATMEL в одном из app. показывает как это сделать ) , и если битая память , то заставить девайс перепрошить . Если всё это делаешь , то забываешь о rjmp 0 и о jmp 0 Удачи
|
|
|
|
|
Sep 27 2007, 20:57
|
Участник

Группа: Участник
Сообщений: 38
Регистрация: 12-01-07
Из: Крым
Пользователь №: 24 378

|
Цитата(defunct @ Sep 27 2007, 20:10)  У Вас либо очень простая программа, либо Вы один из немногих гениев которые не допускают ошибок. WDT не защищает от помех, WDT может защитить от программных ошибок - зацикливания, тупиковых состояний КА и т.п. Ни то , ни другое . Что касается программ , то по обьёму кода программы конечно же разные , но как правило не менее 30-40К памяти программ ( все программы пишу на асме ) Так что не очень они маленькие , я вас уверяю . И проц шуршит аж воротник заворачивается - прерывание на прерывании . И пожалуйста только не надо приводить старые как мир догмы - писали бы на Си . . . Я и на Си могу , но для меня асм комфортнее . Гением конечно же себя не считаю , и ошибки бывают , кто не грешен ? WDT не защищает от помех, WDT может защитить от программных ошибок - зацикливания, тупиковых состояний КА и т.п. Это что же получается - производители вводят в проц апаратные вещи для защиты от кривых программистов ? Неожиданная мысль , очень неожиданная . На самом деле это не совсем так . Вы не задумывались почему некоторые процы (рядовые) ( например MSC-51) работают на 50 MHz , а у AVRов пока планка в 20-24 MHz ? Дело в том , что у AVRов выборка команды производится за 1 такт генератора , но за 4 внутренних такта , которые формируются специальной внутренней аппаратной схемой .Так вот - сбой хотя бы по одному из этих подтактов приводит к разным непредсказуемым последствиям (и подвисаниям в том числе ) . Именно поэтому важна хорошая форма тактовых импульсов , так как на основании её формируются внутренние подтакты . Некоторые производители ( NEC например) применяют для защиты от такого рода вещей специальный аппаратный механизм правильной выборки команды из памяти программ. Именно для подобных вещей держат псов , а не для защиты от программистов !!! . Небольшое лирическое отступление-: когда - то давно , когда я ещё был студентом , нас то и дело доставал препод по программированию составлением алгоритмов . Всех это уж очень достало , и я один раз в сердцах спросил - когда же вместо вской ерунды мы начнём изучать языки программирования ?. На что получил ответ , который оценил позднее - язык программирования это инструмент , а программа - это исскусство и часть души . В корявых руках и скрипка Страдивари будет не более чем куском дерева . Умный был ( надеюсь ещё есть ) препод . Лет 10 назад делал одну програмку . Писал , она работала , дописывал , она опять работала , пока в один момент всё не стало работать очень коряво . . . ( справедливости ради надо сказать что у неё была очень сложная структура ) . Разбираться в огромном куске кода небыло никакого желания - крышу срывало. Было принято волевое решение - взять и разрисовать прогу на блоки , сначала крупные , потом помельче , потом ещё мельче . В итоге ( после месяца спания по 4-5 часов за ночь ) - получилась структурная схема программы. Она была очень тщательно осмыслена и проверена на логику работы . Меня тогда удивило - по структурной схеме мне только и оставалось что просто тупо подставлять ассемблерные операторы , что у меня получалось очень и очень быстро ( за неделю одолел 32К ). Кстати , предыдущий кусок весил 36К . Первое включение после компиляции и прошивки и . . . . . каково же было моё удивление , что программа заработала сразу , и без малейших шороховатостей . Я после включения не изменил в программе ни одной буквы , так до сих пор и работает . После этого случая я любую программу пишу именно так - сначала хорошо обдумываю всю структуру программы , тратя на это прилично времени , затем начинаю на бумаге делать наброски , потом всё чётче и чётче вырисовывается программа , нечто наподобе проявки фотографии , или прорисовки художника. Совет - хотите писать хорошие программы - делайте именно так - я вас уверяю - времени в итоге тратится меньше , сохраняется "бумажная копия" работы программы ( в которой может разобраться при необходимости практически любой грамотный человек , даже далёкий от программирования ). А ошибки ищются на ура . И никакой язык программирования не сравнится по наглядности ( Си в том числе ) . . . Поэтому лично для меня какие из операторов подставить в программу - асм или Си особого значения не имеет . От кривых рук программиста не спасёт ни собака , ни другие аппаратные вещи .
|
|
|
|
|
Sep 27 2007, 22:56
|
Частый гость
 
Группа: Новичок
Сообщений: 173
Регистрация: 3-09-04
Из: Moscow
Пользователь №: 595

|
Цитата После этого случая я любую программу пишу именно так - сначала хорошо обдумываю всю структуру программы , тратя на это прилично времени Подтверждаю. Из своего немалого опыта программирования для PC вынес (правда, не сразу) эту же мысль - чем больше времени потратишь на тщательное продумывание программы (прежде чем прикасаться к клавиатуре), тем меньше общее время "продумывание+написание+отладка+доведение_до_ума".
|
|
|
|
|
Sep 28 2007, 02:09
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(aaarrr @ Sep 28 2007, 08:27)  Вставлю-ка я свои 5 копеек: Как уже упоминалось ранее, значение 0xFFFF - это код команды SBRS R31, 7. ... SBRS - Skip if Bit in Register is Set 16-bit Opcode: 1111_111r_rrrr_0bbb Соответственно, опкод SBRS R31, 7 = 0xFFF7. Среди документированных я не нашёл инструкцию с опкодом 0xFFFF. Интересно, что делает контроллер, встретив такую инструкцию, пропускает?
|
|
|
|
|
Sep 28 2007, 02:47
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(aaarrr @ Sep 28 2007, 11:24)  AVR Studio декодирует так. Можно эмулятором проверить для надежности. Вот дизасемблер АВРстудии: +00000008: CFFA RJMP PC-0x0005 Relative jump +00000009: FFFF ??? Data or unknown opcode +0000000A: 0000 NOP No operation +0000000B: FFFF ??? Data or unknown opcode "...эмулятором проверить для надежности." - это шутка? Эмулятор даже документированные фичи не все отрабатывает.
|
|
|
|
|
Sep 28 2007, 07:26
|
Участник

Группа: Validating
Сообщений: 64
Регистрация: 16-06-05
Пользователь №: 6 073

|
В процессе отладки с JTAG-ICE на ATmega128 сам наблюдал как попадая на незапрограммированную область процессор доходит до конца флэша и начинает выполнение программы с начала.
Сообщение отредактировал AlexG - Sep 28 2007, 07:27
|
|
|
|
|
Sep 28 2007, 08:49
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Yuriy_AVR @ Sep 28 2007, 00:57)  Это что же получается - производители вводят в проц апаратные вещи для защиты от кривых программистов ? Неожиданная мысль , очень неожиданная . На самом деле это не совсем так . Вы не задумывались почему некоторые процы (рядовые) ( например MSC-51) работают на 50 MHz , а у AVRов пока планка в 20-24 MHz ? Дело в том , что у AVRов выборка команды производится за 1 такт генератора , но за 4 внутренних такта , которые формируются специальной внутренней аппаратной схемой .Так вот - сбой хотя бы по одному из этих подтактов приводит к разным непредсказуемым последствиям (и подвисаниям в том числе ) . Именно поэтому важна хорошая форма тактовых импульсов , так как на основании её формируются внутренние подтакты . Некоторые производители ( NEC например) применяют для защиты от такого рода вещей специальный аппаратный механизм правильной выборки команды из памяти программ. Именно для подобных вещей держат псов , а не для защиты от программистов !!! . Есть у меня одна неразрешенная загадка: в одной программе на MEGA8, интенсивно использующей инструкции Ldd/Std, иногда наблюдались ошибки на границах страницы ОЗУ 0x00..0x100. Это может быть тоже гонка фронтов? А на счет заполнения- NOP - и вся любовь Затем, после rjmp Start, обязательно, CLI и инициализация всего, чего надо, как будто мы не знаем ничего о начальных значениях портов. Теперь у нас "взбрык" от сброса внешне ничем не отличается.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|