Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глюк симулятора в AVR Studio v4.16 build 628
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
galjoen
Вот пришлось вернуться к своему старому проекту на AVR (на асме написанному). Когда его ваял - пользовался AVR Studio v3.56. А сейчас использовал v4.16. Слегка изменил перетранслировал - всё нормально.
Там у меня кое какие вычисления делаются. Такая же программа и для компа есть. Но куда то я задевал её. Но на AVR то тоже самое считается. Ну и решил в симуляторе запустить. Запускаю - через некоторое время вылетает. Думал я что то попортил. Отлаживал и так и сяк - всё равно вылетает. Такое ощущение, что WD срабатывает. Сброс его поставил - всё равно вылетает. Кучу времени на это убил...
Потом от безъисходности решил AVR Studio v3.56 попробовать. Запускаю в симуляторе - всё нормально считается! Сравниваю hex-файлы той и другой студией сделанные - одинаковые. Т.е. явно в симуляторе ошибка...
Как у более новых студий не знаю. Давно с AVR дела не имел...
ut1wpr
Цитата(galjoen @ May 19 2010, 14:11) *
Вот пришлось вернуться к своему старому проекту на AVR (на асме написанному). Когда его ваял - пользовался AVR Studio v3.56. А сейчас использовал v4.16. Слегка изменил перетранслировал - всё нормально.
Там у меня кое какие вычисления делаются. Такая же программа и для компа есть. Но куда то я задевал её. Но на AVR то тоже самое считается. Ну и решил в симуляторе запустить. Запускаю - через некоторое время вылетает. Думал я что то попортил. Отлаживал и так и сяк - всё равно вылетает. Такое ощущение, что WD срабатывает. Сброс его поставил - всё равно вылетает. Кучу времени на это убил...
Потом от безъисходности решил AVR Studio v3.56 попробовать. Запускаю в симуляторе - всё нормально считается! Сравниваю hex-файлы той и другой студией сделанные - одинаковые. Т.е. явно в симуляторе ошибка...
Как у более новых студий не знаю. Давно с AVR дела не имел...

Интересный и захватывающий рассказ. Однако, либо я пропустил, либо... Ни одного знака вопроса в тексте!
galjoen
Цитата(ut1wpr @ May 19 2010, 15:21) *
Интересный и захватывающий рассказ. Однако, либо я пропустил, либо... Ни одного знака вопроса в тексте!

Новые темы создаются не только с вопросами. Но и с новостями и т.д. Прочитайте правила...
alag57
Цитата(galjoen @ May 19 2010, 17:40) *
Новые темы создаются не только с вопросами. Но и с новостями и т.д. Прочитайте правила...

Ну так это действительно просто рассказ.
Цитата
через некоторое время вылетает

Кто вылетает? Студия? Отладчик виснет? Винда синий экран кажет?
Как-то бы поподробней smile.gif
У меня при живой программе все работает нормально. Может код для опробования выложить?
Интерес в том, чтобы разобраться, в чем проблема. Может быть это все-таки не новость?
V_G
Текущий билд имеет номер 700. Так что это даже не новость.
Чтобы рассказ не звучал голословно, стоит конкретизировать претензии к AVRStudio. Тем более, что на вычислительном софте глюки AVR действительно встречаются редко.
demiurg_spb
Цитата(galjoen @ May 19 2010, 15:11) *
Отлаживал и так и сяк - всё равно вылетает.Такое ощущение, что WD срабатывает.
Сброс его поставил - всё равно вылетает. Кучу времени на это убил...
Если склероз мне не изменяет, то WD в студии никак не роялит.
galjoen
Цитата(alag57 @ May 19 2010, 16:22) *
Кто вылетает? Студия? Отладчик виснет? Винда синий экран кажет?
Как-то бы поподробней smile.gif

Вылетает на адрес сброса. Если там установлен 0, то с 0 начинает команды выбирать. Если установить 0xF000, то пишет, что оттуда неверный опкод прочитан (это приложение, у меня загрузчик в другом проекте)
Цитата(alag57 @ May 19 2010, 16:22) *
У меня при живой программе все работает нормально. Может код для опробования выложить?
Интерес в том, чтобы разобраться, в чем проблема. Может быть это все-таки не новость?

Сейчас ещё поэкспериментировал. Оказывается вылетает на подсчёте CRC16 FLASH.
Код
.DEF RBN0=R12
.DEF RBN1=R13
FlAC:; готовимся к подсчёту CRC-16 FLASH Приложения
    eor    RBN0,RBN0; обнуление CRC
    eor    RBN1,RBN1; аккумулятора
    ldi    ZL,low(TbFlAd<<1); Z - ук-ль на таблицу блоков
    ldi    ZH,high(TbFlAd<<1); с подсчётом CRC во FLASH
    movw    R1:R0,ZH:ZL; сохраним адрес в R0, R1
