|
Не могу понять природу исключения |
|
|
|
Jun 5 2018, 13:39
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 27)
|
Jun 5 2018, 14:34
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 5 2018, 16:05
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Jenya7 @ Jun 5 2018, 18:41)  извиняюсь за тупость - а где есть содержимое стек-фрейма? В памяти, по адресу, на который указывает SP. Цитата(Jenya7 @ Jun 5 2018, 18:41)  по дизасембли - прыгает в default_isr - почему непонятно Наверное, обработчика для fault'а нет.
|
|
|
|
|
Jun 6 2018, 08:41
|
Профессионал
    
Группа: Участник
Сообщений: 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; вываливается в исключение. Такое может быть из за неправильного линкер файла?
|
|
|
|
|
Jun 6 2018, 11:08
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jun 6 2018, 11:33
|
Профессионал
    
Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 6 2018, 14:23
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
странно. при вхождении в эту функцию я получаю сообщение от дебагера. в других функциях я такого сообщения не получаю. Цитата(aaarrr @ Jun 6 2018, 18:18)  Вот тут откройте окошко с памятью и посмотрите содержимое с адреса 0x2000ff68.
Или в окошке дизассемблера по шагам до исключения пройдите из состояния debug1. там находяться какие то данные 14 07
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 6 2018, 15:21
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Jenya7 @ Jun 6 2018, 17:23)  там находяться какие то данные 14 07 С адресом я ошибся несколько. Схема следующая: - Ловим exception - Смоторим SP - Изучаем содержимое стека- Смотрим дизассемблер, делаем выводы
|
|
|
|
|
Jun 6 2018, 15:30
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(aaarrr @ Jun 6 2018, 20:21)  С адресом я ошибся несколько. Схема следующая: - Ловим exception - Смоторим SP - Изучаем содержимое стека- Смотрим дизассемблер, делаем выводы А где в IAR можно увидеть Exception stack frame?
|
|
|
|
|
Jun 7 2018, 04:37
|
Профессионал
    
Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 7 2018, 05:07
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(Jenya7 @ Jun 7 2018, 07:37)  брэкпоинт один а он видит целую кучу. Посмотрите опции настройки J-link, там и исключения поминаются. Уменьшите скорость интерфейса, если это возможно. Оптимизацию, я думаю, Вы отключили. А с количеством BP это как-то странно. Для установки BP используйте __no_operation(); В проблемной ф-ии закомментируйте весь код, оставьте __no_operation() и return.
|
|
|
|
|
Jun 10 2018, 05:39
|
Профессионал
    
Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 10 2018, 08:21
|
Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|