kirill_ 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Господа, подскажите: как принудительно заставить IAR for ARM расположить локальную переменную функции в RAM-памяти, а не в регистре? Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Специальных средств для делания быстрой программы медленной не предусмотрено. Попробуйте дать этой переменной квалификатор volatile. И отвечает за это компилятор, линкер тут не при чем. P.S. Но нафига? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Квалификатор static не спасёт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 5 апреля, 2012 Опубликовано 5 апреля, 2012 · Жалоба Уточняющий вопрос: зачем??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kirill_ 0 6 апреля, 2012 Опубликовано 6 апреля, 2012 · Жалоба Сергей, Игорь, спасибо за ответ. Зачем это нужно: порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был. Квалификатор volatile справляется с задачей, неудобно только, что он вызывает при билде Warning: undefined behavior. Да и само решение показалось мне хитростью. В глубине души я понимал, что есть более официальное решение, поэтому пришел сюда за советом. Квалификатор static хорош, но он резервирует память за пределами кучи, поэтому вынужден от него отказаться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shmur 0 6 апреля, 2012 Опубликовано 6 апреля, 2012 · Жалоба Зачем это нужно: порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был. Жесть На компилятор грешить - последнее дело, скорее всего ошибка у тебя, можешь код показать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 6 апреля, 2012 Опубликовано 6 апреля, 2012 · Жалоба Зачем это нужно: порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был. Поддерживаю предыдущего оратора: жесть. С вероятностью 99% это ошибка в Вашем коде. Всякие volatile и static могут помочь скрыть ошибку, но она запросто может вылезти в другом месте. Я бы попросил показать код, но после упоминания большого числа локальных переменных мне кажется, что разбираться в этом коде будет непросто. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 6 апреля, 2012 Опубликовано 6 апреля, 2012 · Жалоба ... порой, когда в моей функции много локальных переменных, и присутствуют вызовы других функций, компилятор забывает, что в регистре, скажем, Р0, у меня расположена переменная Х, и помещает туда другие данные. В результате при чтении переменной Х я получаю совсем не то значение, которое должен был. Уж больно это мне напоминает переполнение стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Marto 0 10 апреля, 2012 Опубликовано 10 апреля, 2012 · Жалоба Хм. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kirill_ 0 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба Ну что ж, направление я увидел. Поищу утечки в памяти, и с ключевыми словами всё ясно. Спасибо за Ваши ответы. П.С. Модераторы, тему можно закрыть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 11 апреля, 2012 Опубликовано 11 апреля, 2012 · Жалоба П.С. Модераторы, тему можно закрыть.Закрывать можно будет (вы можете сделать это сами в левом нижнем углу) когда вы найдете и огласите здесь причину. Чтобы кто-то другой, столкнувшись с аналогичной проблемой и воспользовавшись поиском узнал не только что он не одинок, но и одну из возможных причин и метод решения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kirill_ 0 20 июня, 2012 Опубликовано 20 июня, 2012 · Жалоба Ошибка действительно была в коде. Смутило, что дебагер показывает не всегда верное значение переменной, если она лежит в регистре. Поэтому решение такое: Для отладки я выставляю локальным переменным функции volatile, что помещает их в оперативную память и теперь может быть верно прочитано дебагером. После отладки я удаляю volatile, и работоспособность функции не изменяется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 20 июня, 2012 Опубликовано 20 июня, 2012 · Жалоба После отладки я удаляю volatile, и работоспособность функции не изменяется. И при использовании оптимизирующего компилятора код получаете другой! Оптимизатор может много чего сделать. Итог: отладили одну программу, отдали заказчику другую. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kirill_ 0 22 июня, 2012 Опубликовано 22 июня, 2012 (изменено) · Жалоба И при использовании оптимизирующего компилятора код получаете другой! Оптимизатор может много чего сделать. Итог: отладили одну программу, отдали заказчику другую. :laughing: Код-то другой, но отличается лишь позиционированием некоторых локальных переменных. Я верю, что компилятор правильно делает свое дело. ;) Изменено 22 июня, 2012 пользователем Кирилл__ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 22 июня, 2012 Опубликовано 22 июня, 2012 · Жалоба И при использовании оптимизирующего компилятора код получаете другой! Оптимизатор может много чего сделать. Итог: отладили одну программу, отдали заказчику другую. :laughing: Справедливо, конечно: этот подход не выявляет все баги. Но он помогает выявить баги, не зависящие от уровня оптимизации, а это уже очень хорошо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться