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

 
 
 
Reply to this topicStart new topic
> Доступность переменных в 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
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
XVR
сообщение Sep 15 2010, 08:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Или есть еще трюки?
Отладка оптимизированного кода - это вообще один большой трюк sad.gif Так что п2 (Выключить оптимизацию) это то, что надо сделать в первую очередь, если хотите отлаживаться.
Отладка с включенной оптимизацией имеет смысл только тогда, когда программа в отладочном режиме работает, а в релизе - нет (да и то сразу бросаться ее отлаживать в дебагере не стоит - сначала стоит посмотреть что вы могли написать неправильно. В 90% случаев это будет опущенный volatile или не инициализированные переменные)
Go to the top of the page
 
+Quote Post
xelax
сообщение Sep 15 2010, 11:48
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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
xelax
сообщение Sep 16 2010, 06:54
Сообщение #8


Местный
***

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



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

1. Перенеся переменные вы по сути написали совершенно новую программу, которая никакого отношения к предыдущей не имела. В результате после возвращения переменных в состояние локальных - можете получить неработоспособную программу (ввиду непонимания выделения памяти под переменные)


Как то очень прямолинейно мыслите. На самом деле такой подход очень даже имеет место, надо только уметь получать из ситуации максимум пользы.
Можно понять в алгоритме ли ошибка, если да, то этого и достаточно обычно бывает, для того чтобы пофиксить багу, а если это езда по памяти или что-то подобное, то поведение меняется и тогда возвращаемся обратно и исследуем первоначальный вариант.

Цитата(SasaVitebsk @ Sep 15 2010, 20:17) *
3. При отладке - локальные переменные обычно видны. Просто сразу указано расположение - регистр или 2 регистра. Для AVR регистры можно посмотреть и непосредственно в окне регистров. Проблем, обычно не возникает.


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

Цитата(SasaVitebsk @ Sep 15 2010, 20:17) *
А писать более вдумчиво.

улыбнуло... biggrin.gif
Go to the top of the page
 
+Quote Post
sitafern
сообщение Sep 20 2010, 11:24
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 25
Регистрация: 8-08-05
Пользователь №: 7 466



Сталкивался с похожей ситуацией. Страдает не только студио, но и иар. Случайно такое вот решение:
Было
for(;;)
{
// Тут собственно вся программа внутренние переменные не видны
}

Сделал:
while(1)
{
// А тут всё видно и работает
}

P.S. Логичного объяснения не нашёл. Но всё больше на ассемблере теперь работаю.
Go to the top of the page
 
+Quote Post
drvlas
сообщение Sep 20 2010, 13:44
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 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
_Pasha
сообщение Sep 20 2010, 16:00
Сообщение #11


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



А что отлаживаем? Копаемся сразу во всех уровнях и в телах всех функций? В чем тогда великий смысл программирования?
Не понимаю людей, которые советуют выключить оптимизацию.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:31
Рейтинг@Mail.ru


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