Перейти к содержанию
    

Линкер: Расположение переменной

Господа, подскажите: как принудительно заставить IAR for ARM расположить локальную переменную функции в RAM-памяти, а не в регистре?

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

Квалификатор static хорош, но он резервирует память за пределами кучи, поэтому вынужден от него отказаться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Жесть :wacko:

На компилятор грешить - последнее дело, скорее всего ошибка у тебя, можешь код показать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поддерживаю предыдущего оратора: жесть. С вероятностью 99% это ошибка в Вашем коде. Всякие volatile и static могут помочь скрыть ошибку, но она запросто может вылезти в другом месте.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Уж больно это мне напоминает переполнение стека.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну что ж, направление я увидел.

Поищу утечки в памяти, и с ключевыми словами всё ясно.

Спасибо за Ваши ответы. :biggrin:

 

П.С. Модераторы, тему можно закрыть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

П.С. Модераторы, тему можно закрыть.
Закрывать можно будет (вы можете сделать это сами в левом нижнем углу) когда вы найдете и огласите здесь причину. Чтобы кто-то другой, столкнувшись с аналогичной проблемой и воспользовавшись поиском узнал не только что он не одинок, но и одну из возможных причин и метод решения.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ошибка действительно была в коде.

Смутило, что дебагер показывает не всегда верное значение переменной, если она лежит в регистре. Поэтому решение такое:

Для отладки я выставляю локальным переменным функции volatile, что помещает их в оперативную память и теперь может быть верно прочитано дебагером. После отладки я удаляю volatile, и работоспособность функции не изменяется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После отладки я удаляю volatile, и работоспособность функции не изменяется.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Изменено пользователем Кирилл__

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...