реклама на сайте
подробности

 
 
> Доступность переменных в AVRStudio
drvlas
сообщение Sep 15 2010, 06:30
Сообщение #1


Участник
*

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



При работе симулятора в Студии в окне Watch значение некотрых переменных отображается и модифицируется в ручном режиме нормально. Но о некоторых из них отладчик пишет

Not in scope
или
Location not valid

В справочнике про эти сообщения ничего не нашел. Ну, если с первым еще более-менее ясно (ясен смысл, хотя когда именно переменная попадает в видимость - не всегда совпадает с моими представлениями), то вот второе сообщение меня сбивает с толку. Во-первых, на это сообщение, по-моему, попадают чаще всего (но не всегда!) enumerated переменные, элементы структур. Но иногда и обычные (я просто изменял тип переменной из ENUM в CHAR - для пробы).

Можете объяснить толком точный смысл этих сообщений - или послать туда, где объясняют?

И еще. Влияет ли на видимость переменных многофайловость проекта?

Спасибо!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Sep 15 2010, 07:07
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А, собственно, что тут непонятного?

1) Многофайловый проект или нет - не имеет значения.
2) Имеет значение - видима ли переменная в момент отладки.
3) Location not valid - скорее всего - переменная была выкинута оптимизатором.

Особенно это очевидно при работе с локальными переменнами.
Например в какой-то ф-ции есть локальная переменная. Компилятор её разместил в регистре. Так как её вам показать до того пока она внесена в регистр и после освобождения?
Go to the top of the page
 
+Quote Post
drvlas
сообщение Sep 15 2010, 07:34
Сообщение #3


Участник
*

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



Цитата(SasaVitebsk @ Sep 15 2010, 10:07) *
А, собственно, что тут непонятного?


Спасибо за ответ!

Непонятно как раз, что делать-то? И, судя по форуму на ФРИКах, эта непонятка не только у меня. Их достойных ответов упомяну, пожалуй, этот и последний постинг уважаемого шведа от Jul 17, 2010 - 02:01 PM здесь. Для тех, кто не дружит с аглицким, ответ от SasaVitebsk дополню следующим почерпнутым только что знанием:

Что можно сделать?

1) Ждать нового релиза ВинАВР и-или Студии
2) Выключить оптимизацию (но программа получается, вообще говоря, уже далеко не та)
3) Внимательно просматривать в режиме дизассемблера и увидеть, в каких регистрах возникает кратковременно именно то значение, для хранения которого Вы создали переменную (а сука оптимизатор выкинул).

Больше я ничего не понял. Или есть еще трюки?
Go to the top of the page
 
+Quote Post
xelax
сообщение Sep 15 2010, 11:48
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(drvlas @ Sep 15 2010, 11:34) *
1) Ждать нового релиза ВинАВР и-или Студии
2) Выключить оптимизацию (но программа получается, вообще говоря, уже далеко не та)
3) Внимательно просматривать в режиме дизассемблера и увидеть, в каких регистрах возникает кратковременно именно то значение, для хранения которого Вы создали переменную (а сука оптимизатор выкинул).

Больше я ничего не понял. Или есть еще трюки?

4. Как вариант можно для отладки алгоритма к такой переменной добавить static volatile, тогда компилятор её не соптимизирует в регистр.
Go to the top of the page
 
+Quote Post
drvlas
сообщение Sep 15 2010, 15:02
Сообщение #5


Участник
*

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



Цитата(xelax @ Sep 15 2010, 14:48) *
4. Как вариант можно для отладки алгоритма к такой переменной добавить static volatile, тогда компилятор её не соптимизирует в регистр.

Вы знаете, может быть и так. Я попробовал чуть иначе. Объявил переменные, за которыми хочу следить, за границами функции (в данном случае - main()). И оптимизатор их не съел smile.gif Вижу в окошке 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


типа так...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 15 2010, 16:17
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(drvlas @ Sep 15 2010, 18:02) *
Я попробовал чуть иначе. Объявил переменные, за которыми хочу следить, за границами функции (в данном случае - main()). И оптимизатор их не съел smile.gif Вижу в окошке Watch, слава Богу.
....
типа так...

Вы творите одну глупость за другой. В смысле я не хочу вас обидеть. Просто вы пока не понимаете что творите.