FlAC1:    movw    ZH:ZL,R1:R0; ук-ль на таблицу адресов
    lpm    YL,Z+    ; адрес начала
    lpm    YH,Z+    ; очередного блока
    add    YL,YL    ; перейдём от
    rol    YH    ; слов к байтам
; при увеличении кода сверх FFFF так работать не будет
    brcs    FlAC3    ; C=b15=1 -> посчитано, на сравнение
    lpm    XL,Z+    ; адрес конца
    lpm    XH,Z+    ; очередного блока
    add    XL,XL    ; перейдём от
    rol    XH    ; слов к байтам
    movw    R1:R0,ZH:ZL; сохраним адрес таблицы в R0, R1
    sub    XL,YL    ; X = конец - начало (в байтах)
    sbc    XH,YH    ; = кол-во байт в блоке (сч-к)
FlAC2:; цикл вычисления CRC байта из FLASH
    wdr        ; сбросим Watchdog (попытка справится с отладчиком)
    movw    ZH:ZL,YH:YL; адрес во FLASH (байтовый)
    adiw    YH:YL,1    ; inc адреса счётных байт
    lpm    ZL,Z    ; очередной байт из FLASH (токо до FFFF!)
    eor    ZL,RBN1    ; проксорим данные с.б. старого CRC
    ldi    ZH,Hi1021; там с.б. таблицы 2110
    elpm    RBN1,Z    ; это с.б. т.к. таблица переставлена
    eor    RBN1,RBN0; получили с.б. нового CRC
    ldi    ZH,Lo1021; там м.б. таблицы 2110
    elpm    RBN0,Z    ; м.б. CRC просто из таблицы
; вычислено CRC очередного байта
    sbiw    XH:XL,1    ; уменьшим счётчик
    brne    FlAC2    ; циклимся (подсчёт CRC-16 блока)
    rjmp    FlAC1    ; циклимся (переход к след. блоку)
FlAC3:; CRC-16 подсчитано - сравним с тем, что д.б.
.....
TbFlAd:; таблица адресов подсчёта CRC у Flash
.dw CRC_B1, CRC_E1; начало (включительно) и конец (исключительно)
.dw CRC_B2, CRC_E2
.dw CRC_B3, CRC_E3
.dw CRC_B4, CRC_E4
.dw CRC_B5, CRC_E5
.dw 0xFFFF; признак конца этой таблицы

RAMPZ0=1, поэтому lpm обращается к 1-й половине FLASH, а elpm ко 2-й.
Во второй половине по адресу Hi1021 лежит выровненная (мл. байт адреса =0) таблица ст. байтов CRC 1021. Lo1021 - соответственно младшие байты. Но это, скорее всего, не сыграет.
Всё остальное в 1-й половине FLASH.
Когда подсчитывается небольшой блок, то всё нормально. Но при большом отладчик вылетает на адрес запуска. Кстати, а не при подсчёте ли того блока, в котором находится эта самая программа? Надо будет проверить.
Прерывания запрещены, введение сброса WD в цикл не повлияло...
Ах да, процессор AT90CAN128.

Последними билдами AVR Studio не пользовался т.к. вообще давно AVR не занимался. Но судя по тому, что глюк с невозможностью программирования загрузчика из hex-файла с помощью AVRISPMK2 кочует из версии в версию, думаю, что и этот глюк присутствует в поздних версиях...
alag57
Приведи еще определения CRC_B1, CRC_E1, CRC_B2, CRC_E2, CRC_B3, CRC_E3, CRC_B4, CRC_E4, CRC_B5, CRC_E5.
И пару-тройку строк начиная с FlAC3. И адрес FlAC.

А пока замечу про оригинальность подсчета CRC с использованием полинома.
Я делал подсчет CRC области апликейшена из секции загрузчика, там все нормально считается и отлаживается.

Цитата
глюк с невозможностью программирования загрузчика из hex-файла с помощью AVRISPMK2 кочует из версии в версию

Не понял. Поясни, что значит невозможность программирования загрузчика.
galjoen
Цитата(alag57 @ May 20 2010, 10:00) *
Приведи еще определения CRC_B1, CRC_E1, CRC_B2, CRC_E2, CRC_B3, CRC_E3, CRC_B4, CRC_E4, CRC_B5, CRC_E5.
И пару-тройку строк начиная с FlAC3. И адрес FlAC.

Вот таблица с CRC_Bx и CRC_Ex. Это обычные метки, стоящие в начале и конце блока, в котором считается CRC
Код
                 TbFlAd:; таблица адресов подсчёта CRC у Flash
001cab 0000
001cac 004a       .dw CRC_B1, CRC_E1; начало (включительно) и конец (исключительно)
001cad 007e
001cae 1cb6       .dw CRC_B2, CRC_E2
001caf 1cb9
001cb0 2859       .dw CRC_B3, CRC_E3
001cb1 2880
001cb2 5e53       .dw CRC_B4, CRC_E4
001cb3 5e80
001cb4 64b2       .dw CRC_B5, CRC_E5
001cb5 ffff       .dw 0xFFFF; признак конца этой таблицы

Вот таблица правильной CRC и пример установки меток CRC_Xx:
Код
CRC_E4:; конец 4-го блока во FLASH, где надо считать CRC
TbCRC16: .db 0x2C, 0xA8; CRC-16 Flash (для контроля), тут CRC не считаем
CRC_B5:; начало 5-го блока во FLASH, где надо считать CRC

Вот адрес FLAC и несколько строк после FLAC3:
Код
                 FlAC:; готовимся к подсчёту CRC-16 FLASH Приложения
001a45 24cc          eor    RBN0,RBN0; обнуление CRC
..........
                 FlAC3:; CRC-16 подсчитано - сравним с тем, что д.б.
001a70 e7e0          ldi    ZL,low(TbCRC16<<1); Z = адрес
001a71 e3f9          ldi    ZH,high(TbCRC16<<1); правильного CRC-16
001a72 91a5          lpm    XL,Z+    ; м.б. того, что д.б.
001a73 91b4          lpm    XH,Z    ; с.б. того, что д.б.
001a74 25ac          eor    XL,RBN0    ; порксорим тем,
001a75 25bd          eor    XH,RBN1    ; что получилось
001a76 2bab          or    XL,XH    ; =0 -> совпало
001a77 f479          brne    ChBd16    ; Z=0 - CRC не совпало

Цитата(alag57 @ May 20 2010, 10:00) *
А пока замечу про оригинальность подсчета CRC с использованием полинома.
Я делал подсчет CRC области апликейшена из секции загрузчика, там все нормально считается и отлаживается.

И что же там такого оригинального? На мой взгляд совершенно тривиальный подсчёт CRC16.
Приложение считает свою CRC. А дырки в нём возникают потому, что стоят .org для выравнивания адреса или, как в примере, само значение CRC для контроля.
Маленькие куски действительно считаются и отлаживаются нормально. А большие - нет. Причём независимо от попадания адреса на сам считающий CRC код.
Цитата(alag57 @ May 20 2010, 10:00) *
Не понял. Поясни, что значит невозможность программирования загрузчика.

http://electronix.ru/forum/index.php?showt...&hl=galjoen

ЗЫ А вообще, здесь принято обращаться на вы.
alag57
Цитата(galjoen @ May 20 2010, 14:39) *
А вообще, здесь принято обращаться на вы.

Извиняюсь. Я лично не против, если ко мне будут обращаться на ты. Но вы правы - правила есть правила.

Насчет программы - попробую у себя, отпишусь. И заодно еще один вопрос - адрес таблицы CRC. Хочу наиболее точно воспроизвести ситуацию.
demiurg_spb
Цитата(galjoen @ May 20 2010, 12:39) *
И что же там такого оригинального? На мой взгляд совершенно тривиальный подсчёт CRC16.
Приложение считает свою CRC.
Это ИМХО идеологически неправильно. Это обязанность бута.
galjoen
Цитата(alag57 @ May 20 2010, 13:25) *
И заодно еще один вопрос - адрес таблицы CRC. Хочу наиболее точно воспроизвести ситуацию.

Код
          .SET BgLd=LARGEBOOTSTART-0x1000; начало таблицы CRC16 1021 (2110)
          .SET Lo1021=high(BgLd<<1); ук-ль на 256 младших байт
          .SET Hi1021=high((BgLd<<1)+0x100); ук-ль на 256 старших байт
.....
          .org BgLd
          .db 0x00, 0x21, 0x42, 0x63, 0x84, 0xA5, 0xC6, 0xE7; т.е. это Lo1021
00e000 2100
00e001 6342
00e002 a584
00e003 e7c6
....
          .db 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70; т.е. это Hi1021
00e080 1000
00e081 3020
00e082 5040
00e083 7060

Цитата(demiurg_spb @ May 20 2010, 13:25) *
Это ИМХО идеологически неправильно. Это обязанность бута.

Бут тоже считает CRC приложения. Но это приложение работает не выключаясь месяцами (т.е. в бут не заходит), хотя 80% времени спит, просыпаясь по часам раз в секунду на пару милисекунд. Проверяет не нужно ли поработать, и в 99.9% случаев снова засыпает. Но если решит, что нужно поработать, то перед работой посчитает свою CRC, а также CRC ОЗУ.
Там есть ещё множество подобных фич, но они к теме не относятся...
И вообще, предлагаю не отклонятся от обсуждения глюка в отладчике.
aleksey_g
Глюки действительно имеют место быть.
У меня, например, малюсенький проектик на тиньке13 в железе работает великолепно.
(Правда, скомпиленый на С под ИАР_ом)
В АВРСИМУЛЯТОРЕ - регулярные сбросы!
В АВРСИМУЛЯТОРЕ 2 - все пучком.
Вы чем симулите? Может тот же случай?
demiurg_spb
Цитата(galjoen @ May 20 2010, 14:19) *
Бут тоже считает CRC приложения. Но это приложение работает не выключаясь месяцами (т.е. в бут не заходит), хотя 80% времени спит, просыпаясь по часам раз в секунду на пару милисекунд. Проверяет не нужно ли поработать, и в 99.9% случаев снова засыпает. Но если решит, что нужно поработать, то перед работой посчитает свою CRC, а также CRC ОЗУ.
Там есть ещё множество подобных фич, но они к теме не относятся...
Ок. Последнее. А это действительно имеет смысл? Для атомной станции девайс?
galjoen
Цитата(aleksey_g @ May 20 2010, 15:18) *
В АВРСИМУЛЯТОРЕ - регулярные сбросы!
В АВРСИМУЛЯТОРЕ 2 - все пучком.
Вы чем симулите? Может тот же случай?

Честно сказать - не знаю. А где выбирается симулятор? М.б. у меня и нет АВРСИМУЛЯТОРА 2? Версия AVR Studio то старая, а не обновлял т.к. давно АВРом не занимался. Да ещё боюсь, что в новых версиях новые глюки...
Вон в ассемблере Version 1 - если в .dw неописанную метку поставить, он не ругнётся, а просто 0 туда подставит.
А какой глюк в Version 2 я уже не помню. Какой то сложный, что то с арифметическими вычислениями, с деленим на 0 что ли? Но главное, что у них глюки разные. Т.е. если обоими оттранслировать, и там и там чисто, то и в действительности всё нормально.
Цитата(demiurg_spb @ May 20 2010, 15:24) *
А это действительно имеет смысл? Для атомной станции девайс?

А руки с мылом перед едой имеет смысл мыть?
Девайс не для атомной, а для дизельной станции.
demiurg_spb
Цитата(galjoen @ May 20 2010, 15:57) *
А руки с мылом перед едой имеет смысл мыть?
Не всегда.
Цитата
Девайс не для атомной, а для дизельной станции.
Хорошо.
С проверкой RAM я соглашусь, ну а для проверки flash из приложения ИМХО разумнее вызывать функцию, находящуюся в секции загрузчика.
А то сам себя "напроверяешь"...
galjoen
Цитата(demiurg_spb @ May 20 2010, 17:38) *
С проверкой RAM я соглашусь, ну а для проверки flash из приложения ИМХО разумнее вызывать функцию, находящуюся в секции загрузчика.

Доступ к загрузчику из приложения д.б. запрещён!
Сергей Борщ
Цитата(galjoen @ May 20 2010, 17:27) *
Доступ к загрузчику из приложения д.б. запрещён!
На запись и в некоторых устройствах на чтение. Но как, и, главное, зачем запрещать выполнение команды JMP/RJMP на область загрузчика?
V_G
Цитата(galjoen @ May 21 2010, 01:27) *
Доступ к загрузчику из приложения д.б. запрещён!

Не факт. Я пользуюсь п/п записи в EEPROM (и еще чем-то) из загрузчика. Единственно, что загрузчик должен быть раз и навсегда одинаковым, чтобы адреса п/п не поплыли. Ну, или как-то особо об этом заботиться.
aleksey_g
Цитата(galjoen @ May 20 2010, 14:57) *
Честно сказать - не знаю. А где выбирается симулятор? М.б. у меня и нет АВРСИМУЛЯТОРА 2?

В верхнем меню студии:
Debug/Select Platform and Device... - в левом окошке выбираем, каким симулятором будем пользоваться.
galjoen
Цитата(Сергей Борщ @ May 20 2010, 23:13) *
На запись и в некоторых устройствах на чтение. Но как, и, главное, зачем запрещать выполнение команды JMP/RJMP на область загрузчика?

Эти запреты с целью защиты от копирования сделаны. Там, даже прерывания разрешаются только если таблица прерываний в загрузчике. Т.е. это защита от восстановления кода команды по произведённым ею изменениям.
А я о том, что программа должна с любым загрузчиком работать. И при отсутствии загрузчика вообще. Переносимость. Да и запустить программирование FLASH, при работе с несоответствующим загрузчиком есть вероятность. В т.ч. поэтому вызовов быть не должно.
А считать собственное CRC приложение просто обязано - не только контроль FLASH, но без этого защита от копирования крайне малоэффективной становится...
Цитата(aleksey_g @ May 21 2010, 11:03) *
В верхнем меню студии:
Debug/Select Platform and Device... - в левом окошке выбираем, каким симулятором будем пользоваться.

Спасибо, нашёл.
Там у меня AT90CAN128 в списке нет. Сейчас посмотрю у кого, из тех, что есть, 128 FLASH и RAMPZ0 на том же месте. Нет, сначала новую версию скачаю. М.б. там есть?
demiurg_spb
Цитата(galjoen @ May 21 2010, 16:54) *
А считать собственное CRC приложение просто обязано - не только контроль FLASH, но без этого защита от копирования крайне малоэффективной становится...
Типа это повышает защиту... Ну-ну...


Цитата(galjoen @ May 21 2010, 16:54) *
Переносимость.

Точнее независимость от загрузчика - вот единственный соящий аргумент.
galjoen
Цитата(demiurg_spb @ May 21 2010, 18:07) *
Типа это повышает защиту... Ну-ну...

Да, повышает, и ирония тут не уместна. Если по 1-му байту за раз потихоньку CRC считать. И запускать подсчёт по нечастому событию, только не по таймеру. И по несовпадению флаг выставлять (через указатель), а реагировать на него в других местах...
При размере прошивки в несколько десятков килобайт такую защиту найти нереально. И, соответственно, в такой прошивке изменить что-либо нереально.

Ах да. Ещё нужно какой-нибудь малоизвестный производящий многочлен использовать. Можно даже самодельный. Иначе изменят так, что CRC совпадёт...
=GM=
galjoen, CRC на десятке килобайт может споткнуться, может сразу MD5 считать? Сильная вещь, если кто понимает, использовал её всего один раз для страшной организации по названию FIA.
demiurg_spb
Цитата(galjoen @ May 21 2010, 18:42) *
При размере прошивки в несколько десятков килобайт такую защиту найти нереально.
И, соответственно, в такой прошивке изменить что-либо нереально.

Просто тот кто для начала сломает аппаратную защиту (Lock-битную) наверняка с любой программной справится на раз.
И я всё в голову не возьму для чего защищать от изменения?
От копирования понятно, от чтения на предмет реверс-инженеринга тоже.
Цитата
Ах да. Ещё нужно какой-нибудь малоизвестный производящий многочлен использовать. Можно даже самодельный. Иначе изменят так, что CRC совпадёт...

Мёртвому припарки и паранойя ИМХО.
Цитата(=GM= @ May 21 2010, 18:58) *
galjoen, CRC на десятке килобайт может споткнуться, может сразу MD5 считать? Сильная вещь, если кто понимает,

CRC32 вполне хватает.
Цитата
использовал её всего один раз для страшной организации по названию FIA.

Для Формулы-1? :-)
galjoen
Цитата(=GM= @ May 21 2010, 18:58) *
galjoen, CRC на десятке килобайт может споткнуться, может сразу MD5 считать? Сильная вещь, если кто понимает, использовал её всего один раз для страшной организации по названию FIA.

Хотел MD5 в загрузчике считать, но там места для этого не хватило.
Цитата(demiurg_spb @ May 22 2010, 12:18) *
Просто тот кто для начала сломает аппаратную защиту (Lock-битную) наверняка с любой программной справится на раз.
И я всё в голову не возьму для чего защищать от изменения?
От копирования понятно, от чтения на предмет реверс-инженеринга тоже.

А зачем защиту в процессоре ломать, если можно просто обновлённое приложение в виде hex-файла скачать? Хоть и в зашифрованном виде. А уже потом сломать. Ресурс флеша 10000 записей... Вот тут MD5 в загрузчике помогла бы, но нет её с сожалению...
А во многих случаях как раз от изменения нужно защищать, а не от копирования.
На примере простейшего загрузчика с шифрованием, который здесь выкладывался, расскажу как защиту ломать. У того загрузчика просто ксорились страницы flash таблицей 256 байт. Тут уже некоторые байты известны т.к. в таблице переходов наверняка jmp/rjmp стоят. Но даже и без этого можно сломать. Достаточно менять по 1 байту до тех пор пока не попадёшь на какое-нибудь сообщение во flash. А у 99% сообщения из flash выводятся. Ну вот, сразу и будет видно какая там таблица ксоров. А дальше уже просто на другой странице свой кусочек кода добавляется.
demiurg_spb
Цитата(galjoen @ May 24 2010, 13:37) *
А зачем защиту в процессоре ломать, если можно просто обновлённое приложение в виде hex-файла скачать? Хоть и в зашифрованном виде. А уже потом сломать.
+1
Цитата
Ресурс флеша 10000 записей... Вот тут MD5 в загрузчике помогла бы, но нет её с сожалению...
А причём тут ресурс флеша?

Цитата
А во многих случаях как раз от изменения нужно защищать, а не от копирования.
На примере простейшего загрузчика с шифрованием, который здесь выкладывался, расскажу как защиту ломать. У того загрузчика просто ксорились страницы flash таблицей 256 байт.
Есть разные способы шифрования...

Цитата
Тут уже некоторые байты известны т.к. в таблице переходов наверняка jmp/rjmp стоят.
Кто же так по-простецки поступает???

Цитата
Но даже и без этого можно сломать. Достаточно менять по 1 байту до тех пор пока не попадёшь на какое-нибудь сообщение во flash. А у 99% сообщения из flash выводятся. Ну вот, сразу и будет видно какая там таблица ксоров. А дальше уже просто на другой странице свой кусочек кода добавляется.
Если бы всё было "так просто"...

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

Жму Вашу мужественную руку. Приятно было с Вами дискутировать.
=GM=
Цитата(demiurg_spb @ May 22 2010, 07:18) *
CRC32 вполне хватает

Не скажите, уже и в MD5 нашли дырки, так что у меня еще и seed буфер стоит и динамически меняется этой самой федерацией автомотоспорта на ходу.

Цитата(demiurg_spb @ May 22 2010, 07:18) *
Для Формулы-1? :-)

Ну вообще-то да, но как вы догадались?
galjoen
Цитата(demiurg_spb @ May 24 2010, 14:08) *
Но Вы меня так и не переубедили (а я Вас) в том что нужно (не нужно) в самом приложении проверять его целостность...

Раз уж зашла речь по автомобили, то там как раз это нужно. Допустим кто-то написал прошивку для ЭБУ, откатал на машине, и не хочет чтобы другие таблицы его настроек меняли (тюнинговали). А прошивку эту зашифровать в принципе невозможно - ну нет в загрузчике у стандартного ЭБУ никакого шифрования. И таблицы скрыть/зашифровать тоже невозможно, т.к. прошивка на 70% из них состоит. Да на расшифровывание и времени нет. Вот тут как раз проверка приложением собственной целостности и нужна.

Ну ладно, что то мы от темы отошли. Пока не проверил я АВРСИМУЛЯТОР2 - нет доступа к широкому каналу интернета, чтобы последнюю версию AVR Studio скачать.
aleksey_g
Посмотрел у себя. Студия 4.18 Build 692.
Для АВРСИМУЛЯТОР2 Ваш контроллер недоступен.
alag57
Цитата(galjoen @ May 27 2010, 15:15) *
Пока не проверил я АВРСИМУЛЯТОР2 - нет доступа к широкому каналу интернета, чтобы последнюю версию AVR Studio скачать.

Да нет там вашего кристалла. Я пробовал воспроизвести глюк на версии 700 - ничего не получается, отрабатывает нормально и с блоком 100 слов и 1000. Пробовал только на одном блоке. Кстати, посмотрите версию вашего кристалла при открытом проекте - Help->About->Version. У меня - AT90CAN128 170.
=GM=
Цитата(aleksey_g @ May 27 2010, 14:18) *
Посмотрел у себя. Студия 4.18 Build 692. Для АВРСИМУЛЯТОР2 Ваш контроллер недоступен

Странно, у меня студия 4.18 Build 692, а проц AT90CAN128 почему-то доступен.
aleksey_g
Цитата(=GM= @ May 27 2010, 18:50) *
Странно, у меня студия 4.18 Build 692, а проц AT90CAN128 почему-то доступен.

Для AVRSIMULATOR - доступен. А для AVRSIMULATOR2 - нет.
Нажмите для просмотра прикрепленного файла
galjoen
Цитата(alag57 @ May 27 2010, 19:36) *
Да нет там вашего кристалла. Я пробовал воспроизвести глюк на версии 700 - ничего не получается, отрабатывает нормально и с блоком 100 слов и 1000. Пробовал только на одном блоке. Кстати, посмотрите версию вашего кристалла при открытом проекте - Help->About->Version. У меня - AT90CAN128 170.

У меня так:
Цитата
AVR Studio 4.16.628
GUI Version 4, 16, 0, 626
AVR Simulator 1, 0, 2, 1
AT90CAN128 170

Operating System
Major 5
Minor 1
PlatformID 2
Build 2600
Service Pack 3

Plugins:

AvrPluginAvrAsmObject 1, 0, 0, 47
AvrPluginavrgccplugin 1, 0, 0, 10
Stk500Dll 1, 0, 1, 11


А в доступных для АВРСИМУЛЯТОР 2 кристаллах не вижу ни одного с 128 кбайт флеша и чтобы у него RAMPZ0 был bit0 по адресу 0x3B.

А м.б. 1000 слов мало для сбоя? Вот у меня на 2-м блоке сбивается: 0x7E...0x1CB6 - это 0x1C38 = 7224 слов 14448 байт.
demiurg_spb
Предлагаю уважаемым модераторам вычленить из этой темы разговоры
о целостности прошивки в отдельную тему например "Как и когда стоит защищать программу"


Цитата(=GM= @ May 27 2010, 01:53) *
Не скажите, уже и в MD5 нашли дырки,
Простите, а каков размер вашего бинарника?
Цитата
так что у меня еще и seed буфер стоит и динамически меняется этой самой федерацией автомотоспорта на ходу.
А что такое "seed буфер"?
Цитата
Ну вообще-то да, но как вы догадались?
Автомобили - моя страсть. Сам на Subaru зажигаю... И вообще, иногда я очень сообразителен:-)

Цитата(galjoen @ May 27 2010, 13:15) *
Раз уж зашла речь по автомобили, то там как раз это нужно. Допустим кто-то написал прошивку для ЭБУ, откатал на машине, и не хочет чтобы другие таблицы его настроек меняли (тюнинговали). А прошивку эту зашифровать в принципе невозможно - ну нет в загрузчике у стандартного ЭБУ никакого шифрования. И таблицы скрыть/зашифровать тоже невозможно, т.к. прошивка на 70% из них состоит. Да на расшифровывание и времени нет. Вот тут как раз проверка приложением собственной целостности и нужна.
Это вы о внешнем еепром толкуете? То это несколько другая тема и решаться ИМХО она может иначе. Я предпочитаю при разработке устройства заранее об этом подумать, чтобы потом не заморачиваться с изысками, а сосредоточится лишь на сути...

И у меня складывается впечатление, что Вы не читаете того, что я уже написал:
Цитата(demiurg_spb @ May 24 2010, 14:08) *
На мой взгляд - никакого практического смысла нет. И пусть даже оно работает месяцами без перезагрузки - шансы успеть отловить такую бяку на лету очень малы (по моим оценкам сильно меньше 1%).
Что есть сказать на сей счёт? А разговоры о MD5 - это уже вторично...
galjoen
Цитата(demiurg_spb @ May 28 2010, 13:00) *
Это вы о внешнем еепром толкуете? То это несколько другая тема и решаться ИМХО она может иначе. Я предпочитаю при разработке устройства заранее об этом подумать, чтобы потом не заморачиваться с изысками, а сосредоточится лишь на сути...

Не только внешний eeprom, я о тех случаях, когда программа пишется для уже имеющегося устройства, причём чужой разработки.
Цитата(demiurg_spb @ May 28 2010, 13:00) *
И у меня складывается впечатление, что Вы не читаете того, что я уже написал:
Что есть сказать на сей счёт?

Не знаю, как вы считаете шансы, м.б. объясните, но у меня получается более 50%.
1. Запорчен код исполняемой команды, которая выполнилась не правильно -> ватчдог, зацикливание на подсчёте CRC.
2. Запорчен код исполняемой команды, которая не выполнилась -> зацикливание на подсчёте CRC.
3. Запорчены данные в таблице -> зацикливание на подсчёте CRC.

В моём случае это была защита от продолжительной работы с испорченными данными в таблице. Вот это самое страшное, что может случится. Цикл подсчёта CRC32, которая считается по байту за раз, для всего флеша составляет 1..2 секунды. Ну вот и получается, что через 2 секунды такая ситуация будет отловлена. А за 2 секунды ничего страшного в принципе случится не может.

Ну а самый главный аргумент, это то, что такая защита делается очень просто. Побитное вычисление CRC32 по слову за раз, с вызовами, таблицами и т.д. - у меня это 88 строчек на асме, и 6 байт ОЗУ. И кочует из проекта в проект. Не понимаю, о чём тут спорить?
demiurg_spb
Цитата(galjoen @ May 28 2010, 13:30) *
Не знаю, как вы считаете шансы, м.б. объясните, но у меня получается более 50%.
Пусть даже вы считаете CRC по нескольку байт за раз посещения фоновой программы, а результат валидности флеша получаете лишь когда прошлись по нему целиком.
Пример с потолка: 32К флеша проверяем по 8 байт за проход: 32K/8 = 4K.
Грубо вероятность выполнения битой программы равна (100 - 100/4К) = 99,975%

