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

 
 
> Не могу понять природу исключения
Jenya7
сообщение Jun 5 2018, 13:39
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть функция в которой вызывается другая функция
Код
d_RangeToTarget = round_int16(s1553_AH64A_Conv.Range_AID, 1.0);
при попадании на эту строчку контролер уходит в исключение и я не могу отследить причину так как я не могу даже сделать Step Into.сама функция ничего особобенного не представляет
Код
double round_int16(double num2rnd, double scale)
{
    double l_temp_mod = 0, l_num_after_rnd = 0, l_temp_mod2 = 0, temp_scale =0;
    
    //int32_t num_int =0;
    //num_int = (uint32_t)num2rnd;

    //l_temp_mod = fmod(num2rnd, scale);

    if(l_temp_mod < 0.0)
    {
        l_temp_mod2 = l_temp_mod * (-1.0);
        temp_scale  = scale * (-1.0);
    }
    else
    {
        l_temp_mod2 = l_temp_mod;
        temp_scale = scale;
    }

    if ((l_temp_mod2)>= (scale/2))
        l_num_after_rnd = num2rnd- (l_temp_mod) + temp_scale;
    else
        l_num_after_rnd = num2rnd- l_temp_mod;

    return l_num_after_rnd;
}
как можно отследить проблему?

Сообщение отредактировал Jenya7 - Jun 5 2018, 13:40
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 27)
aaarrr
сообщение Jun 5 2018, 13:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Jun 5 2018, 16:39) *
как можно отследить проблему?

После попадания в исключение можно узнать адрес из стекфрейма (контроллер по умолчанию - Cortex-M, ага).
Но я бы прежде всего посмотрел определение s1553_AH64A_Conv.Range_AID, очень вероятно, что выполняется
чтение двойного слова с недопустимым выравниванием.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 5 2018, 14:34
Сообщение #3


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(aaarrr @ Jun 5 2018, 19:49) *
После попадания в исключение можно узнать адрес из стекфрейма (контроллер по умолчанию - Cortex-M, ага).
Но я бы прежде всего посмотрел определение s1553_AH64A_Conv.Range_AID, очень вероятно, что выполняется
чтение двойного слова с недопустимым выравниванием.
да. Cortex-М4ю
вроде все нормально
Код
typedef struct
{
     double Range_AID;
      ...........................    
      ..........................
}
muxbus_sDataAfterConvert_AH64A_messages;

muxbus_sDataAfterConvert_AH64A_messages s1553_AH64A_Conv;

View -> Call Stack показывает вхождение в эту функцию и все - никакой индикации.

Сообщение отредактировал Jenya7 - Jun 5 2018, 14:35
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 5 2018, 15:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Jun 5 2018, 17:34) *
View -> Call Stack

Не то, нужен Stack Frame. Можно просто посмотреть содержимое памяти по указателю SP - по смещению 0x14 будет адрес инструкции, вызвавшей исключение.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 5 2018, 15:16
Сообщение #5


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(aaarrr @ Jun 5 2018, 21:02) *
Не то, нужен Stack Frame. Можно просто посмотреть содержимое памяти по указателю SP - по смещению 0x14 будет адрес инструкции, вызвавшей исключение.

SP = 0x2000FF68 - он не изменился после Step Into.

я не понимаю чем эта функция не понравилась контролеру и до нее и после нее есть куча других функций и все работают.

Сообщение отредактировал Jenya7 - Jun 5 2018, 15:19
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 5 2018, 15:26
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Jun 5 2018, 18:16) *
SP = 0x2000FF68 - он не изменился после Step Into.

А если бы он был равен 0x12345678 - это что нибудь прояснило, как думаете?
Содержимое стек-фрейма. Из него адрес. По адресу в дизассемблере инструкцию. По инструкции и содержимому регистров делаем выводы.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 5 2018, 15:41
Сообщение #7


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(aaarrr @ Jun 5 2018, 21:26) *
А если бы он был равен 0x12345678 - это что нибудь прояснило, как думаете?
Содержимое стек-фрейма. Из него адрес. По адресу в дизассемблере инструкцию. По инструкции и содержимому регистров делаем выводы.

извиняюсь за тупость - а где есть содержимое стек-фрейма?

по дизасембли - прыгает в default_isr - почему непонятно

Сообщение отредактировал Jenya7 - Jun 5 2018, 15:45
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 5 2018, 16:05
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Jun 5 2018, 18:41) *
извиняюсь за тупость - а где есть содержимое стек-фрейма?

В памяти, по адресу, на который указывает SP.

Цитата(Jenya7 @ Jun 5 2018, 18:41) *
по дизасембли - прыгает в default_isr - почему непонятно

Наверное, обработчика для fault'а нет.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 6 2018, 08:09
Сообщение #9


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Вынесите функцию из параметра.
Вместо функции "разверните" ее код в Inline.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 6 2018, 08:41
Сообщение #10


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jun 6 2018, 14:09) *
Вынесите функцию из параметра.
Вместо функции "разверните" ее код в Inline.
функция имела следующий вид
Код
void data_calculation_AH64A(uint8_t flag)
{
    switch (flag)
    {
        case MSG_04R04:
        if(s1553_AH64A_Conv.TADS_Operate_CMD == 1)
            {
                d_RangeToTarget = round_int16(s1553_AH64A_Conv.Range_AID, 1.0);
            }
        else
            {
                d_RangeToTarget = 0;
            }

        d_PitchAngle = round_int16(s1553_AH64A_Conv.Pitch_AID, 0.1);
        d_RollAngle = round_int16(s1553_AH64A_Conv.Roll_AID, 0.1);
        b_RangeValidy = s1553_AH64A_Conv.TADS_Operate_CMD;
        b_PitchAngleValidy = s1553_AH64A_Conv.Pitch_AID_Valid;
        b_RollAngleValidy = s1553_AH64A_Conv.Roll_AID_Valid;
    break;    
   //и так далее
}

для проверки изменил
Код
void data_calculation_AH64A(uint8_t flag)
{
    double dval=0;
    
    switch (flag)
    {
        case MSG_04R04:
        if(s1553_AH64A_Conv.TADS_Operate_CMD == 1)
            {
                d_RangeToTarget = round_int16(dval, 1.0);
                s1553_AH64A_Conv.Range_AID = dval;
            }
        else
            {
        d_RangeToTarget = 0;
            }

        d_PitchAngle = round_int16(s1553_AH64A_Conv.Pitch_AID, 0.1);
        d_RollAngle = round_int16(s1553_AH64A_Conv.Roll_AID, 0.1);
        b_RangeValidy = s1553_AH64A_Conv.TADS_Operate_CMD;
        b_PitchAngleValidy = s1553_AH64A_Conv.Pitch_AID_Valid;
        b_RollAngleValidy = s1553_AH64A_Conv.Roll_AID_Valid;
    break;

на строчке double dval=0; вываливается в исключение.
Такое может быть из за неправильного линкер файла?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 6 2018, 10:17
Сообщение #11


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Если обычный стек - может "зашкал" ? Или в линк-файле недостаточно или неправильно указан сегмент стека. (или в опциях проекта)
Попробуйте
double dval=0.; (хотя и неявно должно приводить)
double dval=0.f;
static double dval=0.;
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 6 2018, 11:08
Сообщение #12


Гуру
******

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



QUOTE (Jenya7 @ Jun 6 2018, 11:41) *
на строчке double dval=0; вываливается в исключение.
Очередной конкурс на телепатию? Какая ассемблерная команда выполняется, каково содержимое регистров, занятых в команде, какой в конце-концов процессор? Вы боитесь при приблежении к проблеменому участку открывать окно дизассемблера и ходить в нем по ассемблерным командам?

Я не помню зачем, но ABI требует выравнивание стека на 8 байт. Вроде аргументировали работой с плавающей точкой. Не оно? Процессор какой? Работа с плавающей точкой аппаратная или программная?


--------------------
На любой вопрос даю любой ответ
"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
Jenya7
сообщение Jun 6 2018, 11:33
Сообщение #13


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Jun 6 2018, 16:08) *
Очередной конкурс на телепатию? Какая ассемблерная команда выполняется, каково содержимое регистров, занятых в команде, какой в конце-концов процессор? Вы боитесь при приблежении к проблеменому участку открывать окно дизассемблера и ходить в нем по ассемблерным командам?

Я не помню зачем, но ABI требует выравнивание стека на 8 байт. Вроде аргументировали работой с плавающей точкой. Не оно? Процессор какой? Работа с плавающей точкой аппаратная или программная?
Это Kinretis MK10. debug1 - это я остановился на строчке где вылетает. debug2 - следующий шаг - вылет в исключение.

между двумя этими событиями нет ничего что бы объяснило что вызвало default_isr.

Сообщение отредактировал Jenya7 - Jun 6 2018, 11:38
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 6 2018, 12:10
Сообщение #14


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



По map-файлу проверьте еще где (адреса) размещена s1553_AH64A_Conv.
Для поиска вылета попробуйте изменить для нее класс памяти (например, вынести в глобальные под __root).

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 6 2018, 13:18
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Jun 6 2018, 14:33) *
debug2 - следующий шаг - вылет в исключение.

Вот тут откройте окошко с памятью и посмотрите содержимое с адреса 0x2000ff68.

Или в окошке дизассемблера по шагам до исключения пройдите из состояния debug1.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 6 2018, 14:23
Сообщение #16


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



странно. при вхождении в эту функцию я получаю сообщение от дебагера. в других функциях я такого сообщения не получаю.

Цитата(aaarrr @ Jun 6 2018, 18:18) *
Вот тут откройте окошко с памятью и посмотрите содержимое с адреса 0x2000ff68.

Или в окошке дизассемблера по шагам до исключения пройдите из состояния debug1.


там находяться какие то данные 14 07
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 6 2018, 15:21
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Jun 6 2018, 17:23) *
там находяться какие то данные 14 07

С адресом я ошибся несколько. Схема следующая:
- Ловим exception
- Смоторим SP
- Изучаем содержимое стека
- Смотрим дизассемблер, делаем выводы
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 6 2018, 15:30
Сообщение #18


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(aaarrr @ Jun 6 2018, 20:21) *
С адресом я ошибся несколько. Схема следующая:
- Ловим exception
- Смоторим SP
- Изучаем содержимое стека
- Смотрим дизассемблер, делаем выводы


А где в IAR можно увидеть Exception stack frame?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 6 2018, 15:35
Сообщение #19


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Посмотрите в опциях проекта Linker - Advanced, нижняя птичка. Stack usage.
Я отсадил бы вылетающий код в отдельный проект и попробовал его под симулятором.
На кол-во "активных" BP есть ограничение. Если вылазит ругательство - убирайте ненужные BP.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 7 2018, 04:37
Сообщение #20


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jun 6 2018, 20:35) *
Посмотрите в опциях проекта Linker - Advanced, нижняя птичка. Stack usage.
Я отсадил бы вылетающий код в отдельный проект и попробовал его под симулятором.
На кол-во "активных" BP есть ограничение. Если вылазит ругательство - убирайте ненужные BP.

брэкпоинт один а он видит целую кучу.

когда я кликаю на Exception Frame компайлер посылает меня в какойто адрес вообще за границами програмной памяти 0xffffffff8


Сообщение отредактировал Jenya7 - Jun 7 2018, 04:59
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 7 2018, 05:07
Сообщение #21


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Jun 7 2018, 07:37) *
брэкпоинт один а он видит целую кучу.

Посмотрите опции настройки J-link, там и исключения поминаются. Уменьшите скорость интерфейса, если это возможно.
Оптимизацию, я думаю, Вы отключили. А с количеством BP это как-то странно.
Для установки BP используйте __no_operation();
В проблемной ф-ии закомментируйте весь код, оставьте __no_operation() и return.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 10 2018, 05:39
Сообщение #22


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jun 7 2018, 10:07) *
Посмотрите опции настройки J-link, там и исключения поминаются. Уменьшите скорость интерфейса, если это возможно.
Оптимизацию, я думаю, Вы отключили. А с количеством BP это как-то странно.
Для установки BP используйте __no_operation();
В проблемной ф-ии закомментируйте весь код, оставьте __no_operation() и return.


С пустой функцией все нормально. Но если вставляю строчку в нее - вылетает в эксепшен на0x32da 0xed2d 0x8b02 VPUSH {D8}.
Я вообще в шоке. Работаю с IAR несколько лет не помню чтоб когда то такое было.

я все время попадаю в
Код
void default_isr(void)
{
   #define VECTORNUM  (*(volatile uint8_t*)(0xE000ED04))

   printf("\n****default_isr entered on vector %d*****\r\n\n",VECTORNUM);
   return;
}

в терминале смотрю что printf написал
Цитата
****default_isr entered on vector 3*****

полная хренотень

Сообщение отредактировал Jenya7 - Jun 10 2018, 05:58
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 10 2018, 07:06
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Jun 10 2018, 08:39) *
полная хренотень

А FPU-то включен? Что в CPACR пишется?
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 10 2018, 07:48
Сообщение #24


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(aaarrr @ Jun 10 2018, 12:06) *
А FPU-то включен? Что в CPACR пишется?


блиииин. спасибо. отключил FPU - все бежит. но как? у камня есть аппаратный FPU и при создании проекта IAR честно включает его в настройках - General Options -> Floating point settings -> VFPv4 single precision.

Вопрос кому морду бить - производителям камня или IAR?

Сообщение отредактировал Jenya7 - Jun 10 2018, 07:51
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 10 2018, 08:06
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Jun 10 2018, 10:48) *
Вопрос кому морду бить - производителям камня или IAR?

Не знаю, как принято у IAR'а, но по-моему, инициализация железа - это таки дело пользователя.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 10 2018, 08:21
Сообщение #26


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(aaarrr @ Jun 10 2018, 13:06) *
Не знаю, как принято у IAR'а, но по-моему, инициализация железа - это таки дело пользователя.


а что есть инициализация FPU? я нигде в примерах для Kinetis не встречал.

мда. порылся в драйверах и там есть fpu.h - __intrinsic void __enable_FPU(void); я думал модуль работает сразу, без лишних телодвижений.

есть более универсальный код
Код
#define CORTEX_M4_BLOCK  0xe000e000
#define CPACR *(unsigned long *)(CORTEX_M4_BLOCK + 0xd88)  // Co-processor Access Control

CPACR |= (0xf << 20);   // enable access to FPU


Сообщение отредактировал Jenya7 - Jun 10 2018, 08:49
Go to the top of the page
 
+Quote Post
k155la3
сообщение Jun 11 2018, 08:32
Сообщение #27


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Jenya7 @ Jun 10 2018, 10:48) *
. . . Вопрос кому морду бить - производителям камня или IAR?
Посмотрите еще в "родных" аппнотах, в проектах IAR, могут быть установлены
макро-переменные, Compiler - Preprocessor, predefined symb. В опциях линкера тоже могут устанавливаться. Может библиотека какая не прилинковалась /правильно/.

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jun 12 2018, 08:15
Сообщение #28


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(k155la3 @ Jun 11 2018, 13:32) *
Посмотрите еще в "родных" аппнотах, в проектах IAR, могут быть установлены
макро-переменные, Compiler - Preprocessor, predefined symb. В опциях линкера тоже могут устанавливаться. Может библиотека какая не прилинковалась /правильно/.


оказывается в Кинетис FPU надо запускать. у меня был проект для К70 и там в SysInit он запускался а в SysInit для К10 нет.

так что морду надо бить мне.
Go to the top of the page
 
+Quote Post

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

 


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


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