реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Контрольная сумма памяти программ, как ее посчитать?
_Надя
сообщение Dec 6 2008, 16:11
Сообщение #1


Участник
*

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



Имеется мега 16... есть программа... нужно сделать типа самотестирование устройства... т.е. найти сумму памяти программ и полученный результат вывести на порт.... В общем я очень озададчилась такой постановкой задачи, поскольку совсем не представляю где эта память программ с какого адреса она начинается и до какого мне нужно это все суммировать. Число получиться наверное оооочень большим, какую переменную использовать и как это все поразрядно на порт выводить. В общем совсем не представляю. Причем как я поняла из постановки задачи это самотестирование нужно делать не только при включении питания, а постоянно, т.е. пока мк работает нужно считать сумму программ. На сколько этот процесс длительный - подстчет всей суммы? Не будет ли что либо тормозить, может нужно как то это частями считать, а как? С помощью таймера или еще как? Поделитесь, кто нибудь что нибудь делал нечто подобное? Как ЭТО сделать?
Go to the top of the page
 
+Quote Post
EugeNNe
сообщение Dec 6 2008, 18:54
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997



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


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

Сообщение отредактировал BigBolt - Dec 6 2008, 19:15
Go to the top of the page
 
+Quote Post
_Надя
сообщение Dec 6 2008, 19:42
Сообщение #3


Участник
*

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



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

Вот винегрета я и боюсь больше всего... т.к. мк достаточно загружен как мне кажется. Два таймера, ацп, SPI... работа с EEPROM.... У меня сейчас на один порт выводятся поразрядно часть формируемых мк имульсов , плюс в промежутках на этот же порт выводится число, которое измеряет АЦП и еще на этот же порт нужно вывести эту CRC.... плюс ко всему начальник считает что сосчитать CRC очень просто и быстро и в понедельник уже ждет от меня результата.... можно конечно сказать что сделала - он все равно не поймет, т.к. с программированием совсем не знаком.... но для себя хотелось бы все таки сделать...
Go to the top of the page
 
+Quote Post
EugeNNe
сообщение Dec 6 2008, 20:08
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997



http://ru.wikipedia.org/wiki/CRC
вот тута что то сказано маленько...
Go to the top of the page
 
+Quote Post
Baser
сообщение Dec 6 2008, 21:35
Сообщение #5


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Вообщем, BigBolt вам уже все основные вещи написал. Выделю только одну мысль:
контрольная сумма памяти программ не может изменяться часто (если только сам процессор туда ничего не пишет). Она может измениться только при сбое программы, после которого уже можно ничего не делать, а только мигать и гудеть smile.gif
Поэтому её не нужно считать быстро и часто. Сделайте неспешный подсчет по одному байту в главном цикле, т.е. тогда, когда спешить не нужно. За несколько секунд CRC будет вычисляться совершенно не напрягая процессор.

А вообще, стандартный подход несколько другой. CRC памяти программ вычисляется самим компилятором Си и сохраняется в последнем слове флеша. А прикладная программа непрерывна считает CRC по тому же алгоритму и сверяет с правильной. Наружу выдается только код ошибки (или мигание светодиодом, гудение и т. д.)
Go to the top of the page
 
+Quote Post
EugeNNe
сообщение Dec 7 2008, 15:11
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997



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


A WinAVR (GCC) поддерживает такую опцию?
Go to the top of the page
 
+Quote Post
muravei
сообщение Dec 9 2008, 14:40
Сообщение #7


Гуру
******

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



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

Поэтому интереснее было бы считать CRC содержимого оперативки( переменные итд), чтобы выходить "живым" из сложных ситуаций. Понятно , что его надо считать после каждого изменения этой памяти, но некоторые программы , бывает , скрупулезно перебирают нопы.
Было бы интересно узнать, что кто думает по выходу из сбоев и зависаний.
Go to the top of the page
 
+Quote Post
EugeNNe
сообщение Dec 9 2008, 15:56
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 424
Регистрация: 6-03-06
Из: Н.Новгород
Пользователь №: 14 997



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


Ну во первых наверное сама логическая структура программы и её организация должна подразумевать возможность сбоев и зависаний. Мы например, в определённых точках проверяем корректность выполненных действий и если всё ОК то только тогда дальше и вперёд smile.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 9 2008, 17:03
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(BigBolt @ Dec 7 2008, 17:11) *
A WinAVR (GCC) поддерживает такую опцию?
Да, он позволяет после сборки проекта вызвать из makefile любую самописную утилиту, которая посчитает сумму по любому алгоритму и добавит эту сумму в любое место прошивки.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
muravei
сообщение Dec 9 2008, 18:16
Сообщение #10


Гуру
******

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



Цитата(BigBolt @ Dec 9 2008, 18:56) *
в определённых точках проверяем корректность выполненных действий

А это имеет реалный смысл? Если программа сбилась, то врядли она начнет сама себя проверять, пока ее не вернет в нужное русло собака бешеная(сторожевая), а вот после этого есть смысл узнать , что мы вместе, и в каком!. smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016