Перейти к содержанию
    

Не могу понять природу исключения

Есть функция в которой вызывается другая функция

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

После попадания в исключение можно узнать адрес из стекфрейма (контроллер по умолчанию - Cortex-M, ага).

Но я бы прежде всего посмотрел определение s1553_AH64A_Conv.Range_AID, очень вероятно, что выполняется

чтение двойного слова с недопустимым выравниванием.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После попадания в исключение можно узнать адрес из стекфрейма (контроллер по умолчанию - 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

View -> Call Stack

Не то, нужен Stack Frame. Можно просто посмотреть содержимое памяти по указателю SP - по смещению 0x14 будет адрес инструкции, вызвавшей исключение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не то, нужен Stack Frame. Можно просто посмотреть содержимое памяти по указателю SP - по смещению 0x14 будет адрес инструкции, вызвавшей исключение.

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

 

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А если бы он был равен 0x12345678 - это что нибудь прояснило, как думаете?

Содержимое стек-фрейма. Из него адрес. По адресу в дизассемблере инструкцию. По инструкции и содержимому регистров делаем выводы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если бы он был равен 0x12345678 - это что нибудь прояснило, как думаете?

Содержимое стек-фрейма. Из него адрес. По адресу в дизассемблере инструкцию. По инструкции и содержимому регистров делаем выводы.

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

 

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

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Наверное, обработчика для fault'а нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вынесите функцию из параметра.

Вместо функции "разверните" ее код в Inline.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вынесите функцию из параметра.

Вместо функции "разверните" ее код в 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; вываливается в исключение.

Такое может быть из за неправильного линкер файла?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если обычный стек - может "зашкал" ? Или в линк-файле недостаточно или неправильно указан сегмент стека. (или в опциях проекта)

Попробуйте

double dval=0.; (хотя и неявно должно приводить)

double dval=0.f;

static double dval=0.;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на строчке double dval=0; вываливается в исключение.
Очередной конкурс на телепатию? Какая ассемблерная команда выполняется, каково содержимое регистров, занятых в команде, какой в конце-концов процессор? Вы боитесь при приблежении к проблеменому участку открывать окно дизассемблера и ходить в нем по ассемблерным командам?

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очередной конкурс на телепатию? Какая ассемблерная команда выполняется, каково содержимое регистров, занятых в команде, какой в конце-концов процессор? Вы боитесь при приблежении к проблеменому участку открывать окно дизассемблера и ходить в нем по ассемблерным командам?

 

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

Это Kinretis MK10. debug1 - это я остановился на строчке где вылетает. debug2 - следующий шаг - вылет в исключение.

 

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

post-71075-1528284937_thumb.png

post-71075-1528284944_thumb.png

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По map-файлу проверьте еще где (адреса) размещена s1553_AH64A_Conv.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

debug2 - следующий шаг - вылет в исключение.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...