Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Контрольная сумма памяти программ
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
_Надя
Имеется мега 16... есть программа... нужно сделать типа самотестирование устройства... т.е. найти сумму памяти программ и полученный результат вывести на порт.... В общем я очень озададчилась такой постановкой задачи, поскольку совсем не представляю где эта память программ с какого адреса она начинается и до какого мне нужно это все суммировать. Число получиться наверное оооочень большим, какую переменную использовать и как это все поразрядно на порт выводить. В общем совсем не представляю. Причем как я поняла из постановки задачи это самотестирование нужно делать не только при включении питания, а постоянно, т.е. пока мк работает нужно считать сумму программ. На сколько этот процесс длительный - подстчет всей суммы? Не будет ли что либо тормозить, может нужно как то это частями считать, а как? С помощью таймера или еще как? Поделитесь, кто нибудь что нибудь делал нечто подобное? Как ЭТО сделать?
EugeNNe
Цитата(_Надя @ Dec 6 2008, 19:11) *
Имеется мега 16... есть программа... нужно сделать типа самотестирование устройства... т.е. найти сумму памяти программ и полученный результат вывести на порт.... В общем я очень озададчилась такой постановкой задачи, поскольку совсем не представляю где эта память программ с какого адреса она начинается и до какого мне нужно это все суммировать. Число получиться наверное оооочень большим, какую переменную использовать и как это все поразрядно на порт выводить. В общем совсем не представляю. Причем как я поняла из постановки задачи это самотестирование нужно делать не только при включении питания, а постоянно, т.е. пока мк работает нужно считать сумму программ. На сколько этот процесс длительный - подстчет всей суммы? Не будет ли что либо тормозить, может нужно как то это частями считать, а как? С помощью таймера или еще как? Поделитесь, кто нибудь что нибудь делал нечто подобное? Как ЭТО сделать?


Число будет не очень большое.... Всё зависит от разрядности контрольной суммы ( CRC)... Так что это 8, 16, или 32разряда всего.... Можно весь флэш считать, а можно только память занятую непосредственно программой.... Думаю что вам надо постоянно в фоне контрольную сумму считывать (как я понял из контекста вашей задачи в предыдущих топиках) и отдавать другому МК на проверку... Время требуемое для расчёта будет зависеть от разрядности выбранного Вами полинома CRC и алгоритма расчёта. Если тупо в "лоб" считать, то времени достаточно уходит (всё относительно конечно), если использовать быстрые алгоритмы ( например табличный) то время заметно сокращается, но растут расходы на память программ... Вообще всё зависит от контекста задачи... Насколько Ваши МК загружены задачами.... каков вообще системный цикл устройства....
Считать лучше не по таймеру.... Может быть, ваша прога должна быть организована в виде некоего системнго цикла, в котором выделено определённое время на тесты, взаимообмен, выполнение каких либо действий.... Решая такие задачи smile.gif нада чётко представлять логическую структуру Вашей программы... иначе винегрет получится в конце концов...
_Надя
Цитата(BigBolt @ Dec 6 2008, 21:54) *
Число будет не очень большое.... Всё зависит от разрядности контрольной суммы ( CRC)... Так что это 8, 16, или 32разряда всего.... Можно весь флэш считать, а можно только память занятую непосредственно программой.... Думаю что вам надо постоянно в фоне контрольную сумму считывать (как я понял из контекста вашей задачи в предыдущих топиках) и отдавать другому МК на проверку... Время требуемое для расчёта будет зависеть от разрядности выбранного Вами полинома CRC и алгоритма расчёта. Если тупо в "лоб" считать, то времени достаточно уходит (всё относительно конечно), если использовать быстрые алгоритмы ( например табличный) то время заметно сокращается, но растут расходы на память программ... Вообще всё зависит от контекста задачи... Насколько Ваши МК загружены задачами.... каков вообще системный цикл устройства....
Считать лучше не по таймеру.... Может быть, ваша прога должна быть организована в виде некоего системнго цикла, в котором выделено определённое время на тесты, взаимообмен, выполнение каких либо действий.... Решая такие задачи smile.gif нада чётко представлять логическую структуру Вашей программы... иначе винегрет получится в конце концов...

Вот винегрета я и боюсь больше всего... т.к. мк достаточно загружен как мне кажется. Два таймера, ацп, SPI... работа с EEPROM.... У меня сейчас на один порт выводятся поразрядно часть формируемых мк имульсов , плюс в промежутках на этот же порт выводится число, которое измеряет АЦП и еще на этот же порт нужно вывести эту CRC.... плюс ко всему начальник считает что сосчитать CRC очень просто и быстро и в понедельник уже ждет от меня результата.... можно конечно сказать что сделала - он все равно не поймет, т.к. с программированием совсем не знаком.... но для себя хотелось бы все таки сделать...
EugeNNe
http://ru.wikipedia.org/wiki/CRC
вот тута что то сказано маленько...
Baser
Вообщем, BigBolt вам уже все основные вещи написал. Выделю только одну мысль:
контрольная сумма памяти программ не может изменяться часто (если только сам процессор туда ничего не пишет). Она может измениться только при сбое программы, после которого уже можно ничего не делать, а только мигать и гудеть smile.gif
Поэтому её не нужно считать быстро и часто. Сделайте неспешный подсчет по одному байту в главном цикле, т.е. тогда, когда спешить не нужно. За несколько секунд CRC будет вычисляться совершенно не напрягая процессор.

А вообще, стандартный подход несколько другой. CRC памяти программ вычисляется самим компилятором Си и сохраняется в последнем слове флеша. А прикладная программа непрерывна считает CRC по тому же алгоритму и сверяет с правильной. Наружу выдается только код ошибки (или мигание светодиодом, гудение и т. д.)
EugeNNe
Цитата(Baser @ Dec 7 2008, 00:35) *
А вообще, стандартный подход несколько другой. CRC памяти программ вычисляется самим компилятором Си и сохраняется в последнем слове флеша. А прикладная программа непрерывна считает CRC по тому же алгоритму и сверяет с правильной. Наружу выдается только код ошибки (или мигание светодиодом, гудение и т. д.)


A WinAVR (GCC) поддерживает такую опцию?
muravei
Цитата(Baser @ Dec 7 2008, 00:35) *
Она может измениться только при сбое программы, после которого уже можно ничего не делать, а только мигать и гудеть smile.gif

Поэтому интереснее было бы считать CRC содержимого оперативки( переменные итд), чтобы выходить "живым" из сложных ситуаций. Понятно , что его надо считать после каждого изменения этой памяти, но некоторые программы , бывает , скрупулезно перебирают нопы.
Было бы интересно узнать, что кто думает по выходу из сбоев и зависаний.
EugeNNe
Цитата(muravei @ Dec 9 2008, 17:40) *
Поэтому интереснее было бы считать CRC содержимого оперативки( переменные итд), чтобы выходить "живым" из сложных ситуаций. Понятно , что его надо считать после каждого изменения этой памяти, но некоторые программы , бывает , скрупулезно перебирают нопы.
Было бы интересно узнать, что кто думает по выходу из сбоев и зависаний.


Ну во первых наверное сама логическая структура программы и её организация должна подразумевать возможность сбоев и зависаний. Мы например, в определённых точках проверяем корректность выполненных действий и если всё ОК то только тогда дальше и вперёд smile.gif
Сергей Борщ
Цитата(BigBolt @ Dec 7 2008, 17:11) *
A WinAVR (GCC) поддерживает такую опцию?
Да, он позволяет после сборки проекта вызвать из makefile любую самописную утилиту, которая посчитает сумму по любому алгоритму и добавит эту сумму в любое место прошивки.
muravei
Цитата(BigBolt @ Dec 9 2008, 18:56) *
в определённых точках проверяем корректность выполненных действий

А это имеет реалный смысл? Если программа сбилась, то врядли она начнет сама себя проверять, пока ее не вернет в нужное русло собака бешеная(сторожевая), а вот после этого есть смысл узнать , что мы вместе, и в каком!. smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.