Инструменты пользователя

Инструменты сайта


prog:debug:stack

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
prog:debug:stack [2019/10/08 13:18]
vasco [Работа со стеком - Выход из исключения]
prog:debug:stack [2019/10/14 13:06] (текущий)
vasco [Работа со стеком - Выход из исключения]
Строка 33: Строка 33:
       ENDP       ENDP
 </​code>​ </​code>​
 +
 +Что означает этот код мы разберем чуть позже, но если коротко,​ то он изменяет значение регистра PC, сохраненное в стеке, на момент возникновения исключения. А регистр PC задает адрес инструкции,​ которая будет считана из памяти и исполнена. Увеличивая значение PC сохраненное в стеке, мы при выходе из исключения (восстановлении регистров из стека),​ попадаем на следующую инструкцию,​ относительно той, что вызвала исключение. В противном случае при восстановлении из стека исполнялась бы та-же самая инструкция,​ которая приводит к исключению - получается зацикливание.
  
 <WRAP center round important 100%> <WRAP center round important 100%>
-**UPDATE**: ​В статье вероятно ошибкаинструкции ​THUMB занимают 16 бит, поэтому ​переход на следующую инструкцию должен быть не +4, а +2. Т.е. "​**ADD ​ R1, #2**"! +**UPDATE**: ​С выходом из обработчика есть проблема, заключающаяся в том, что в общем случае неизвестно сколько байт занимает ​инструкция приведшая к исключению. Набор инструкций Thumb2 содержит 32-битные инструкции, поэтому ​в Cortex-M3/​M4 высока вероятность того, что инструкция окажется 4-х байтной. Тогда действительно для выхода ​на следующую инструкцию ​необходимо увеличить PC на +4. Но если инструкция вызвавшая исключение ​была 2-х байтной, тогда при модификации ​+4 мы либо перескочим следующую 16-битную инструкциюлибо попадем в середину следующей 32-битной инструкцииВ Cortex-M0/​M1 почти все инструкции ​2-х байтные - [[https://​en.wikipedia.org/​wiki/​ARM_Cortex-M#​Instruction_sets|Instruction_sets]].
-</WRAP>+
  
-Что означает этот код мы разберем чуть ​позже, но если коротко, то он изменяет значение регистра PC, сохраненное в стеке, на момент ​возникновения исключения. А регистр PC задает адрес инструкции, которая ​будет ​считана из памяти и исполнена.+В рассматриваемом далее примере деление ​производится 32-битной инструкциейпоэтому для данного варианта оправдан выход по +4. Но при чтении памяти обычно компилятором используются 16-битные инструкция. Поэтому, например, в 1986ВЕ8Т когда при чтении памяти не согласованной с ECC возникает ​исключение ​HardFault, то выход ​из него на следующую ​инструкцию необходимо ​делать через +2. 
 + 
 +Cпособ решения данной ​проблемы, +4 или +2, предложил на форуме [[http://​forum.milandr.ru/​viewtopic.php?​f=22&​t=4095|prostoRoman]]. 
 +</​WRAP>​
  
 ====Встроенный ассемблер==== ====Встроенный ассемблер====
prog/debug/stack.1570526301.txt.gz · Последние изменения: 2019/10/08 13:18 — vasco