Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: обработка прерывания в IAR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Метценгерштейн
зашел в прерывание, от туда вызвал ф-ю
Код
Recv_Data_From_Interrupt ();

http://c2n.me/iOhRcY
жму F1, попадаю в нее
http://c2n.me/iOhRy1
из нее вызывается еще одна ф-я.
жму F11
http://c2n.me/iOhRVJ
и попадаю не в ту очередную ф-ю, на на скобку.

Разве нельзя из прерывания вызывать функции матрешкой? Или это глюк?
Dejmos
Да можно, наверное... хотя это вроде как считается плохим тоном.
Может быть сильно мелкий размер стека в настройках линкера, хотя тогда он скорее вывалится с ошибкой.
Еще у меня такое часто проявлялось на железках с кривым подключением JTAG'а (длинными и запутанными проводами). Но редко повторялось несколько раз в одном месте.
Еще вариант - а есть ли что-то полезное в redirect_data? Ее мог грохнуть оптимизатор.

P.S. И при чем тут F1?
Метценгерштейн
F1- опечатка, F11 имеется ввиду.
программатор- плата F4Discovery- должно быть все нормально.
Код
void redirect_data (void) {
  for (uint8_t i =0; i < 4; i ++) {
    WIZ_DESTIP [i] = recv_IP [i];
    }

    WIZ_DestPort [0] = recv_IP [4];
    WIZ_DestPort [1] = recv_IP [5];
    dstPort = (WIZ_DestPort[0] << 8) + WIZ_DestPort [1];
      
  sendto(0, &recv_IP[8], RX_dataSize-8, WIZ_DESTIP, dstPort);
}

эта ф-я полезна, т.к. она и пересылает данные обратно.
тон, может и плохой, но это пока отладка. Но, так быть не должно?
WitFed
Нет, хороший отладчик в режиме Debug (ключ компилятора "-o0") должен показывать всё, что угодно, заходить, куда угодно, а также изменять место исполнения на указанную строку и т.д.
Может Release (типа "-o3") у вас, да все WIZ_* объявлены недостаточно убедительно ?
Можно получить map-файл и увидеть там отдельный адрес функции redirect_data() ?
А также дизассемблерное представление программы, и там 20 команд для неё же присутствуют ?
Даже если заинлайнится функция, отладчик в тексте всё равно ходит по ней, эмулируя юзерскую логику.
Правда, DS-5 у меня сейчас чудит периодически для ARM, но стабильно...
Можно в текущем сеансе переключиться в дизассемблер ? Там пошаговые инструкции исполняются, всё должно быть на ладони.
По-любому, перед вызовом redirect_data() можно в её теле поставить точку останова -- оно ж большое, и если нигде это не удастся, то железно функция опущена оптимизацией, иначе на эту ТО по F11 должно перейти.
Матрёшечность может быть любая -- это личное дело каждого, типа толерантности, ну чуть дольше будет отрабатываться прерывание, мож кому-то от этого хорошо... wink.gif Конечно, если 20 уровней вложенности -- такое лучше гасить, вон у MS в драйверах столько мусора наверчено высоко-архитектурного... Не более 1500 обработок за секунду, один из тормозных источников Винд wink.gif
Главное -- не вызывать в прерывании специально оговоренные функции, типа ожидания семафора, которые могут занять неопределённый период и вообще завести систему в клинч.
Не знаю, относится ли к ним sendto() -- вдруг там внутри семафор для разграничения доступа к общему ресурсу ?
Это надо глядеть документацию на используемую ОС.
А если Baremetal, кучи нитей и мудрёной синхронизации нет, то можно вообще всё.
В переполнение стека не верится -- обе функции детские, переменных локальных кот наплакал, если только внешний поток управления, прерванный прерыванием, очень мощный... Но это нужно глядеть на регистр стека в окне регистров, бывает такое в IDE ? И сравнивать с допустимым диапазоном.
Метценгерштейн
странно, подвигал текст, пописал, потом вернулся к исходному, решил проверить идею WitFed, сделал назад все как было...
... и заработало!
что за хрень?
скриншоты сами же видели, а тут все нормально. спокойно по F11 заходит как надо
Dejmos
Черная магия sm.gif
WitFed
Просто в современных ИТ от недостатка гениев всё очень сложно и запутанно, все связи/пересечения/варианты тысяч бит состояния отследить и вылечить возможные пути образования глюков невозможно.
У меня давно выработался рецепт -- если видишь глюк странный, нужно скопировать весь каталог проекта с ним для "образца", чтобы было, из чего устойчиво повторять в ещё одной (третьей) копии, вдруг в основной ветке после пары пассов всё испарится. Правда, не всегда об этом помню... wink.gif И svn тут слабый помощник, на него обычно промежуточные файлы не пишутся, а причина может быть там.
Этот весь каталог при уверенности в своей правоте потом можно слать производителям, уменьшив проблему до приличной -- пусть лечат. Перекомпилят все файлы по одному, перелинкуют, найдут таки место, где проблема сидит...
Ещё вчера забыл предложить метод диагностики -- вызвать первую функцию не из прерывания и глянуть, будет ли нормально отлаживаться вторая.
Метценгерштейн
спасибо за советы, буду вылавливать глюки)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.