|
|
  |
Контрольная сумма памяти программ, как ее посчитать? |
|
|
|
Dec 6 2008, 16:11
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 18-11-08
Пользователь №: 41 741

|
Имеется мега 16... есть программа... нужно сделать типа самотестирование устройства... т.е. найти сумму памяти программ и полученный результат вывести на порт.... В общем я очень озададчилась такой постановкой задачи, поскольку совсем не представляю где эта память программ с какого адреса она начинается и до какого мне нужно это все суммировать. Число получиться наверное оооочень большим, какую переменную использовать и как это все поразрядно на порт выводить. В общем совсем не представляю. Причем как я поняла из постановки задачи это самотестирование нужно делать не только при включении питания, а постоянно, т.е. пока мк работает нужно считать сумму программ. На сколько этот процесс длительный - подстчет всей суммы? Не будет ли что либо тормозить, может нужно как то это частями считать, а как? С помощью таймера или еще как? Поделитесь, кто нибудь что нибудь делал нечто подобное? Как ЭТО сделать?
|
|
|
|
|
Dec 6 2008, 18:54
|
Местный
  
Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997

|
Цитата(_Надя @ Dec 6 2008, 19:11)  Имеется мега 16... есть программа... нужно сделать типа самотестирование устройства... т.е. найти сумму памяти программ и полученный результат вывести на порт.... В общем я очень озададчилась такой постановкой задачи, поскольку совсем не представляю где эта память программ с какого адреса она начинается и до какого мне нужно это все суммировать. Число получиться наверное оооочень большим, какую переменную использовать и как это все поразрядно на порт выводить. В общем совсем не представляю. Причем как я поняла из постановки задачи это самотестирование нужно делать не только при включении питания, а постоянно, т.е. пока мк работает нужно считать сумму программ. На сколько этот процесс длительный - подстчет всей суммы? Не будет ли что либо тормозить, может нужно как то это частями считать, а как? С помощью таймера или еще как? Поделитесь, кто нибудь что нибудь делал нечто подобное? Как ЭТО сделать? Число будет не очень большое.... Всё зависит от разрядности контрольной суммы ( CRC)... Так что это 8, 16, или 32разряда всего.... Можно весь флэш считать, а можно только память занятую непосредственно программой.... Думаю что вам надо постоянно в фоне контрольную сумму считывать (как я понял из контекста вашей задачи в предыдущих топиках) и отдавать другому МК на проверку... Время требуемое для расчёта будет зависеть от разрядности выбранного Вами полинома CRC и алгоритма расчёта. Если тупо в "лоб" считать, то времени достаточно уходит (всё относительно конечно), если использовать быстрые алгоритмы ( например табличный) то время заметно сокращается, но растут расходы на память программ... Вообще всё зависит от контекста задачи... Насколько Ваши МК загружены задачами.... каков вообще системный цикл устройства.... Считать лучше не по таймеру.... Может быть, ваша прога должна быть организована в виде некоего системнго цикла, в котором выделено определённое время на тесты, взаимообмен, выполнение каких либо действий.... Решая такие задачи  нада чётко представлять логическую структуру Вашей программы... иначе винегрет получится в конце концов...
Сообщение отредактировал BigBolt - Dec 6 2008, 19:15
|
|
|
|
|
Dec 6 2008, 19:42
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 18-11-08
Пользователь №: 41 741

|
Цитата(BigBolt @ Dec 6 2008, 21:54)  Число будет не очень большое.... Всё зависит от разрядности контрольной суммы ( CRC)... Так что это 8, 16, или 32разряда всего.... Можно весь флэш считать, а можно только память занятую непосредственно программой.... Думаю что вам надо постоянно в фоне контрольную сумму считывать (как я понял из контекста вашей задачи в предыдущих топиках) и отдавать другому МК на проверку... Время требуемое для расчёта будет зависеть от разрядности выбранного Вами полинома CRC и алгоритма расчёта. Если тупо в "лоб" считать, то времени достаточно уходит (всё относительно конечно), если использовать быстрые алгоритмы ( например табличный) то время заметно сокращается, но растут расходы на память программ... Вообще всё зависит от контекста задачи... Насколько Ваши МК загружены задачами.... каков вообще системный цикл устройства.... Считать лучше не по таймеру.... Может быть, ваша прога должна быть организована в виде некоего системнго цикла, в котором выделено определённое время на тесты, взаимообмен, выполнение каких либо действий.... Решая такие задачи  нада чётко представлять логическую структуру Вашей программы... иначе винегрет получится в конце концов... Вот винегрета я и боюсь больше всего... т.к. мк достаточно загружен как мне кажется. Два таймера, ацп, SPI... работа с EEPROM.... У меня сейчас на один порт выводятся поразрядно часть формируемых мк имульсов , плюс в промежутках на этот же порт выводится число, которое измеряет АЦП и еще на этот же порт нужно вывести эту CRC.... плюс ко всему начальник считает что сосчитать CRC очень просто и быстро и в понедельник уже ждет от меня результата.... можно конечно сказать что сделала - он все равно не поймет, т.к. с программированием совсем не знаком.... но для себя хотелось бы все таки сделать...
|
|
|
|
|
Dec 7 2008, 15:11
|
Местный
  
Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997

|
Цитата(Baser @ Dec 7 2008, 00:35)  А вообще, стандартный подход несколько другой. CRC памяти программ вычисляется самим компилятором Си и сохраняется в последнем слове флеша. А прикладная программа непрерывна считает CRC по тому же алгоритму и сверяет с правильной. Наружу выдается только код ошибки (или мигание светодиодом, гудение и т. д.) A WinAVR (GCC) поддерживает такую опцию?
|
|
|
|
|
Dec 9 2008, 14:40
|

Гуру
     
Группа: Свой
Сообщений: 2 538
Регистрация: 13-08-05
Пользователь №: 7 591

|
Цитата(Baser @ Dec 7 2008, 00:35)  Она может измениться только при сбое программы, после которого уже можно ничего не делать, а только мигать и гудеть  Поэтому интереснее было бы считать CRC содержимого оперативки( переменные итд), чтобы выходить "живым" из сложных ситуаций. Понятно , что его надо считать после каждого изменения этой памяти, но некоторые программы , бывает , скрупулезно перебирают нопы. Было бы интересно узнать, что кто думает по выходу из сбоев и зависаний.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|