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

 
 
> Отладка STM32 в Keil
Boriska
сообщение Apr 21 2015, 04:40
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-11-07
Пользователь №: 32 772



При выполнении программы постоянно возникает ошибка IBUSERR. Во время HardFault в стеке содержится один и тот же адрес PC = 0x24.... А вот откуда программа попадает на этот адрес - не понятно. Проект большой, на FreeRTOS. Используется STM32F407.
Подскажите, какие способы отладки можно применить в данном случае? Можно ли воспользоваться MPU, а если можно, то как?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
A. Fig Lee
сообщение Apr 21 2015, 10:36
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(Boriska @ Apr 21 2015, 00:40) *
При выполнении программы постоянно возникает ошибка IBUSERR. Во время HardFault в стеке содержится один и тот же адрес PC = 0x24.... А вот откуда программа попадает на этот адрес - не понятно. Проект большой, на FreeRTOS. Используется STM32F407.
Подскажите, какие способы отладки можно применить в данном случае? Можно ли воспользоваться MPU, а если можно, то как?


CODE
void hard_fault_handler_c(unsigned int * hardfault_args)
{
unsigned int stacked_r0;
unsigned int stacked_r1;
unsigned int stacked_r2;
unsigned int stacked_r3;
unsigned int stacked_r12;
unsigned int stacked_lr;
unsigned int stacked_pc;
unsigned int stacked_psr;

stacked_r0 = ((unsigned long) hardfault_args[0]);
stacked_r1 = ((unsigned long) hardfault_args[1]);
stacked_r2 = ((unsigned long) hardfault_args[2]);
stacked_r3 = ((unsigned long) hardfault_args[3]);

stacked_r12 = ((unsigned long) hardfault_args[4]);
stacked_lr = ((unsigned long) hardfault_args[5]);
stacked_pc = ((unsigned long) hardfault_args[6]);
stacked_psr = ((unsigned long) hardfault_args[7]);

TRACE ("[Hard fault handler]\n");
TRACE ("R0 = %x\n", stacked_r0);
TRACE ("R1 = %x\n", stacked_r1);
TRACE ("R2 = %x\n", stacked_r2);
TRACE ("R3 = %x\n", stacked_r3);
TRACE ("R12 = %x\n", stacked_r12);
TRACE ("LR = %x\n", stacked_lr);
TRACE ("PC = %x\n", stacked_pc);
TRACE ("PSR = %x\n", stacked_psr);
TRACE ("BFAR = %x\n", (*((volatile unsigned long *)(0xE000ED38))));
TRACE ("CFSR = %x\n", (*((volatile unsigned long *)(0xE000ED28))));
TRACE ("HFSR = %x\n", (*((volatile unsigned long *)(0xE000ED2C))));
TRACE ("DFSR = %x\n", (*((volatile unsigned long *)(0xE000ED30))));
TRACE ("AFSR = %x\n", (*((volatile unsigned long *)(0xE000ED3C))));

while (1);
return;
}

/*******************************************************************************
* Description : This function handles Hard Fault exception.
* Input : -
* Return : -
*******************************************************************************/
void HardFault_Handler(void)
{
// Go to infinite loop when Hard Fault exception occurs
asm("TST LR, #4");
asm("ITE EQ");
asm("MRSEQ R0, MSP");
asm("MRSNE R0, PSP");
asm("B hard_fault_handler_c");

while (1);

}


stacked_lr надо смотреть, если склероз не изменяет, это будет примерно аддресс ассемблерной команды где все грохнулось.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Boriska
сообщение Apr 22 2015, 12:08
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 28-11-07
Пользователь №: 32 772



Цитата(A. Fig Lee @ Apr 21 2015, 13:36) *
stacked_lr надо смотреть, если склероз не изменяет, это будет примерно аддресс ассемблерной команды где все грохнулось.

В том и проблема, что ссылка идет на адрес 0x24...... (это за пределами встроенной оперативки). При том, что код выполняется с flash. В руководстве написано, что при IBUSERR, адрес возникновения ошибки определить не получится.
Я подумал, что может с помощью memory protection unit можно защитить этот сегмент памяти, так, чтобы при обращении к нему происходила остановка? Вот только нигде не нашел как с этим MPU работать.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Apr 22 2015, 15:25
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(Boriska @ Apr 22 2015, 15:08) *
В том и проблема, что ссылка идет на адрес 0x24...... (это за пределами встроенной оперативки). При том, что код выполняется с flash. В руководстве написано, что при IBUSERR, адрес возникновения ошибки определить не получится.
Я подумал, что может с помощью memory protection unit можно защитить этот сегмент памяти, так, чтобы при обращении к нему происходила остановка? Вот только нигде не нашел как с этим MPU работать.

если из flash такая ошибка, может циклы ожидания слишком короткие в настройках flash controller? попробуйте увеличить до максимума
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:28
Рейтинг@Mail.ru


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