реклама на сайте
подробности

 
 
> Передача адреса DATA ABORT из исключения
id_Alx
сообщение Mar 25 2011, 12:18
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 12-08-06
Из: Минск
Пользователь №: 19 504



В ходе выполения программа выпадает в DATA ABORT и перезапускается WDT. Хочу после перезапуска получить адрес инструкции вызвавшей исключение. В исключении сохраняю в глобальную переменную, в основном теле вычитываю при старте. В отладчике все работает. Без отладчика переменная abort_addr из исключения не устанавливается, а при каждом нажатии на сброс увеличивается на единицу. Почему не устанавливается?

Код
static volatile __no_init dword abort_addr;

#pragma optimize = none
__irq __arm void Abort_Handler()
{
  static __no_init dword j;
  dword ttt = j;
  
  asm("sub r0,lr,#8  \n" );
  abort_addr = ttt;
  while (1)
  {
  }
}


int main( void )
{
  // всякая инициализация

  printf( "0x%08X", abort_addr ); // III
  abort_addr++;

  while (1);
}


Сообщение отредактировал id_Alx - Mar 25 2011, 12:18
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
yashok
сообщение Mar 25 2011, 12:31
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Цитата
Без отладчика переменная abort_addr из исключения не устанавливается, а при каждом нажатии на сброс увеличивается на единицу. Почему не устанавливается?


Если сброс происходит только при нажатии на сброс, значит он не идет на DATA ABORT.
Go to the top of the page
 
+Quote Post
id_Alx
сообщение Mar 25 2011, 12:51
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 79
Регистрация: 12-08-06
Из: Минск
Пользователь №: 19 504



На DATA ABORT точно заходит, т.к. я сам его вызываю путем
Код
volatile word *k = (word *)1; // III
  *k = 1;
, в примере выше я вместо WDT использую сброс, с WDT ситуация аналогичная.

Код
static volatile __no_init dword abort_addr;

#pragma optimize = none
__irq __arm void Abort_Handler()
{
  static __no_init dword j;
  dword ttt = j;
  
  asm("sub r0,lr,#8  \n" );
  abort_addr = ttt;
  while (1)
  {
  }
}


int main( void )
{
  // всякая инициализация

  printf( "0x%08X", abort_addr ); // III
  abort_addr++;
  // ждем пока уйдет строка из буфера...

   volatile word *k = (word *)1; // III
  *k = 1; // DATA ABORT

  while (1);
}


Go to the top of the page
 
+Quote Post
sergeeff
сообщение Mar 25 2011, 14:58
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Заходите на сайте автора micromonitor'a (http://www.umonfw.com/releases/). Качаете последнюю версию. Там реализована простая и понятная схема отработки data_abort и прочего для ARM.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 02:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016