|
Линкер: Расположение переменной, как расположить локальную переменную в памяти, а не в регистре? |
|
|
|
Apr 5 2012, 09:24
|
Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202

|
Господа, подскажите: как принудительно заставить IAR for ARM расположить локальную переменную функции в RAM-памяти, а не в регистре? Заранее спасибо.
|
|
|
|
|
Apr 6 2012, 06:16
|
Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202

|
Сергей, Игорь, спасибо за ответ.
Зачем это нужно: порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был.
Квалификатор volatile справляется с задачей, неудобно только, что он вызывает при билде Warning: undefined behavior. Да и само решение показалось мне хитростью. В глубине души я понимал, что есть более официальное решение, поэтому пришел сюда за советом.
Квалификатор static хорош, но он резервирует память за пределами кучи, поэтому вынужден от него отказаться.
|
|
|
|
|
Apr 6 2012, 09:12
|
Участник

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

|
Цитата(Кирилл__ @ Apr 6 2012, 10:16)  Зачем это нужно: порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был. Жесть На компилятор грешить - последнее дело, скорее всего ошибка у тебя, можешь код показать?
|
|
|
|
|
Apr 6 2012, 09:20
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

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

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

|
Цитата(Кирилл__ @ Apr 6 2012, 09:16)  ... порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был. Уж больно это мне напоминает переполнение стека.
|
|
|
|
|
Apr 11 2012, 06:18
|
Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202

|
Ну что ж, направление я увидел. Поищу утечки в памяти, и с ключевыми словами всё ясно. Спасибо за Ваши ответы.  П.С. Модераторы, тему можно закрыть.
|
|
|
|
|
Jun 20 2012, 12:43
|
Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202

|
Ошибка действительно была в коде. Смутило, что дебагер показывает не всегда верное значение переменной, если она лежит в регистре. Поэтому решение такое: Для отладки я выставляю локальным переменным функции volatile, что помещает их в оперативную память и теперь может быть верно прочитано дебагером. После отладки я удаляю volatile, и работоспособность функции не изменяется.
|
|
|
|
|
Jun 22 2012, 06:27
|
Группа: Новичок
Сообщений: 7
Регистрация: 5-04-12
Пользователь №: 71 202

|
Цитата(mdmitry @ Jun 20 2012, 18:33)  И при использовании оптимизирующего компилятора код получаете другой! Оптимизатор может много чего сделать. Итог: отладили одну программу, отдали заказчику другую.  Код-то другой, но отличается лишь позиционированием некоторых локальных переменных. Я верю, что компилятор правильно делает свое дело.
Сообщение отредактировал Кирилл__ - Jun 22 2012, 06:28
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|