Цитата(controller_m30 @ Dec 30 2016, 01:52)

... Сброс контроллера можно вызвать:
1. Сброс PUC происходит при записи в FCTL1 (Flash Memory Controller) пароля, отличного от 0xa5.
2. Тоже при неправильном пароле для WDTCTL, отличном от 0х5а.
3. Тоже самое для регистра PMMCTL0 (отличие пароля от 0ха5).
4. Ещё в регистре PMMCTL0 есть биты PMMSWPOR и PMMSWBOR, которые программно (если правильно понял) вызывают Reset типа POR и BOR соотв.
5. При выборке команды из адресного пространства ввода/вывода.
. . . .
По Вашей номерации на F5438A у меня отрабатывает (2) и (5).
Я остановился на (5). Выглядит ОНО так (из техасских примеров)
Код
((void (*)())0x350)();
Для решения задачи, думаю, следует использовать WDT в штатном режиме (2)
но вариант с (5) более "компактен".
Предложенные Вами варианты "отлова" проверю. Спасибо за инф.
По ушлости характера я не могу остваить это "простотак"

Цитата(amiller @ Dec 30 2016, 07:06)

(1) Мне кажется поиск уникальных особенностей процессора для того, чтобы вызвать фатальное исключение - тупиковый путь.
(2) Да и зачем? Программный reset весьма редкая и не требующая скорости операция.
(3) Чем Вам не нравится сброс через таймер-сторож? Этот способ уж точно работает на всех архитектурах.
. . . .
(1) да вроде исключение/ресет по выборке команды "неоттуда" это далеко не уникальная особенность.
Почему бы ей не воспользоваться ?
(2) тут я с Вами категорически не согласен. Как минимум 3 вызова.
- мне через внешний терминал (USART) надо (ну так получилось) рестатануть прибор.
- после перепрошивки FW требуется рестарт
- в процессе работы прибора софт начинает понимать, что "все пропало" и единственный шанс на нормализацию работы - рестарт.
(каким образом это будет сделано - не принципиально)
(3) WDT полностью устраивает.
ps - вот разбор причин рестарта для F5438A (может кому потребуется)
Код
int main(void)
{
WDTCTL = WDTPW | WDTHOLD;
switch ( __even_in_range( SYSRSTIV, SYSRSTIV_PMMKEY ) )
{
case SYSRSTIV_NONE: ResetSign = 0x00; break; // No Interrupt pending
case SYSRSTIV_BOR: ResetSign = 0x01; break; // BOR
case SYSRSTIV_RSTNMI: ResetSign = 0x02; break; // RST/NMI
case SYSRSTIV_DOBOR: ResetSign = 0x03; break; // Do BOR
case SYSRSTIV_LPM5WU: ResetSign = 0x04; break; // Port LPM5 Wake Up
case SYSRSTIV_SECYV: ResetSign = 0x05; break; // Security violation
case SYSRSTIV_SVSL: ResetSign = 0x06; break; // SVSL
case SYSRSTIV_SVSH: ResetSign = 0x07; break; // SVSH
case SYSRSTIV_SVML_OVP: ResetSign = 0x08; break; // SVML_OVP
case SYSRSTIV_SVMH_OVP: ResetSign = 0x09; break; // SVMH_OVP
case SYSRSTIV_DOPOR: ResetSign = 0x0A; break; // Do POR
case SYSRSTIV_WDTTO: ResetSign = 0x0B; break; // WDT Time out
case SYSRSTIV_WDTKEY: ResetSign = 0x0C; break; // WDTKEY violation
case SYSRSTIV_KEYV: ResetSign = 0x0D; break; // Flash Key violation
case SYSRSTIV_PLLUL: ResetSign = 0x0E; break; // PLL unlock
case SYSRSTIV_PERF: ResetSign = 0x0F; break; // peripheral/config area fetch
case SYSRSTIV_PMMKEY: ResetSign = 0x10; break; // PMMKEY violation = (0x0020u) = SYSRSTIV_PSSKEY
default: ResetSign = 0xFF; break;
}