Цитата(xelax @ Jun 22 2016, 17:12)

Убрал опцию --use_frame_pointer, вернул вложенные прерывания, оставил максимальную оптимизацию --O3. Hard fault исчезли.
Вернул опцию, буквально несколько секунд и софт падает в Hard fault.
Спасибо, судя по всему, действительно идет некорректная работа со стеком с включенной опцией.
Фишка вот в чем
непонятно зачем кейл двигает указатель стека SP на FP в командах
mov sp,fp
sub sp,#const
Если между этими командами возникнет прерывание,стек будет уже смещен,и контекст возникшего прерывания затрет контекст,сохраненный ранее при входе..я понимаю,мои объяснения звучат сумбурно,но возьмите лист бумаги,разрисуйте стек,идите по коду,там,где есть в командах использование sp и fp, то "разрисовывайте" эти регистры,и вы увидите....учитывайте,что стек растет ото дна
stmdb sp!,{r0...lr} -> sp=sp-4;RAM[sp]=r0 и т.д.
ldmia sp!,{r0..lr}-> r0=RAM[sp]; sp=sp+4
Я вам скажу,это реальный глюк..я в свое время неделю не мог понять,что с моей программой,а потом матерился на кейл десятиэтажным матом
Сообщение отредактировал romas2010 - Jun 22 2016, 15:53