Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 12.03.2018, 16:45   #1
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 26
Вес репутации: 239/32
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Как корректно восстановить работу МК после self programming

Проблемные задачи:

1) Запись памяти программ.
2) Запись EEPROM.

Итак, вопрос не частный а системный. Статьи на эту тему не читал, т.к. не могу до конца сформулировать тему. Однако, чем больше работаю, тем больше встает вопрос.

Семейство мк: почти любое.

Процесс: запись/стирание, далее по тексту просто запись, подразумеваем runtime.

Описываю ситуацию.
1) В процессе записи памяти программ контроллер "замирает" на время записи (несколько мс ~5 по даташиту).
2) В это время происходят разные процессы(!?)
- события, вызывающие внешние прерывания
- переполнение буферов приема uart и др интерфейсов.
3) Через несколько мс контроллер очнулся, а атомный реактор уже взорвался)... Шутка. Ничего не взорвалось, но мк пропустил процессы.

В этом и возникает вопрос. Как системно решать задачу, связанную с "замиранием" контроллера при записи.

По идее нужно:
1) отключить опросы всех устройств, которые я опрашиваю.
2) запретить приемы всех приемников, которые могут принять ответ, или всегда находятся в ожидании приема данных.
3) т.к. контроллер может пропустить некоторые данные, то, возможно, нужно заново инициализировать все периферийные устройства мк!!!
4) ...

Что же делать? Может нужно сделать программный сброс и прогнать всю инициализацию заново.
Но при этом нельзя заново инициализировать переменные, т.к. программе нужны их текущие значения.
Также нужно вернуть состояния программы, в которой она находилась и т.д.

У меня не хватило фантазии развернуть этот вопрос далее.
А хочется получить системное решение по этому вопросу.

Хочется услышать от вас ответы не типа: "да это же не проблема, у меня такого не случается", логичное описание, как быть в данной ситуации.

Спасибо, кто дочитал до конца)
LexxExe вне форума   Ответить с цитированием
Старый 12.03.2018, 16:55   #2
masterok999
Senior Member
 
Регистрация: 28.07.2015
Адрес: NA
Возраст: 54
Сообщений: 183
Вес репутации: 660/19
masterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to behold
По умолчанию Re: Как корректно восстановить работу МК после self programming

У меня сделана проверка авто обновления (по воздуху) при каждом включении устройства (причем функция отключаемая), и каждые 2 суток по таймеру. Но это все без участия человека. Третий режим - управляемый дистанционный ребут от SMS или команды с сервера, при котором все то же как и при включении (п.1).
Таким образом в Вашем варианте можно сделать только при подаче питания, тогда человек сам управляет процессом и последствия предсказуемы.
masterok999 вне форума   Ответить с цитированием
Старый 12.03.2018, 17:09   #3
masterok999
Senior Member
 
Регистрация: 28.07.2015
Адрес: NA
Возраст: 54
Сообщений: 183
Вес репутации: 660/19
masterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to behold
По умолчанию Re: Как корректно восстановить работу МК после self programming

Кроме этого есть несколько видов самопрошивки.
Не знаю какой девайс и способ у Вас, но по GPRS и по Радио такие:
1. с разбиением флешь памяти на 2 партиции и прошивкой их по очереди, т.е. всегда можно откатиться на предыдущую рабочую если что то пошло не так.
2. использовать внешнюю память как буферную, и шить уже из нее.
3. самопрошиваться прямо на ходу, получая данные порциями и загоняя их в память за пределами бут-сектора.
4. опционально - криптование всего дампа подлежащего загрузке.

естественно во всех случаях проверять CRC закачанного в память и принимать решение о достоверности.
masterok999 вне форума   Ответить с цитированием
Старый 12.03.2018, 17:31   #4
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 26
Вес репутации: 239/32
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Как корректно восстановить работу МК после self programming

masterok999, прошу прощения, но мне кажется Вы меня не так поняли. Self programming и запись в eeprom я использую не для перепрошивки устройства, а, к примеру, для сохранения параметров настроек, которые могут сохраняться довольно часто (период 1 сек), а могут редко, по кнопке пульта ДУ (раз в неделю).

