![]() |
|
Модераторы: PILOT, ManiaK, Mazzi |
![]()
|
|
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
понимаете в чем дело, модуль не знает, что его только что перепрошили, он продолжает свою работу так, как ее предшественник, откуда ему знать что только что перепрошили? Если бы весь софт я написал, то предусмотрел бы такой вариант, после перепрошивки прога должна распознать свое обновление по версиям и контрольной сумме, а потом принимает решение стирать или нет, но как реализовали мои коллеги (я их в глаза не видел, мне подсунули модуль LOG), я не знаю. Это сообщение отредактировал(а) daemonaz - 28.10.2010, 21:21 |
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Вообщем-то додумался, короче head-маркер сделать один единственным на весь буфер, а все остальные маркеры - tail маркеры, так вот чтоб записать новое сообщение, ищется head-маркер, после чего пишется сообщение, а сам маркер заменяется на tail-маркер, сообщение обрамляется head-маркером, то есть это и есть начало следующего нового сообщения, а первым хвостом будет первый найденный tail_маркер после head. Жду комментарий.
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Элементарно. В начале лога располагается специальный многобайтовый маркер, который в принципе не может встретится в этом месте в образе прошивки для МК. Обычно такой маркер можно выбрать, т.к. в начале прошивки МК обычно лежат какие то фиксированные данные, типа векторов прерывания или чего то похожего. И у этих данных вполне регулярная структура.
Если модуль логирования не находит этого маркера, он стирает всю область и пишет маркер (собственно сам маркер после этого не меняется) Это подразумевает 2х кратное переписывание каждой ячейки EEPROM с маркером. Не очень хорошо. Кроме того, проблема с неинициализированным после перепрошивки буфером не решается - в нем вообще никаких маркеров не будет |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: нет Всего: 459 |
Я у себя использовал такой 0xAAAAAAAA -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Mazzi |
|
|||
|
Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
-------------------- Мне нужны помощники. |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Осталось самая малость - найти p_beg, p_end; при включении МК, причем в EEPROM их записывать нельзя |
||||
|
|||||
| Mazzi |
|
||||
|
Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Почему нельзя?
Затем в начале кода читаем сохранённые значения, а в конце функций обращения к памяти перезаписываем. -------------------- Мне нужны помощники. |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Потому что у него NAND FLASH (будет), который необходимо записывать/перезаписывать последовательно (для достижения заявленного ресурса перезаписей). Сохранить указатели в EEPROM я ему посоветовал еще в 3м сообщении (если есть EEPROM с достаточным ресурсом перезаписей)
|
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
да и еще нужно писать сообщения переменной длины, не забывайте!
|
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Вообщем-то я понял так, в начале лога пишется длинный маркер, по которому мы определяем, была ли перепрошивка или нет, если такой маркер присуствует, то ишем указатели, иначе стираем всю область памяти, и cтолбим этот же маркер. Далее хотим мы записать новое сообщение, по предложению уважаемого xvr, вводим ESC-последовательность, чтобы выделить начало и конец сообщения, у каждого сообщения будет свой ID, по ID будем определять где head и где tail. При включении МК ишется разница между ID, если она больше 1, то сообщение с малым ID - head, а с большим ID - tail. теперь заполнили всю область LOG, нужно записать новое сообщение, вот здесь как быть? Либо весь блок Flash отдать под одно сообщение, что слишком жирно, или каждый раз нужно переписывать этот блок, либо стереть этот блок и начинаем писать заново? Мой моск разваливается..
|
|||
|
||||
| Mazzi |
|
|||
|
Правильный ![]() ![]() Профиль Группа: Комодератор Сообщений: 825 Регистрация: 3.4.2003 Репутация: 9 Всего: 21 |
Нужно два разных маркера в начале всех записей и в конце. Если записей нет, то в памяти только маркеры.
-------------------- Мне нужны помощники. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Mazzi абсолютно прав - маркеров нужно 2 (что бы корректно определить целые записи). ID должен быть достаточного размера, что бы полностью заполненный FLASH при минимальной длине каждой записи не вызвал переполнение ID (причем нужен как минимум 2х кратный запас).
Записи пишутся во FLASH по кольцу (как в исходнике от Mazzi), при переполнении новые записи начинают затирать старые. При старте ищутся первая и последняя целая запись (должны присутствовать оба маркера), и извлекаются их ID. Затем ID сравниваются на больше-меньше (с учетом возможного переполнения, т.е. если старшие биты у них разные, то произошло переполнение и ID с нулевым старшим битом считается больше, чем ID с единичным старшим битом). Собственно все - запись с большим ID будет головой (писать надо сразу после нее), запись стартует со следующего ID. Запись с меньшим ID становится указателем чтения. |
|||
|
||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
это конечно не по теме, не хочу открывать новую ветку.. Вопрос, как вычислить кратность некоторому числу без деления с остатками?
например, если 16 делится на 8, используется 16%8=0, не делится 15%8!=0, как это сделать без деления? второе, как вычислить наибольшее ближайшее данному числу кратное некому числу без цикла? Например, у нас число 13, он не делится на 8, доводим его 16. Я делаю так..
Есть ли быстрый и эффективный способ? |
|||
|
||||
| xvr |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
В общем случае (если N НЕ степень двойки)
|
||||||||||
|
|||||||||||
| daemonaz |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 160 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
xvr, огромное спасибо!
|
|||
|
||||
![]()
|
| Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)" | |
|
|
На данный раздел помимо Правил форума распространяются текже следующие правила:
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |