Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не могу понять природу исключения
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Jenya7
Есть функция в которой вызывается другая функция
Код
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;
}
как можно отследить проблему?
aaarrr
Цитата(Jenya7 @ Jun 5 2018, 16:39) *
как можно отследить проблему?

После попадания в исключение можно узнать адрес из стекфрейма (контроллер по умолчанию - Cortex-M, ага).
Но я бы прежде всего посмотрел определение s1553_AH64A_Conv.Range_AID, очень вероятно, что выполняется
чтение двойного слова с недопустимым выравниванием.
Jenya7
Цитата(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 показывает вхождение в эту функцию и все - никакой индикации.
aaarrr
Цитата(Jenya7 @ Jun 5 2018, 17:34) *
View -> Call Stack

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

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

я не понимаю чем эта функция не понравилась контролеру и до нее и после нее есть куча других функций и все работают.
aaarrr
Цитата(Jenya7 @ Jun 5 2018, 18:16) *
SP = 0x2000FF68 - он не изменился после Step Into.

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

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

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

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

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

Наверное, обработчика для fault'а нет.
k155la3
Вынесите функцию из параметра.
Вместо функции "разверните" ее код в Inline.
Jenya7
Цитата(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; вываливается в исключение.
Такое может быть из за неправильного линкер файла?
k155la3
Если обычный стек - может "зашкал" ? Или в линк-файле недостаточно или неправильно указан сегмент стека. (или в опциях проекта)
Попробуйте
double dval=0.; (хотя и неявно должно приводить)
double dval=0.f;
static double dval=0.;
Сергей Борщ
QUOTE (Jenya7 @ Jun 6 2018, 11:41) *
на строчке double dval=0; вываливается в исключение.
Очередной конкурс на телепатию? Какая ассемблерная команда выполняется, каково содержимое регистров, занятых в команде, какой в конце-концов процессор? Вы боитесь при приблежении к проблеменому участку открывать окно дизассемблера и ходить в нем по ассемблерным командам?

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

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

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

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

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

Или в окошке дизассемблера по шагам до исключения пройдите из состояния debug1.
Jenya7
странно. при вхождении в эту функцию я получаю сообщение от дебагера. в других функциях я такого сообщения не получаю.

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

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


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

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


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

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

когда я кликаю на Exception Frame компайлер посылает меня в какойто адрес вообще за границами програмной памяти 0xffffffff8
k155la3
Цитата(Jenya7 @ Jun 7 2018, 07:37) *
брэкпоинт один а он видит целую кучу.

Посмотрите опции настройки J-link, там и исключения поминаются. Уменьшите скорость интерфейса, если это возможно.
Оптимизацию, я думаю, Вы отключили. А с количеством BP это как-то странно.
Для установки BP используйте __no_operation();
В проблемной ф-ии закомментируйте весь код, оставьте __no_operation() и return.
Jenya7
Цитата(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*****

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

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


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

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

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

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


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

так что морду надо бить мне.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.