pokk 0 23 апреля, 2019 Опубликовано 23 апреля, 2019 · Жалоба В общем понадобилось сделать перезагрузку всего процессора, после чего начали детектироваться повторные аварии ( в журнале аварий) в следствии того что, все предыдущее состояния аварий сбрасываться в дефолтное состояние. Что бы этого не происходило надо бы добавить __no_init , но тогда: 1) По включению(аппаратному) в этих переменных всякая фигня находиться. 2) Есть состояния которые занесены в структуру и к ним модификатор __no_init не добавить =(. А другие поля структуры надо жестко выставить. В общем пока остановился на таком алгоритме: if(GetStatusRestart()==HARDWARE_RESTART){ //сбрассываем перименные в дефолтное состояние }else{ //Прогманный сброс нечего не делаем. } И в каждом модуле указываешь, что сбросить при аппаратном включении или программном перебросе. Вроде бы вариант не плохой, но все же хочется ещё лучше =), можно ли сделать отдельную секцию которая будет инициализировать только при аппаратной перезагрузке ? и все требуеммые перименные размещать в ней ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 23 апреля, 2019 Опубликовано 23 апреля, 2019 · Жалоба 10 minutes ago, pokk said: можно ли сделать отдельную секцию которая будет инициализировать только при аппаратной перезагрузке ? Может быть защитить ваш блок контрольной суммой. И инициализировать его если она не совпадает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 34 23 апреля, 2019 Опубликовано 23 апреля, 2019 · Жалоба Сделайте свой startup (Reset_Handler) и там проверяйте тип запуска. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 23 апреля, 2019 Опубликовано 23 апреля, 2019 · Жалоба 3 часа назад, pokk сказал: можно ли сделать отдельную секцию которая будет инициализировать только при аппаратной перезагрузке ? Да, можно. Но и секцию и ее размещение и инициализацию вам придется писать самому. В компиляторе такого готового нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 23 апреля, 2019 Опубликовано 23 апреля, 2019 · Жалоба Обычно в современных контроллерах есть регистр в котором флаг указывает это софт ресет или нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 24 23 апреля, 2019 Опубликовано 23 апреля, 2019 · Жалоба Если процессор имеет периферию - надо ещё в ней все регистры инициализировать, они могут от программного сброса и не обнуляться. А также кэш, MMU, DDR, PLL... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 24 апреля, 2019 Опубликовано 24 апреля, 2019 · Жалоба Если 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() ) Тамже можно анализировать причину рестарта и соответственно управлять алгоритмом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться