jenya7 0 5 июня, 2018 Опубликовано 5 июня, 2018 (изменено) · Жалоба Есть функция в которой вызывается другая функция 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; } как можно отследить проблему? Изменено 5 июня, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба как можно отследить проблему? После попадания в исключение можно узнать адрес из стекфрейма (контроллер по умолчанию - Cortex-M, ага). Но я бы прежде всего посмотрел определение s1553_AH64A_Conv.Range_AID, очень вероятно, что выполняется чтение двойного слова с недопустимым выравниванием. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 5 июня, 2018 Опубликовано 5 июня, 2018 (изменено) · Жалоба После попадания в исключение можно узнать адрес из стекфрейма (контроллер по умолчанию - 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 показывает вхождение в эту функцию и все - никакой индикации. Изменено 5 июня, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба View -> Call Stack Не то, нужен Stack Frame. Можно просто посмотреть содержимое памяти по указателю SP - по смещению 0x14 будет адрес инструкции, вызвавшей исключение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 5 июня, 2018 Опубликовано 5 июня, 2018 (изменено) · Жалоба Не то, нужен Stack Frame. Можно просто посмотреть содержимое памяти по указателю SP - по смещению 0x14 будет адрес инструкции, вызвавшей исключение. SP = 0x2000FF68 - он не изменился после Step Into. я не понимаю чем эта функция не понравилась контролеру и до нее и после нее есть куча других функций и все работают. Изменено 5 июня, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба SP = 0x2000FF68 - он не изменился после Step Into. А если бы он был равен 0x12345678 - это что нибудь прояснило, как думаете? Содержимое стек-фрейма. Из него адрес. По адресу в дизассемблере инструкцию. По инструкции и содержимому регистров делаем выводы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 5 июня, 2018 Опубликовано 5 июня, 2018 (изменено) · Жалоба А если бы он был равен 0x12345678 - это что нибудь прояснило, как думаете? Содержимое стек-фрейма. Из него адрес. По адресу в дизассемблере инструкцию. По инструкции и содержимому регистров делаем выводы. извиняюсь за тупость - а где есть содержимое стек-фрейма? по дизасембли - прыгает в default_isr - почему непонятно Изменено 5 июня, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 5 июня, 2018 Опубликовано 5 июня, 2018 · Жалоба извиняюсь за тупость - а где есть содержимое стек-фрейма? В памяти, по адресу, на который указывает SP. по дизасембли - прыгает в default_isr - почему непонятно Наверное, обработчика для fault'а нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 6 июня, 2018 Опубликовано 6 июня, 2018 · Жалоба Вынесите функцию из параметра. Вместо функции "разверните" ее код в Inline. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 июня, 2018 Опубликовано 6 июня, 2018 · Жалоба Вынесите функцию из параметра. Вместо функции "разверните" ее код в 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 26 6 июня, 2018 Опубликовано 6 июня, 2018 · Жалоба Если обычный стек - может "зашкал" ? Или в линк-файле недостаточно или неправильно указан сегмент стека. (или в опциях проекта) Попробуйте double dval=0.; (хотя и неявно должно приводить) double dval=0.f; static double dval=0.; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 6 июня, 2018 Опубликовано 6 июня, 2018 · Жалоба на строчке double dval=0; вываливается в исключение.Очередной конкурс на телепатию? Какая ассемблерная команда выполняется, каково содержимое регистров, занятых в команде, какой в конце-концов процессор? Вы боитесь при приблежении к проблеменому участку открывать окно дизассемблера и ходить в нем по ассемблерным командам? Я не помню зачем, но ABI требует выравнивание стека на 8 байт. Вроде аргументировали работой с плавающей точкой. Не оно? Процессор какой? Работа с плавающей точкой аппаратная или программная? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 6 июня, 2018 Опубликовано 6 июня, 2018 (изменено) · Жалоба Очередной конкурс на телепатию? Какая ассемблерная команда выполняется, каково содержимое регистров, занятых в команде, какой в конце-концов процессор? Вы боитесь при приблежении к проблеменому участку открывать окно дизассемблера и ходить в нем по ассемблерным командам? Я не помню зачем, но ABI требует выравнивание стека на 8 байт. Вроде аргументировали работой с плавающей точкой. Не оно? Процессор какой? Работа с плавающей точкой аппаратная или программная? Это Kinretis MK10. debug1 - это я остановился на строчке где вылетает. debug2 - следующий шаг - вылет в исключение. между двумя этими событиями нет ничего что бы объяснило что вызвало default_isr. Изменено 6 июня, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 6 июня, 2018 Опубликовано 6 июня, 2018 · Жалоба По map-файлу проверьте еще где (адреса) размещена s1553_AH64A_Conv. Для поиска вылета попробуйте изменить для нее класс памяти (например, вынести в глобальные под __root). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 6 июня, 2018 Опубликовано 6 июня, 2018 · Жалоба debug2 - следующий шаг - вылет в исключение. Вот тут откройте окошко с памятью и посмотрите содержимое с адреса 0x2000ff68. Или в окошке дизассемблера по шагам до исключения пройдите из состояния debug1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться