Перейти к содержанию
    

Програмнный перезапуск, повторная инициализация перименных.

В общем понадобилось сделать перезагрузку всего процессора, после чего начали детектироваться повторные аварии ( в журнале аварий) в следствии того что, все предыдущее состояния аварий

сбрасываться в дефолтное состояние. Что бы этого не происходило надо бы добавить __no_init , но тогда:

1) По включению(аппаратному) в этих переменных всякая фигня находиться.

2) Есть состояния которые занесены в структуру  и к ним модификатор __no_init не добавить =(. А другие поля структуры надо жестко выставить.

В общем пока остановился на таком алгоритме:

if(GetStatusRestart()==HARDWARE_RESTART){
	//сбрассываем перименные в дефолтное состояние
}else{
	//Прогманный сброс нечего не делаем.
}

И в каждом модуле указываешь, что сбросить при аппаратном включении или программном перебросе.

Вроде бы вариант не плохой, но все же хочется ещё лучше =), можно ли сделать отдельную секцию которая будет инициализировать только при аппаратной перезагрузке ? и все требуеммые перименные размещать в ней ?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, pokk said:

можно ли сделать отдельную секцию которая будет инициализировать только при аппаратной перезагрузке ?

Может быть защитить ваш блок контрольной суммой. И инициализировать его если она не совпадает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, pokk сказал:

можно ли сделать отдельную секцию которая будет инициализировать только при аппаратной перезагрузке ?

Да, можно. Но и секцию и ее размещение и инициализацию вам придется писать самому. В компиляторе такого готового нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычно в современных контроллерах есть регистр в котором флаг указывает это софт ресет или нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если процессор имеет периферию - надо ещё в ней все регистры инициализировать, они могут от программного сброса и не обнуляться.

А также кэш, MMU, DDR, PLL...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если IAR CPP, посмотрите в IAR-директории файл cppinit.cpp, cstartup.c  а также другие файлы в каталоге   

C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.5\arm\src\lib\init\ 

чтобы его (их) задействовать, надо включить модуль в проект.

В ARM я эти файлы не использовал, а для MSP430 прикомпоновывал измененный cstartup.s43 чтобы в нем заблокировать WDT

(начальная инициализация сегментов было очень долгой, и WDT срабатывал до начала main() )

Тамже можно анализировать причину рестарта и соответственно управлять алгоритмом.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...