Для заметки:
{
Процесс записи в eeprom отличается от записи в flash.
При записи в flash контроллер просто останавливает выполнение команд на время программирования, периферия контроллера работает.

При записи в eeprom контроллер не останавливается, но пишет по одному байту 5 мс. В это время запрещены прерывания по биту GIE(глобально), чтобы писать следующий байт нужно дождаться завершения записи предыдущего, поэтому обычно просто в цикле опрашивается бит готовности. Все это время прерывания не работают.
}

Далее:
Таким образом? при записи в память не работают прерывания. Это дает возможность непредвиденного сбоя программы, если ОСОБО не обрабатывать ситуацию после программирования.

Вопрос, как ее обрабатывать системно(общий случай).
LexxExe вне форума   Ответить с цитированием
Старый 12.03.2018, 18:20   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,807
Вес репутации: 3528/76
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как корректно восстановить работу МК после self programming

LexxExe
есть разные семейства МК microchip.

если совсем уж какая-то странная необходимость - pic32m Вам в помощь - можно код записи во flash и исключения разместить в ram.

Section 5. Flash Programming
Код:
If performing an RTSP operation while executing (fetching) instructions from RAM memory, the
CPU can continue to execute instructions and respond to interrupts during the programming
operation. Any executable code scheduled to execute during the RTSP operation must be placed
in RAM memory; this includes the relevant interrupt vector and the Interrupt Service Routine
(ISR) instructions.
besogon вне форума   Ответить с цитированием
Старый 12.03.2018, 18:25   #6
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,807
Вес репутации: 3528/76
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Как корректно восстановить работу МК после self programming

LexxExe
в целом на этапе разработки архитектуры проекта неплохо учитывать, какое максимальное время реакции на прерывание.

если не получается, то есть разные варианты. можно, допустим, внешнюю память поставить.
besogon вне форума   Ответить с цитированием
Старый 12.03.2018, 18:31   #7
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 26
Вес репутации: 239/32
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Как корректно восстановить работу МК после self programming

Цитата:
Сообщение от besogon Посмотреть сообщение
LexxExe
если совсем уж какая-то странная необходимость - pic32m Вам в помощь - можно код записи во flash и исключения разместить в ram.
Нет. Нет. Pic32 не использую. Использую PIC 16, 24H, 24J, 33. Дело не в контроллере. Хочется программное решение этого парадокса.

Когда я запустил всю периферию контроллера, то даже не могу объять все регистры и состояния программы, которые нужно, проверить не случилось ли в этом модуле двойного переполнения таймера, или буфера интерфейса?

Это происходит еще потому, что контроллер параллельно выполняет множество задач, причем они могут быть рассинхронизированы друг от друга, т.е. не зависят друг от друга, а часть задач зависят друг от друга.

И такой простой(типовой) процесс, как запись в энергонезависимую память на борту контроллера, ставит под вопрос живучесть моей программы. Это обидно. Ммм. Не дает покоя.
LexxExe вне форума   Ответить с цитированием
Старый 12.03.2018, 18:57   #8
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 359
Вес репутации: 992/49
tsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to behold
По умолчанию Re: Как корректно восстановить работу МК после self programming

Цитата:
Сообщение от LexxExe Посмотреть сообщение
Для заметки:
{...При записи в eeprom контроллер не останавливается, но пишет по одному байту 5 мс. В это время запрещены прерывания по биту GIE(глобально), чтобы писать следующий байт нужно дождаться завершения записи предыдущего, поэтому обычно просто в цикле опрашивается бит готовности. Все это время прерывания не работают.}
Откуда Вы это взяли? По-моему, во всех ПИКах, с которыми я работал, рекомендуют программно запрещать прерывания только на время выполнения "магической последовательности" команд, активирующей начало записи в EEPROM. Далее, в процессе ожидания завершения этой записи, прерывания можно разрешить и они прекрасно будут работать. Разве нет?
tsb58 вне форума   Ответить с цитированием
Старый 12.03.2018, 18:59   #9
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 26
Вес репутации: 239/32
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Как корректно восстановить работу МК после self programming

Цитата:
Сообщение от besogon Посмотреть сообщение
LexxExe
в целом на этапе разработки архитектуры проекта неплохо учитывать, какое максимальное время реакции на прерывание.

если не получается, то есть разные варианты. можно, допустим, внешнюю память поставить.
Хорошие замечания. Но внешнюю память использовать не хочет, т.к. есть внутренняя (причем не только "море" flash, но и eeprom).

А вот время реакции стараюсь учитывать. По моим прикидкам, большинство программ строю так, чтобы время реакции системы на прерывание не превышало 1 мс, а лучше 1-100 мкс. Все более длительные процессы пытаюсь выносить в Superloop(while (1)). Там время реакции может быть 10 мкс - 10 мс, но реальное время задержки фиксируется аппаратным таймером в прерывании. Более длительные задачи, дробить на маленькие с повторным проходом superloop.

В указанной мною проблеме НЕ РАБОТАЮТ ПРЕРЫВАНИЯ. Это и разрушает мою логику работы программ.
LexxExe вне форума   Ответить с цитированием
Старый 12.03.2018, 19:01   #10
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 26
Вес репутации: 239/32
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Как корректно восстановить работу МК после self programming

Цитата:
Сообщение от tsb58 Посмотреть сообщение
Откуда Вы это взяли? По-моему, во всех ПИКах, с которыми я работал, рекомендуют программно запрещать прерывания только на время выполнения "магической последовательности" команд, активирующей начало записи в EEPROM. Далее, в процессе ожидания завершения этой записи, прерывания можно разрешить и они прекрасно будут работать. Разве нет?
; Required unlock sequence
MOVLW 55h ;
MOVWF NVMCON2 ;
MOVLW AAh ;
MOVWF NVMCON2 ;
; Set WR bit to begin write
BSF NVMCON1, WR ;
; Wait for write to complete
BTFSC NVMCON1, WR
BRA $-2
; Enable INT
BSF INTCON, GIE ;

Вроде нет. Написано сначала ждем окончания записи, затем разрешаем прерывания.
LexxExe вне форума   Ответить с цитированием
Старый 12.03.2018, 19:14   #11
tsb58
Senior Member
 
Аватар для tsb58
 
Регистрация: 04.11.2008
Адрес: Харьков
Сообщений: 359
Вес репутации: 992/49
tsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to beholdtsb58 is a splendid one to behold
По умолчанию Re: Как корректно восстановить работу МК после self programming

Цитата:
Сообщение от LexxExe Посмотреть сообщение
... Написано сначала ждем окончания записи, затем разрешаем прерывания.
Это просто пример, как можно сделать, но никак не догма.
После того, как установлен в 1 бит WR, запускается внутренний автомат записи в EEPROM, который "остановить" может разве что общий RESET контроллера. Даже ожидание окончания записи в EEPROM, строго говоря, не является обязательным. Главное - не обращаться к EEPROM (даже на чтение) до окончания процесса записи.
tsb58 вне форума   Ответить с цитированием
Старый 12.03.2018, 20:31   #12
masterok999
Senior Member
 
Регистрация: 28.07.2015
Адрес: NA
Возраст: 54
Сообщений: 183
Вес репутации: 660/19
masterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to beholdmasterok999 is a splendid one to behold
По умолчанию Re: Как корректно восстановить работу МК после self programming

В этой теме уже вроде обсосали нечто подобное:
http://www.microchip.su/showthread.php?t=18263

А ответил перед этим согласно вопросу: "Как корректно восстановить работу МК после self programming".
"Self programming" в другом смысле чаще используют - как заливка кода программы.
Просто вопрос нужно было ставить по другому, например "как сохраниться не отвлекаясь от основных задач?"
Если нужно записать быстро, лучше использовать не EEPROM, а FLASH, но если совсем мгновенно - внешнюю FRAM память, кроме того у нее нет ограничений на ресурс записей.
masterok999 вне форума   Ответить с цитированием
Старый 12.03.2018, 23:20   #13
pal1222@yandex.ru
Senior Member
 
Регистрация: 30.09.2008
Сообщений: 1,465
Вес репутации: 2482/75
pal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond reputepal1222@yandex.ru has a reputation beyond repute
По умолчанию Re: Как корректно восстановить работу МК после self programming

Цитата:
Сообщение от LexxExe Посмотреть сообщение
Хорошие замечания. Но внешнюю память использовать не хочет, т.к. есть внутренняя (причем не только "море" flash, но и eeprom).

А вот время реакции стараюсь учитывать. По моим прикидкам, большинство программ строю так, чтобы время реакции системы на прерывание не превышало 1 мс, а лучше 1-100 мкс. Все более длительные процессы пытаюсь выносить в Superloop(while (1)). Там время реакции может быть 10 мкс - 10 мс, но реальное время задержки фиксируется аппаратным таймером в прерывании. Более длительные задачи, дробить на маленькие с повторным проходом superloop.
В указанной мною проблеме НЕ РАБОТАЮТ ПРЕРЫВАНИЯ. Это и разрушает мою логику работы программ.
Не помню именно про Microchip, но, про проблему "в общем случае", tsb58 всё сказал. Критичный по времени доступа ресурс надо "обернуть" в очередь и аппаратный поток исполнения не тормозить. Пока размер очереди не превышен, процессы могут не обращать внимания на задержки доступа к ресурсу. Если темп поступления событий выше чем темп освобождения очереди к ресурсу - неправильно выбрана "лошадь" и ничто уже не поможет. Есть такое понятие - Driver based architecture. You undestand? i can repeat it in other words
pal1222@yandex.ru вне форума   Ответить с цитированием
Старый 13.03.2018, 10:12   #14
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 26
Вес репутации: 239/32
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Как корректно восстановить работу МК после self programming

Цитата:
Сообщение от tsb58 Посмотреть сообщение
Это просто пример, как можно сделать, но никак не догма.
Подождите. Дайте проверить!
LexxExe вне форума   Ответить с цитированием
Старый 13.03.2018, 10:56   #15
LexxExe
Junior Member
 
Регистрация: 17.08.2010
Сообщений: 26
Вес репутации: 239/32
LexxExe has a spectacular aura aboutLexxExe has a spectacular aura aboutLexxExe has a spectacular aura about
По умолчанию Re: Как корректно восстановить работу МК после self programming

Цитата:
Сообщение от tsb58 Посмотреть сообщение
После того, как установлен в 1 бит WR, запускается внутренний автомат записи в EEPROM...
Проверил. Прерывания действительно можно включить СРАЗУ после запуска автомата записи. А далее периодически опрашивать возможность следующей записи/чтения.

Цитата:
Сообщение от masterok999 Посмотреть сообщение
В этой теме уже вроде обсосали нечто подобное:
http://www.microchip.su/showthread.php?t=18263
Спасибо за ссылку.

Цитата:
Сообщение от pal1222@yandex.ru Посмотреть сообщение
Критичный по времени доступа ресурс надо "обернуть" в очередь и аппаратный поток исполнения не тормозить.
Да, согласен. Так и буду делать.

Всем спасибо за отзывчивость. Так держать.
LexxExe вне форума   Ответить с цитированием
Старый 14.03.2018, 17:58   #16
Илья
Senior Member
 
Регистрация: 26.02.2007
Адрес: SPb
Сообщений: 1,154
Вес репутации: 1775/71
Илья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant futureИлья has a brilliant future
По умолчанию Re: Как корректно восстановить работу МК после self programming

Запись EEPROM не останавливает ядро. запись Flash - да, выполнение кода останавливается.

после сброса вы можете определить причину сброса и разделить инициализации железа/ОЗУ в зависимости от причины (программный сброс или др.).

есть PIC с dual panel Flash. как раз для Live update и для продолжения выполнения кода во время перезаписи. Пока пишете в одну панель - код выполняется из другой без "замираний".
как раз чтобы не "бахнуло" - для задач электропривода, SMPS и пр. где нельзя останавливаться даже на время обновления fw.
Илья вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Имитатор DS18B20 Filya44 Вопросы начинающих 14 12.03.2012 17:39
МК включает/выключает микросхему с током 10..100мА. Питание +5В должно быть стабильно. Как это реализовать? Sergik_1900 Общетехнические вопросы 9 24.04.2009 08:09
Как засечь в PIC18F, что в модуле MSSP буффер SSPBUF пуст, после передачи байта Leonid_O Продукция MICROCHIP 33 11.03.2008 00:30
Как МК сравнить два процесса А=F(t)? Grey Продукция MICROCHIP 15 09.03.2007 22:50


Часовой пояс GMT +3, время: 21:40.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot