|
|
  |
Быстрый алгоритм CRC, придумать надо |
|
|
|
Aug 26 2012, 13:11
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(vvs157 @ Aug 26 2012, 13:43)  Это не совсем CRC, это простая контрольная сумма, которая в отличие от CRC невосприимчива к перестановке байт. Ага понял. Нужно тестить внешнюю флеш на предмет самопроизвольной порчи и правильности монтажа оной. Не думаю что самопроизвольный сбой может выглядеть как перестановка N-байтных слов. А вот кз/обрыв по адресу/сам и данным возможен. Как бы оную быстро и качественно протестить? Может рассматривать её как посл. челых чисел с нечётным кол-вом байт? Проц Xmega128. Времени нет на любой CRC.
|
|
|
|
|
Aug 26 2012, 14:08
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(zombi @ Aug 26 2012, 22:11)  ...Проц Xmega128. Времени нет на любой CRC. Можно сначала заполнить всю тестируемую память данными ПСП (псевдослучайная последовательность), затем сравнить с заново запущенным генератором ПСП. Для 32кБ хватит 16-бит ПСП, например такой: LFSRПСП на LFSR работает быстро: 1 сдвиг + 1 условный XOR. Проверка всей памяти целиком после её полной записи хороша тем, что обнаруживает ошибки при обрывах/КЗ в адресных линиях, чего не обнаружить, если тестировать по 1-2 байта(write/read/compare) в цикле перебирая адреса.
|
|
|
|
|
Aug 26 2012, 16:26
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(haker_fox @ Aug 26 2012, 18:42)  А что такое время в Вашем случае? Как много его есть, и сколько можно использовать для подсчета КС? Чем быстрее тем лучше. Проц работает на 32MHz но всего лишь 5-10% времени он может уделить для тестирования флешки. Тест 512-ти областей по 32кБ (16МВ) с подсчётом CRC32 (по табличному алг.) идёт примерно 2 минуты и это ужасно долго! Тоже самое с КС 20 сек, красота! Цитата(haker_fox @ Aug 26 2012, 18:42)  Вот Вы суммируете. А по таблице дольше вычислять? Суммирую 0-й байт флеш с 0-м бaйтом KC, второй со вторым с учётом переноса и т.д. (всего одно чтение и одно сложение на байт). CRC32 - прочитать байт, загрузить указатель таблицы, сложить, сдвинуть ... (врядли в две команды хватит). Цитата(haker_fox @ Aug 26 2012, 18:42)  А надежность? Надежность CRC подтверждена математически? А надежность суммирования для случая проверки флеша?
|
|
|
|
|
Aug 26 2012, 16:40
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(vvs157 @ Aug 26 2012, 18:31)  Для этого простой контрольной суммы действительно достаточно. Надеюсь. На всяк. случай алгоритм несколько поменял: КС сделал 7-ми байтной и сложение заменил на XOR. Цитата(Plain @ Aug 26 2012, 19:30)  Например, сложение и циклический сдвиг. Циклический сдвиг чего? Одного байта результата сложения? или всей КС?
|
|
|
|
|
Aug 26 2012, 18:39
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(zombi @ Aug 26 2012, 21:11)  Надо подумать  А что, если загрузить R0-15 некой константой затем N раз R0=R0 XOR FLASH[N*8+0] R1=R1 XOR FLASH[N*8+1] ... R7=R7 XOR FLASH[N*8+7] DES 0 В результате в R0-R7 получится некий рандомайз и к томуже быстрее чем просто KC (на 8-мь байт 8-мь чтений и один DES) ! Но будет ли оное надёжнее чем просто КС ?
|
|
|
|
|
Aug 27 2012, 06:56
|
Местный
  
Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315

|
Цитата По быстродействию устраивает одно чтение байта и одна (максимум 2) операция с ним. Можно попробовать код Флетчера, где то на форуме это уже обсуждалось. В кратце unsigned Crc1 = 0; // для большей надежности можно инициализировать какой либо константой unsigned Crc2 = 0; for (int i=0; i<n;i++) { Crc1 += Buf[i]; // пи сложении переносы не учитываются Crc2 += Crc1; } Crc2++; // позволяет избежать ситуаций Crc1 == Crc2==0, или Crc1 == Crc2==-1; При размере переменных 8 бит, гарантировано считается блок на 256 байт. Для бОльшего блока необходима бОльшая разрядность. Насколько бОльше не скажу, применял для коротких сообщений (20-25 байт) в восьмибитнике, но думаю вики поможет в этом вопросе
--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
|
|
|
|
|
Aug 27 2012, 08:10
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата Нужно тестить внешнюю флеш на предмет самопроизвольной порчи и правильности монтажа оной. ИМХО Да скорее всего никак. Вы представьте , что у Вас нет , предположим ,одной линии данных или адреса и что Вы получите прочитав из Flash данные, ничего не зная какие они должны быть? Ну пусть Вы их проссумируете , но это уже не те данные. Соответсвенно не та сумма Ваш проц изначально должен знать , сумму или CRC , например "разбросанных" по адресному пространству 10 - 100 ячеек FLASH и уже на основании этого Вы с уверенностью сможете сказать - есть или нет ошибки в монтаже или прошивке FLASH и при необходимости вычислить линию адреса или данных с которой есть проблема.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 27 2012, 11:26
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(ILYAUL @ Aug 27 2012, 11:10)  Ваш проц изначально должен знать , сумму или CRC ... А почему Вы решили что он её не знает??? Именно её то он и знает и должен сравнить оную с вновь рассчитанной. Цитата(ILYAUL @ Aug 27 2012, 11:10)  и при необходимости вычислить линию адреса или данных с которой есть проблема. Для этого есть техники у них и лупы и тестера и паяльники, пусть ищут.
|
|
|
|
|
Aug 28 2012, 06:16
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Ну вот , что-то уже прояснилось. Раз уж процу ещё ничего не известно, тогда Вы можете заложить 2 направления 1. "Быстрый" - предварительная оценка , здесь можно делать что захотите , но что бы быстро. Например КС по 1 байту из каждого адреса или вообще страницы 2. "Медленный" - CRC всей FLASH , если предварительный выдал ошибку , тут уже всё равно спешить не куда , кому-то с этим надо будет разбираться и что-то мне подсказывает , что не Вам
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 28 2012, 07:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
А почему бы и нет, для быстрой проверки. К тому же я предлагал сумму байт или можете взять CRC8 , что конечно надёжней. Там же написано здесь можно Цитата делать что захотите и только в случае проблем ..... Устройте "пробег" по всем адресам 1 2 4 8 16 32 ...... по одному байту с каждого
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Aug 28 2012, 08:43
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(ReAl @ Aug 28 2012, 10:43)  В зависимости от задачи — как можно быстрее отказаться от плохой ситуации или как можно быстрее убедиться в хорошей — и методы разные. Не вижу разницы. Любая из задач меня устраивает. Главное чтобы быстро. Цитата(_Pasha @ Aug 28 2012, 10:44)  Может и глупость скажу. Возьмите контрольные суммы от блоков, лучше не более 256 байт, и загоните эти суммы в CRC16 по любому методу. Блин 16МБ / 256 * 2 = 128 КВ памяти только на CRC ! Но надо попробывать на сколько быстрее (на моём 8-ми битном проце) считается CRC16 чем CRC32. Возможно и устроит.
|
|
|
|
|
Aug 28 2012, 12:40
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(ViKo @ Aug 28 2012, 12:17)  Так ли уж обязательно надо быстро? Можно придумать какой-нибудь альтернативный выбор. Нажал кнопку при сбросе (закоротил перемычку) - пошла медленная серьезная проверка устройства. Не нажал - обычный рабочий режим. Это надо в первую очередь для того что бы проц не запустился случайно с не рабочей флешкой. При отладке 2-3 изделий можно конечно и подождать. А если надо 1000 отладить, 33 часа уйдёт только на проверку флеш. А если некоторые придётся выключить и снова включить да еще и несколько раз.
|
|
|
|
|
Aug 28 2012, 12:58
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Цитата При отладке 2-3 изделий можно конечно и подождать. А если надо 1000 отладить, то совершенно необязательно проверять их флешки строго одну за другой, можно синхронно запустить проверку. Или нет?
|
|
|
|
|
Aug 28 2012, 13:56
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(zombi @ Aug 28 2012, 11:43)  Блин 16МБ / 256 * 2 = 128 КВ памяти только на CRC ! Зачем? В конце флеша хранится только CRC16. Которая получается так: Код инициализируем CRC16 цикл по блокам в 256 байт считаем 8- или 16-битную сумму блока, возможно с цикл. переносом или xor-ку всех байтов или что не жалко добавляем эту сумму к CRC16 усё Сумма с цикл. переносом считается как сумма разрядностью с запасом, после чего старшие биты добавляются к младшим.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 28 2012, 22:32
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(ViKo @ Aug 28 2012, 16:46)  Мне думается, получив каждую новую плату, тестировщик пару минут будет ее только в руках крутить-вертеть, осматривать визуально. Прежде, чем подключать питание и т.д. Ни чё он не крутит. Вытащил из коробки, тестером прозвонил питание на предмет кз, воткнул в неё шлейфы и всё что нужно, подал питание и на компе нажал ENTER. (максимум 15 сек). За 8 сек всё прожглось, проц стартует с проверки флеш (2е минуты!).
|
|
|
|
|
Aug 28 2012, 22:42
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(_Артём_ @ Aug 29 2012, 01:33)  И чё? У меня прошивка тестовой версии-проверка внешней флешки -зашивка рабочей версии минут 8 занимает.Какая разница - плату включил и само пошло, результат программа выдаст: всё ок или где-то застряло. И чё? Вас 8 минут устраивает, а мне и 2 много! Цитата(ReAl @ Aug 28 2012, 16:56)  Зачем? В конце флеша хранится только CRC16. Которая получается так: Правильно ли я понял? Вы предлагаете считать CRC16 контрольных сумм всех блоков?
|
|
|
|
|
Aug 29 2012, 08:49
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(zombi @ Aug 29 2012, 01:42)  И чё? Вас 8 минут устраивает, а мне и 2 много! 8 / 8 = 1. Т.е., как уже говорили, можно сделать многоместный стенд. У меня 10-местный :-), за 3 минуты прошивается-тестируется десять плат. Цитата(zombi @ Aug 29 2012, 01:42)  Правильно ли я понял? Вы предлагаете считать CRC16 контрольных сумм всех блоков? Не я :-) Цитата(_Pasha @ Aug 28 2012, 10:44)  Возьмите контрольные суммы от блоков, лучше не более 256 байт, и загоните эти суммы в CRC16 по любому методу.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 29 2012, 14:57
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(ReAl @ Aug 29 2012, 11:49)  8 / 8 = 1. Т.е., как уже говорили, можно сделать многоместный стенд. У меня 10-местный :-), за 3 минуты прошивается-тестируется десять плат. Надо подумать. Цитата(ReAl @ Aug 29 2012, 11:49)  Не я :-) Ну да. Идею сразу не понял. Спасибо _Pasha и Вам. Тогда уж лучше CRC32 посчитать, вызов процедуры crc всего то 128 раз на блок! Цитата(Flexz @ Aug 29 2012, 11:42)  Если вопрос только в работе тестировщика, то почему не проверять одновременно несколько плат? Пока на одной тесты бегают он другую готовит и так по кругу. Именно так и происходит. Раздражает лишь то что новую он готовит намного быстрее чем бегают тесты в предыдущей.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|