1. Перенеся переменные вы по сути написали совершенно новую программу, которая никакого отношения к предыдущей не имела. В результате после возвращения переменных в состояние локальных - можете получить неработоспособную программу (ввиду непонимания выделения памяти под переменные)
2. Чтобы вам яснее было - если компилятор выкинул данную переменную - значит так и надо! И у вас это не должно вызывать никаких эмоций. Он не выкинет то, что необходимо при правильно написанной программе.
3. При отладке - локальные переменные обычно видны. Просто сразу указано расположение - регистр или 2 регистра. Для AVR регистры можно посмотреть и непосредственно в окне регистров. Проблем, обычно не возникает.
4. Я обычно отлаживаю непосредственно по оптимизированному коду. Иногда возникают неудобства связанные с груповой оптимизацией - то есть когда сразу ч/з несколько операторов перескакивает, но обычно это тоже не вызывает неприятностей. Всётаки отлаживать надо на более высоком уровне, чем оператор. Обычно я только детали контролирую, а программу лучше внимательно просмотреть. Если видите, что какие-то проблемы.
5. Иногда (крайне редко) возникает потребность просмотреть что-то что соптимизировал компилятор. Честно говоря, в 95% случаев у меня это просмотреть правильность занесения константных выражений, при сложных взаимозависимостях. Либо какие то адресные операции. Конечно, это можно сделать и по листингу, включив соответствующие опции, но ... лень, как обычно. smile.gif Проще вырубить оптимизацию - посмотреть и опять врубить. Иногда требуется более внимательно просмотреть исполнение того либо другого куска кода, который был серьёзно соптимизирован - тогда я вызываю ассемблер - и вперёд на танки.
Это всё - крайние случаи. Если они возникают у вас часто, то что-то не так в датском королевстве. smile.gif

Писать и отлаживать всё таки надо именно в Си. Дополнительным аргументом для этого станет такой момент: при переходе на ARM там отладка по ассемблеру вообще очень тяжела. Даже с константами и то беда. Переходы и прочее... Есть моменты, которые вобще отладчиком не посмотришь (из за конвеера). И как быть тогда?

Надо поднимать уровень отладки выше. А писать более вдумчиво.
Go to the top of the page
 
+Quote Post
drvlas
сообщение Sep 20 2010, 13:44
Сообщение #7


Участник
*

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



Цитата(SasaVitebsk @ Sep 15 2010, 19:17) *
Просто вы пока не понимаете что творите.

Просто Вы пока не понимаете, что я понимаю, а чего не понимаю smile.gif

Посмотрим вместе.
Цитата(SasaVitebsk @ Sep 15 2010, 19:17) *
1. Перенеся переменные вы по сути написали совершенно новую программу, которая никакого отношения к предыдущей не имела. В результате после возвращения переменных в состояние локальных - можете получить неработоспособную программу (ввиду непонимания выделения памяти под переменные)

ну почему же так категорично? Да, могут быть случаи, что ошибка проявится именно в том варианте программы, который я не вижу в отладчике, ибо перенес переменные в глобальные. Может. Но далеко не всегда. И "совершенно новой" моя программа не стала. Я просто смог в симуляторе отследить поведение проги в том switch, который управляется перенесенной переменной PrPhase. Иначе говоря, мне нужно гарантированно добраться до того или иного case, вот я и захотел видеть управляющую переменную. А предметом отладки были, например, численные значения арифметических выражений или еще какая-то фигня. И, Вы знаете, очень даже удобно оказалось видеть PrPhase.

Иными словами, меня совсем не возмущает то, что
Цитата(SasaVitebsk @ Sep 15 2010, 19:17) *
если компилятор выкинул данную переменную - значит так и надо!

Я просто хочу в нужном мне случае этим процессом управлять. Вот, нашел. И очень доволен.

Ведь и Вы это делаете. Вы пишете
Цитата(SasaVitebsk @ Sep 15 2010, 19:17) *
Иногда возникает потребность просмотреть что-то что соптимизировал компилятор. ... Проще вырубить оптимизацию - посмотреть и опять врубить.

Вот видите, Вам можно, а другим нельзя? wink.gif

Цитата(SasaVitebsk @ Sep 15 2010, 19:17) *
Писать и отлаживать всё таки надо именно в Си.

Я, кстати, пишу и отлаживаю именно на Си, хотя, ИМХО, здесь нечем гордиться. Просто мне это удобно, а товарищам, которые пишут на АСМе, я ничего не советую, они же взрослые пацаны. Я это к чему - когда я обращаюсь по конкретному вопросу, то и ответы хочу видеть конкретные, а не общие рекомендации по выбору языка программирования. Без обид, дружище!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 12:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01482 секунд с 7
ELECTRONIX ©2004-2016