|
|
 |
Ответов
|
Sep 15 2010, 07:34
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 3-09-10
Пользователь №: 59 263

|
Цитата(SasaVitebsk @ Sep 15 2010, 10:07)  А, собственно, что тут непонятного? Спасибо за ответ! Непонятно как раз, что делать-то? И, судя по форуму на ФРИКах, эта непонятка не только у меня. Их достойных ответов упомяну, пожалуй, этот и последний постинг уважаемого шведа от Jul 17, 2010 - 02:01 PM здесь. Для тех, кто не дружит с аглицким, ответ от SasaVitebsk дополню следующим почерпнутым только что знанием: Что можно сделать? 1) Ждать нового релиза ВинАВР и-или Студии 2) Выключить оптимизацию (но программа получается, вообще говоря, уже далеко не та) 3) Внимательно просматривать в режиме дизассемблера и увидеть, в каких регистрах возникает кратковременно именно то значение, для хранения которого Вы создали переменную (а сука оптимизатор выкинул). Больше я ничего не понял. Или есть еще трюки?
|
|
|
|
|
Sep 15 2010, 15:02
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 3-09-10
Пользователь №: 59 263

|
Цитата(xelax @ Sep 15 2010, 14:48)  4. Как вариант можно для отладки алгоритма к такой переменной добавить static volatile, тогда компилятор её не соптимизирует в регистр. Вы знаете, может быть и так. Я попробовал чуть иначе. Объявил переменные, за которыми хочу следить, за границами функции (в данном случае - main()). И оптимизатор их не съел  Вижу в окошке Watch, слава Богу. Единственное, что сама Студия не позволила мне сделать для полного ЩАСТЯ, это сохранить ENUM переменные. Т.е., вынес за фунцию - появились в Watch окне (точнее, окно перестало ругаться). И даже пишет мне в качестве значений именно те символьные имена, которые я заложил в перечисление ENUM. Но! Не принимает Студия такие переменные в качестве точек остановки по данным. Пишет, что для использования обращения к данной переменной в качестве условия бряка необходимо, чтобы пременная была целой или флоат. Увы! Но это уже терпимо. Я даже поставил условную компиляцию так, что для эмуляции переменные глобальны и char, а для железки - локальные и enum. Хотя здесь уже просто можно было бы вместо enum поставить несколько дефайнов: Было: Код #ifdef DEBUG_FAST_SYM char PrPhase = IDLE; #endif
int main( void) { ... #ifndef DEBUG_FAST_SYM x2 PrPhase = IDLE; #endif Можно: Код #define IDLE 0 #define TOSO_PARN 1 #define TOSO_VALUE 2 ...
#ifdef DEBUG_FAST_SYM char PrPhase = IDLE; #endif
int main( void) { ... #ifndef DEBUG_FAST_SYM char PrPhase = IDLE; #endif типа так...
|
|
|
|
|
Sep 15 2010, 16:17
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(drvlas @ Sep 15 2010, 18:02)  Я попробовал чуть иначе. Объявил переменные, за которыми хочу следить, за границами функции (в данном случае - main()). И оптимизатор их не съел  Вижу в окошке Watch, слава Богу. .... типа так... Вы творите одну глупость за другой. В смысле я не хочу вас обидеть. Просто вы пока не понимаете что творите. 1. Перенеся переменные вы по сути написали совершенно новую программу, которая никакого отношения к предыдущей не имела. В результате после возвращения переменных в состояние локальных - можете получить неработоспособную программу (ввиду непонимания выделения памяти под переменные) 2. Чтобы вам яснее было - если компилятор выкинул данную переменную - значит так и надо! И у вас это не должно вызывать никаких эмоций. Он не выкинет то, что необходимо при правильно написанной программе. 3. При отладке - локальные переменные обычно видны. Просто сразу указано расположение - регистр или 2 регистра. Для AVR регистры можно посмотреть и непосредственно в окне регистров. Проблем, обычно не возникает. 4. Я обычно отлаживаю непосредственно по оптимизированному коду. Иногда возникают неудобства связанные с груповой оптимизацией - то есть когда сразу ч/з несколько операторов перескакивает, но обычно это тоже не вызывает неприятностей. Всётаки отлаживать надо на более высоком уровне, чем оператор. Обычно я только детали контролирую, а программу лучше внимательно просмотреть. Если видите, что какие-то проблемы. 5. Иногда (крайне редко) возникает потребность просмотреть что-то что соптимизировал компилятор. Честно говоря, в 95% случаев у меня это просмотреть правильность занесения константных выражений, при сложных взаимозависимостях. Либо какие то адресные операции. Конечно, это можно сделать и по листингу, включив соответствующие опции, но ... лень, как обычно.  Проще вырубить оптимизацию - посмотреть и опять врубить. Иногда требуется более внимательно просмотреть исполнение того либо другого куска кода, который был серьёзно соптимизирован - тогда я вызываю ассемблер - и вперёд на танки. Это всё - крайние случаи. Если они возникают у вас часто, то что-то не так в датском королевстве.  Писать и отлаживать всё таки надо именно в Си. Дополнительным аргументом для этого станет такой момент: при переходе на ARM там отладка по ассемблеру вообще очень тяжела. Даже с константами и то беда. Переходы и прочее... Есть моменты, которые вобще отладчиком не посмотришь (из за конвеера). И как быть тогда? Надо поднимать уровень отладки выше. А писать более вдумчиво.
|
|
|
|
|
Sep 20 2010, 13:44
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 3-09-10
Пользователь №: 59 263

|
Цитата(SasaVitebsk @ Sep 15 2010, 19:17)  Просто вы пока не понимаете что творите. Просто Вы пока не понимаете, что я понимаю, а чего не понимаю  Посмотрим вместе. Цитата(SasaVitebsk @ Sep 15 2010, 19:17)  1. Перенеся переменные вы по сути написали совершенно новую программу, которая никакого отношения к предыдущей не имела. В результате после возвращения переменных в состояние локальных - можете получить неработоспособную программу (ввиду непонимания выделения памяти под переменные) ну почему же так категорично? Да, могут быть случаи, что ошибка проявится именно в том варианте программы, который я не вижу в отладчике, ибо перенес переменные в глобальные. Может. Но далеко не всегда. И "совершенно новой" моя программа не стала. Я просто смог в симуляторе отследить поведение проги в том switch, который управляется перенесенной переменной PrPhase. Иначе говоря, мне нужно гарантированно добраться до того или иного case, вот я и захотел видеть управляющую переменную. А предметом отладки были, например, численные значения арифметических выражений или еще какая-то фигня. И, Вы знаете, очень даже удобно оказалось видеть PrPhase. Иными словами, меня совсем не возмущает то, что Цитата(SasaVitebsk @ Sep 15 2010, 19:17)  если компилятор выкинул данную переменную - значит так и надо! Я просто хочу в нужном мне случае этим процессом управлять. Вот, нашел. И очень доволен. Ведь и Вы это делаете. Вы пишете Цитата(SasaVitebsk @ Sep 15 2010, 19:17)  Иногда возникает потребность просмотреть что-то что соптимизировал компилятор. ... Проще вырубить оптимизацию - посмотреть и опять врубить. Вот видите, Вам можно, а другим нельзя?  Цитата(SasaVitebsk @ Sep 15 2010, 19:17)  Писать и отлаживать всё таки надо именно в Си. Я, кстати, пишу и отлаживаю именно на Си, хотя, ИМХО, здесь нечем гордиться. Просто мне это удобно, а товарищам, которые пишут на АСМе, я ничего не советую, они же взрослые пацаны. Я это к чему - когда я обращаюсь по конкретному вопросу, то и ответы хочу видеть конкретные, а не общие рекомендации по выбору языка программирования. Без обид, дружище!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|