Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-окт-14 16:04

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: HardFaultExit - Выход из исключения
СообщениеДобавлено: 2019-окт-09 12:53 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1342
Откуда: Тула
Поскольку не знаю иного способа обратной связи с командой портала https://startmilandr.ru/ пишу тут.

Речь о статье Работа со стеком - Выход из исключения.

На данный момент там есть примечание о интересной проблеме:
Открыть Общий способ решения данной проблемы, +4 или +2, нам не известен. Если кто-то знает решение, поделитесь
Цитата:
UPDATE: С выходом из обработчика есть проблема, заключающаяся в том, что в общем случае неизвестно сколько байт занимает инструкция приведшая к исключению. Набор инструкций Thumb2 содержит 32-битные инструкции, поэтому в Cortex-M3/M4 высока вероятность того, что инструкция окажется 4-х байтной. Тогда действительно для выхода на следующую инструкцию необходимо увеличить PC на +4. Но если инструкция вызвавшая исключение была 2-х байтной, тогда при модификации +4 мы либо перескочим следующую 16-битную инструкцию, либо попадем в середину следующей 32-битной инструкции. В Cortex-M0/M1 почти все инструкции 2-х байтные - Instruction_sets.

В рассматриваемом далее примере деление производится 32-битной инструкцией, поэтому для данного варианта оправдан выход по +4. Но при чтении памяти обычно компилятором используются 16-битные инструкция. Поэтому, например, в 1986ВЕ8Т когда при чтении памяти не согласованной с ECC возникает исключение HardFault, то выход из него на следующую инструкцию необходимо делать через +2.

Общий способ решения данной проблемы, +4 или +2, нам не известен. Нашелся подобный вопрос в блоге ARM, но он остался без ответа. Если кто-то знает решение, поделитесь пожалуйста на info@startmilandr.ru.
Закрыть


Предлагаю: разобрать опкод инструкции, вызвавшей прерывание, на предмет её размера - два или четыре байта.
Для этого нужно проверить пять старших бит:
Цитата:
If bits [15:11] of the halfword being decoded take any of the following values, the halfword is the first halfword of a 32-bit instruction:
• 0b11101.
• 0b11110.
• 0b11111.
Otherwise, the halfword is a 16-bit instruction.


ARM®v7-M Architecture Reference Manual
https://static.docs.arm.com/ddi0403/eb/ ... 7m_arm.pdf

UPD: То есть, опираясь на код из статьи, получается так:
Код:
void HardFault_Handler_C(uint32_t stack[])
{
   //  Изменяем значение регистра PC
   //  на адрес инструкции на которую произойдет выход из исключения.
   unsigned address = stack[pc] & ~1U;
   unsigned opcode = *((unsigned *) address); // одна 32битная или две 16битных инструкции
   opcode = (opcode >> 11) & 0x1F;

   if( opcode > 12) {
      // опкоды, старшие 5 бит которых равны 13, 14, 15 указывают на 32-битную команду.
      stack[pc] = stack[pc] + 4;
   } else {
      stack[pc] = stack[pc] + 2;
   }
}


Не знаю, вроде бы нужно сбрасывать младший бит адреса инструкции, считанный как stack[pc].
Всё это нужно проверить!!!))))

UPD2: подкорректировал код.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: HardFaultExit - Выход из исключения
СообщениеДобавлено: 2019-окт-09 14:14 
Не в сети

Зарегистрирован: 2018-мар-18 15:49
Сообщения: 4
Спасибо большое, шикарный вариант!!!
Про опкоды думали, но представлялось что придется перебирать слишком много условий. Оказалось все просто!

PS: На этом форуме у нас почему-то постоянно отваливается пароль, поэтому обычно только читаем. Но ящик вроде должен работать info@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: HardFaultExit - Выход из исключения
СообщениеДобавлено: 2019-окт-09 14:58 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1342
Откуда: Тула
StartMilandr писал(а):
Спасибо большое, шикарный вариант!!!
Про опкоды думали, но представлялось что придется перебирать слишком много условий. Оказалось все просто!

PS: На этом форуме у нас почему-то постоянно отваливается пароль, поэтому обычно только читаем. Но ящик вроде должен работать info@milandr.ru

Пожалуйста.
Про опкоды я тоже так думал, но полчаса гугления... и нашёлся документ, уже сохранённый на компе. :wink:

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: HardFaultExit - Выход из исключения
СообщениеДобавлено: 2019-окт-09 16:50 
В сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 440
Откуда: ПКК "Миландр"
Полезная штука, спасибо!

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB