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

 
 
> Перенос векторов прерываний в nRF51822
sevstels
сообщение Mar 19 2018, 13:55
Сообщение #1


Знающий
****

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



Подскажите если есть идеи, где мог сделать ошибкy.

Недавно подключить к готовому проекту Cortex M0 bootloader. Перенес вектора прерываний приложения из начала флеш в середину, сделал ремап векторов. scmRTOS запускается успешно но стал вылетать в HardFault_Handler после вызова channel.push() в прерывании UART.

Вылет происходит когда накладываюя 2 прерывания.
От системного таймера и вызова метода push().

Поиск выхода в точку падения по методу Сергей Борщ, в дизассемблере по шагам на выход из обработчика стабильно приводит к позиции scmRTOS: while(CurProcPriority != SchedProcPriority);

Размер стека я менял - не помогает.
Если медленно шагать по щагам в дизасме, найти точку вылета не получается. Все работает.

Я знаю, что каналы в прерываниях использовать не рекомендовано. Но программа отлично и долго работала в этом варианте. И только сдвиг векторов из начала flash порушил работоспособность.

Неделя борьбы с багом ни к чему не привела, может у кого есть свежая идея. Спасибо.


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sevstels
сообщение Mar 20 2018, 05:14
Сообщение #2


Знающий
****

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



>> что за шаманство с вводом адреса из sp?

Нашел данную методику но она не помогает.

1. Первым важным для нас регистром является счетчик команд.
Переменная pc содержит значение счетчика команд где содержится адрес инструкции, которая выполнялась, когда произошла
Hard Fault ошибка (или другая ошибка).

Чтобы найти инструкцию по адресу, содержащемуся в переменной pc,
откройте окно Disassembly (IAR) в отладчике и вручную введите адрес в окно Go to для
просмотра asm инструкций по этому адресу.

2. Далее вручную установите точку останова в Disassembly отладчике или точку прерывания
выполнения или доступа по этому адресу. С установленной точкой
останова перезапустите приложение, чтобы увидеть, к какой
строке C/C++ кода относится инструкция.

3. Код обработчика HardFault_Handler()

#pragma section = "CSTACK"
#pragma optimize=none
extern "C" void HardFault_Handler(void)
{
volatile uint32_t r0;
volatile uint32_t r1;
volatile uint32_t r2;
volatile uint32_t r3;
volatile uint32_t r12;
volatile uint32_t lr;
volatile uint32_t pc;
volatile uint32_t psr;

uint32_t *pStackAddress = (uint32_t*)__section_begin("CSTACK");
r0 = pStackAddress++;
r1 = pStackAddress++;
r2 = pStackAddress++;
r3 = pStackAddress++;
r12 = pStackAddress++;
lr = pStackAddress++; //Link register
pc = pStackAddress++; //Program counter
psr = pStackAddress; //Program status register

//When the following line is hit, the variables contain the register values

volatile int i = 0;
while(i==0); //Stop here
}

По данной методике результат можно посмотреть на картинке.

Методика 2.
Шагаем в Disassembly из обработчика.

Момент останова в обработчике > картинка
Момент выхода из обработчика > картинка

>>Вопрос третий - вылетает при первом же обращении к push()?
Обычно после первого же, но иногда со второго.

>>прерывание возникает раньше, чем запустилась ОС?
Исключено. Прерывания запрещены до старта OS. Прерывание UART приходит с компа по моей команде, когда уже программа запущена. Если метод push() закомментировать, то все работает, но нет связи по UART.

Сообщение отредактировал sevstels - Mar 20 2018, 07:04


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 20 2018, 14:13
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (sevstels @ Mar 20 2018, 07:14) *
Нашел данную методику но она не помогает.
По данной методике результат можно посмотреть на картинке.
На всех ваших картинках SP_main имет значения порядка 0x2000043x, то есть стек прерываний расположен где-то в начале ОЗУ и, судя по всему, довольно небольшого размера. Такое ощущение, что этот стек переполняется и затирает объект OS::Kernel, а дальше, при перепланировке, происходит унос черт знает куда из-за загрузки мусора в PC.

На картинке test-3 в архиве (по прямой ссылке другая картинка) отладчик показывает адрес OS:TKernel равный 0x0000122B, но этого не может быть - в этих адресах нет ОЗУ.


Расскажите более подробно о ремапе векторов. Возможно вы в нем затираете какие-то данные.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sevstels   Перенос векторов прерываний в nRF51822   Mar 19 2018, 13:55
- - Сергей Борщ   QUOTE (sevstels @ Mar 19 2018, 15:55) Под...   Mar 19 2018, 14:52
- - sevstels   1. Свободное место проверяется, канал никогда не п...   Mar 19 2018, 15:52
|- - Сергей Борщ   QUOTE (sevstels @ Mar 19 2018, 17:52) 2. ...   Mar 19 2018, 18:45
- - sevstels   All pictures by one zip На мой взгляд целесообраз...   Mar 20 2018, 06:45
- - Baser   Цитата(sevstels @ Mar 19 2018, 15:55) Нед...   Mar 20 2018, 17:46
|- - Сергей Борщ   QUOTE (Baser @ Mar 20 2018, 19:46) Немног...   Mar 20 2018, 18:47
|- - Baser   Цитата(Сергей Борщ @ Mar 20 2018, 20:47) ...   Mar 20 2018, 22:00
- - sevstels   Цитата(Baser @ Mar 21 2018, 02:46) Немног...   Mar 21 2018, 11:21
|- - Baser   Цитата(sevstels @ Mar 21 2018, 13:21) Пом...   Mar 21 2018, 12:20
|- - Сергей Борщ   Чтобы за время вашего отпуска мысли не забылись, и...   Mar 23 2018, 11:01
- - sevstels   >> чем не угодил стандартный способ ремапа Н...   Mar 21 2018, 13:40
|- - Baser   Цитата(sevstels @ Mar 21 2018, 15:40) ...   Mar 21 2018, 13:59
- - sevstels   Производитель еще тот крендель. Они ничего не реко...   Mar 21 2018, 14:35
|- - AHTOXA   Ух ты, сколько интересного я пропустил Предлагаю ...   Mar 21 2018, 14:51
- - sevstels   Проверял. Смещение текущего прерывания четко опред...   Mar 21 2018, 15:00
|- - AHTOXA   Цитата(sevstels @ Mar 21 2018, 20:00) Про...   Mar 21 2018, 15:13
- - sevstels   Уже этот вариант тестил. В ОЗУ выделил константу, ...   Mar 21 2018, 15:27
|- - AHTOXA   push() вызывает перепланировку. Взводит флаг преры...   Mar 21 2018, 18:15
- - sevstels   Нет, все на месте, первым делом макрос проверяю. В...   Mar 21 2018, 18:29
- - Baser   Цитата(sevstels @ Mar 21 2018, 16:35) Про...   Mar 22 2018, 09:24
- - sevstels   Спасибо. К сожалению таймаут на месяц. Вернусь с ...   Mar 22 2018, 15:57
- - sevstels   Снимаю шляпу... реально гениально. Ваша версия irq...   May 2 2018, 01:39


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

 


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


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