Единственное что может иногда утешить:
Цитата(galjoen @ May 28 2010, 13:30) *
А за 2 секунды ничего страшного в принципе случится не может.
=GM=
Цитата(demiurg_spb @ May 28 2010, 08:00) *
1) Простите, а каков размер вашего бинарника?

2) А что такое "seed буфер"?

Памяти у меня 128 КБ, забито под 100 КБ, но MD5 алгоритм тестирует всю память.
Seed buffer это двойное слово (64 бита), которое вгрубе пристыковывается к началу тестируемой памяти и т.о. влияет на выходной context. Алгоритм работает в фоне, непрерывно вычисляя MD5, а посев никто не знает, я его получаю по кану от FIA, которая имеет весь мой код и может самостоятельно посчитать MD5.
demiurg_spb
Цитата(=GM= @ May 28 2010, 13:59) *
Памяти у меня 128 КБ, забито под 100 КБ, но MD5 алгоритм тестирует всю память.
Seed buffer это двойное слово (64 бита), которое вгрубе пристыковывается к началу тестируемой памяти и т.о. влияет на выходной context. Алгоритм работает в фоне, непрерывно вычисляя MD5, а посев никто не знает, я его получаю по кану от FIA, которая имеет весь мой код и может самостоятельно посчитать MD5.
Жёстко там у Вас...
galjoen
Цитата(demiurg_spb @ May 28 2010, 13:53) *
Пусть даже вы считаете CRC по нескольку байт за раз посещения фоновой программы, а результат валидности флеша получаете лишь когда прошлись по нему целиком.
Пример с потолка: 32К флеша проверяем по 8 байт за проход: 32K/8 = 4K.
Грубо вероятность выполнения битой программы равна (100 - 100/4К) = 99,975%

Не понял, вы считаете, что между проверками выполняется ВСЯ программа?

Да собственно, и не так важно однократное выполнение битой команды. На 80% это приведёт к срабатыванию ватчдога. Так же может сработать контроль стека, основных регистров и т.д. Но важно, чтобы работа при наличии ошибки не продолжалась.
Кстати, у меня всё в лог пишется. Так я ещё ни одного запуска процессора по срабатыванию ватчдога там не видел, тем более ошибки CRC. Но это не значит, что ватчдог не нужен.
Цитата(=GM= @ May 28 2010, 13:59) *
Памяти у меня 128 КБ, забито под 100 КБ, но MD5 алгоритм тестирует всю память.

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

Цитата(=GM= @ May 28 2010, 13:59) *
посев никто не знает, я его получаю по кану

Странно, а что почитать из кана никто не может? Пусть там даже и зашифровано всё. Поставить фильтр не некоторые ID, и подменять их...
=GM=
Цитата(demiurg_spb @ May 28 2010, 09:07) *
Жёстко там у Вас...

Те ещё зверюги..сколько крови у меня попили. К примеру, ещё потребовали цифровую фильтрацию Баттерворта устроить для аналогового выхода, пришлось поставить 3 биквада и использовать 64-битные коэффициенты.
demiurg_spb
Цитата(galjoen @ May 28 2010, 14:38) *
Не понял, вы считаете, что между проверками выполняется ВСЯ программа?
Иногда вся, иногда (чаще) нет поэтому я и не настаиваю на сотых долях процента, а говорю о величине порядка процента.
Цитата
Да собственно, и не так важно однократное выполнение битой команды. На 80% это приведёт к срабатыванию ватчдога.
Это оценить сложно, всё от логики программы сильно зависит и от размера стека...
=GM=
Цитата(galjoen @ May 28 2010, 09:38) *
Странно, а что почитать из кана никто не может? Пусть там даже и зашифровано всё. Поставить фильтр не некоторые ID, и подменять их...

А толку? Ну прочитал кто-то посев, дальше-то что делать? У меня MD5 для 128 КБ считается за 0.3 сек в фоне, и хотя флеш-память неизменна, но выдавать запомненный digest нет смысла, т.к. посев его изменяет. Как и с помощью чего изменить память так, чтобы MD5 был одинаковым? А ещё надо полезную работу делать, у меня основной цикл 300 мкс.
alag57
Цитата(galjoen @ May 28 2010, 14:15) *
А м.б. 1000 слов мало для сбоя? Вот у меня на 2-м блоке сбивается: 0x7E...0x1CB6 - это 0x1C38 = 7224 слов 14448 байт.

Попробую 2-3 блока. Сначала данных было маловато. Я уж подумал - 1000 слов - куда уж больше smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.