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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Линкер: Расположение переменной, как расположить локальную переменную в памяти, а не в регистре?
Кирилл__
сообщение Apr 5 2012, 09:24
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202



Господа, подскажите: как принудительно заставить IAR for ARM расположить локальную переменную функции в RAM-памяти, а не в регистре?
Заранее спасибо.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 5 2012, 10:02
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Специальных средств для делания быстрой программы медленной не предусмотрено. Попробуйте дать этой переменной квалификатор volatile. И отвечает за это компилятор, линкер тут не при чем.

P.S. Но нафига?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 5 2012, 16:46
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Квалификатор static не спасёт?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 5 2012, 19:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Уточняющий вопрос: зачем???
Go to the top of the page
 
+Quote Post
Кирилл__
сообщение Apr 6 2012, 06:16
Сообщение #5





Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202



Сергей, Игорь, спасибо за ответ.

Зачем это нужно: порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был.

Квалификатор volatile справляется с задачей, неудобно только, что он вызывает при билде Warning: undefined behavior. Да и само решение показалось мне хитростью. В глубине души я понимал, что есть более официальное решение, поэтому пришел сюда за советом.

Квалификатор static хорош, но он резервирует память за пределами кучи, поэтому вынужден от него отказаться.
Go to the top of the page
 
+Quote Post
shmur
сообщение Apr 6 2012, 09:12
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553



Цитата(Кирилл__ @ Apr 6 2012, 10:16) *
Зачем это нужно: порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был.


Жесть wacko.gif
На компилятор грешить - последнее дело, скорее всего ошибка у тебя, можешь код показать?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 6 2012, 09:20
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Кирилл__ @ Apr 6 2012, 10:16) *
Зачем это нужно: порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был.

Поддерживаю предыдущего оратора: жесть. С вероятностью 99% это ошибка в Вашем коде. Всякие volatile и static могут помочь скрыть ошибку, но она запросто может вылезти в другом месте.
Я бы попросил показать код, но после упоминания большого числа локальных переменных мне кажется, что разбираться в этом коде будет непросто.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 6 2012, 14:01
Сообщение #8


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Кирилл__ @ Apr 6 2012, 09:16) *
... порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был.

Уж больно это мне напоминает переполнение стека.
Go to the top of the page
 
+Quote Post
Marto
сообщение Apr 10 2012, 21:15
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 103
Регистрация: 17-05-09
Из: Ижевск
Пользователь №: 49 190



Хм.


--------------------
Шизоидный холерик
Go to the top of the page
 
+Quote Post
Кирилл__
сообщение Apr 11 2012, 06:18
Сообщение #10





Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202



Ну что ж, направление я увидел.
Поищу утечки в памяти, и с ключевыми словами всё ясно.
Спасибо за Ваши ответы. biggrin.gif

П.С. Модераторы, тему можно закрыть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 11 2012, 07:38
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Кирилл__ @ Apr 11 2012, 09:18) *
П.С. Модераторы, тему можно закрыть.
Закрывать можно будет (вы можете сделать это сами в левом нижнем углу) когда вы найдете и огласите здесь причину. Чтобы кто-то другой, столкнувшись с аналогичной проблемой и воспользовавшись поиском узнал не только что он не одинок, но и одну из возможных причин и метод решения.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Кирилл__
сообщение Jun 20 2012, 12:43
Сообщение #12





Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202



Ошибка действительно была в коде.
Смутило, что дебагер показывает не всегда верное значение переменной, если она лежит в регистре. Поэтому решение такое:
Для отладки я выставляю локальным переменным функции volatile, что помещает их в оперативную память и теперь может быть верно прочитано дебагером. После отладки я удаляю volatile, и работоспособность функции не изменяется.
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jun 20 2012, 14:33
Сообщение #13


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(Кирилл__ @ Jun 20 2012, 16:43) *
После отладки я удаляю volatile, и работоспособность функции не изменяется.

И при использовании оптимизирующего компилятора код получаете другой! Оптимизатор может много чего сделать. Итог: отладили одну программу, отдали заказчику другую. laughing.gif


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
Кирилл__
сообщение Jun 22 2012, 06:27
Сообщение #14





Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202



Цитата(mdmitry @ Jun 20 2012, 18:33) *
И при использовании оптимизирующего компилятора код получаете другой! Оптимизатор может много чего сделать. Итог: отладили одну программу, отдали заказчику другую. laughing.gif

Код-то другой, но отличается лишь позиционированием некоторых локальных переменных. Я верю, что компилятор правильно делает свое дело. wink.gif

Сообщение отредактировал Кирилл__ - Jun 22 2012, 06:28
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 22 2012, 07:24
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(mdmitry @ Jun 20 2012, 18:33) *
И при использовании оптимизирующего компилятора код получаете другой! Оптимизатор может много чего сделать. Итог: отладили одну программу, отдали заказчику другую. laughing.gif

Справедливо, конечно: этот подход не выявляет все баги. Но он помогает выявить баги, не зависящие от уровня оптимизации, а это уже очень хорошо.
Go to the top of the page
 
+Quote Post

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

 


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


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