GAYVER 2 September 15 Posted September 15 · Report post По долгу службы пришлось делать работу штатного программиста и писать драйвер и программу под цинк 7к. До этого момента с витисом дел не имел. и на сях писал толкьо простенькие скетчи для ардуины. И, собственно, в процессе отладки столкнулся с несколькими непонятными моментами. 1. Запускаю дебагер, пошагово выполняю программу. При входе в функцию XEmacPs_BdRingCreate (библиотека "xemacps_bdring.c" драйвера emacps) наблюдаю следующую картину - пошаговый отладчик в линейно написанном коде скачет по строкам как хочет. Условно последовательность выполнения строк может быть - 1-2-3-4-5-10-6-7-15-20-15-16-11-25, итд итп. При том что выполнятся они должны линейно - 1-2-3-4-...-20-21-23-... (ну, за исключением цикла). Код в строчках (если на нее прыгнули) выполняется, переменные переписываются. Вопрос в том что значения этих переменных из-за скачков - не верные. Собственно вопрос - это что за фигня? 2. В этой же функции присутствует цикл на 2 строчки - заполнение адресов цепочки дескрипторов. Ввиду первого пункта этот цикл не выполняется от слова совсем. Счетчик цикла не наращивается. Но было замечено следующее - при удалении объявления переменной счетчика цикла, компилятор не ругается на наличие необъявленной переменной. Компилятор ругается на то что не может найти подключаемую стандартную библиотеку "xil_types.h" в самописной библиотеке, в совершенно другом файле, написанном для работы с микрухой физики. Самописная библиотека до этого была проверена и отлажена. Проверки на двойные включения либ в ней есть. И, собственно, второй вопрос - это что за хрень??? Где связь между необъявленной переменной и включением библиотеки в другом конце кода????? Ну и главный вопрос - куда бежать и что делать? Я сейчас что-то даже поисковый запрос для гугла не могу составить... Фиг знает что у него спрашивать, чтобы адекватный ответ получить Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 83 September 15 Posted September 15 · Report post 15 минут назад, GAYVER сказал: 1. Запускаю дебагер, пошагово выполняю программу... Собственно вопрос - это что за фигня? Вероятно, программа собрана под ненулевым уровнем оптимизации. В оптимизированной программе зависимости между Си и реальным дизасм-выхлопом ломаются от слова совсем. По второму пункту - опять же - если смотрите под отладчиком на оптимизации - то занятие бесполезное. На выходе из функции если результат правильный - значит все ок. Quote Share this post Link to post Share on other sites More sharing options...
GAYVER 2 September 15 Posted September 15 · Report post 19 минут назад, Arlleex сказал: Вероятно, программа собрана под ненулевым уровнем оптимизации. В оптимизированной программе зависимости между Си и реальным дизасм-выхлопом ломаются от слова совсем. По второму пункту - опять же - если смотрите под отладчиком на оптимизации - то занятие бесполезное. На выходе из функции если результат правильный - значит все ок. В "дебаг конфигкрейшен" не нашел никаких настроек а-ля "оптимизировать". Да и за несколько месяцев отладки, думаю, уже бы заметил подобное поведение отладчика... До этого момента все было как и положенно - линейный сишный код, линейно по нему проходим апд в настройках си билдера оптимизейшен левел - 0. Т.е. выключен Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 83 September 15 Posted September 15 · Report post Только что, GAYVER сказал: Да и за несколько месяцев отладки, думаю, уже бы заметил подобное поведение отладчика... До этого момента все было как и положенно - линейный сишный код, линейно по нему проходим Да для этого файла может быть отдельная опция - с каким уровнем оптимизировать, вот для других и не замечали. Quote Share this post Link to post Share on other sites More sharing options...
GAYVER 2 September 15 Posted September 15 · Report post 5 минут назад, Arlleex сказал: Да для этого файла может быть отдельная опция - с каким уровнем оптимизировать, вот для других и не замечали. а не подскажете тогда - где смотреть эти настройки? апд функция возвращает не совсем то, что я ожидаю. собственно поэтому и полез во внутрянку - смотреть что там происходит Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 83 September 15 Posted September 15 · Report post Ну, тут я только задал направление поисков)) А с эклипса под рукой нет, чтобы точно что-то написать... Quote Share this post Link to post Share on other sites More sharing options...
GAYVER 2 September 15 Posted September 15 · Report post Только что, Arlleex сказал: Ну, тут я только задал направление поисков)) А с эклипса под рукой нет, чтобы точно что-то написать... Не прокатило... Но таки спасибо - сходим в этом направлении 🙂 Quote Share this post Link to post Share on other sites More sharing options...
Raven 5 September 15 Posted September 15 · Report post Если код оптимитзирован, а пошагово пройти все-таки нужно, то нужно переключиться в другое View/отображение кода - в ассемблерное. И будете проходить его без всяких непонятных скачков по коду. Обычно нормальные IDE здесь же показывают куски исходного C кода, соответствующие показанным оттранслированным ассемблерным. Так что все хорошо видно и понятно. Quote Share this post Link to post Share on other sites More sharing options...
GAYVER 2 Monday at 12:57 PM Posted Monday at 12:57 PM · Report post а как быть со 2 пунктом? где связь между счетчиком цикла и в невозможности включить станадарнтую библиотеку в другом конце кода? Quote Share this post Link to post Share on other sites More sharing options...
Raven 5 Monday at 03:58 PM Posted Monday at 03:58 PM · Report post 2 hours ago, GAYVER said: а как быть со 2 пунктом? где связь между счетчиком цикла и в невозможности включить станадарнтую библиотеку в другом конце кода? А вы посмотрели получившийся после оптимизации ассемлерный код этого цикла? Это не помогло прояснить ситуацию? Quote Share this post Link to post Share on other sites More sharing options...
GAYVER 2 Tuesday at 06:05 AM Posted Tuesday at 06:05 AM · Report post 14 часов назад, Raven сказал: А вы посмотрели получившийся после оптимизации ассемлерный код этого цикла? Это не помогло прояснить ситуацию? оптимизация отключена. это раз. как посмотреть разрешения на оптимизацию отдельно взятого файла я так и не нашел. два - компилятор при прогоне кода при любых раскладах должен ругаться на использование не объявленной переменной. этого не будет только в том случае, если цикл вырождается в 1 прогон. т.е. просто в однократное линейное выполнение операторов в теле цикла. но этого не может быть потому, что верхняя граница цикла - параметр, передаваемый в функцию. который является ненулевой константой. по крайней мере на этапе отладки. в дальнейшем будет переменной Quote Share this post Link to post Share on other sites More sharing options...
makc 121 Tuesday at 06:15 AM Posted Tuesday at 06:15 AM · Report post 8 минут назад, GAYVER сказал: как посмотреть разрешения на оптимизацию отдельно взятого файла я так и не нашел Смотрите параметры компилятора при компиляции интересного вам файла. Или есть другой вариант - использовать pragma GCC optimize для выбора нужного вам уровня оптимизации в интересующем вас файле - https://codeforces.com/blog/entry/96344 Quote Share this post Link to post Share on other sites More sharing options...
Strob 0 Wednesday at 06:00 AM Posted Wednesday at 06:00 AM · Report post Иногда нечто подобное начинается если вы читаете или пишете в регистры плис не используя для этого волатильные указатели/переменные. Quote Share this post Link to post Share on other sites More sharing options...