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

 
 
> Распределение переменных в ОЗУ, как заставить Keil раскидать данные правильно??
AndreyS
сообщение Oct 17 2006, 10:30
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 235
Регистрация: 28-01-05
Из: Санкт-Петербург
Пользователь №: 2 276



Добрый день всем.


Возник вопрос.

Какие настройки заставляют Keil раскидывать данные линейно, последовательно для ВСЕГО проекта?

Поясню.

Имею проект с 5 файлами. В каждом из файлов определил переменные доступные только для этого файла. При работе программы наблюдаю как одна (пока одна может и больше) переменная меняется не помоим законам. Что-то туда еще перекидывает данные. Закомментил все процедуры связанные с изменением этой переменной и все равно переменная дергается.

Как заставить Кеил построить для меня всю карту памяти для всего проекта? Что, куда она положила по каким адресам? Хочу найти перекрестные ссылки.

И еще как в настройках компилятора (не в коде) задать SP??? Хочется чтобы SP устанавливался один раз, а не дважды.


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DimG
сообщение Oct 18 2006, 03:24
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 70
Регистрация: 4-04-06
Из: г. Омск
Пользователь №: 15 777



Цитата
Как заставить Кеил построить для меня всю карту памяти для всего проекта? Что, куда она положила по каким адресам? Хочу найти перекрестные ссылки.

Полная карта памяти находится в файле с расширением .М51. Но я бы посоветовал вам другой способ. Установите прерывание по записи в данную ячейку памяти. Debug->Breakpoints, в поле Expression введите что-то типа d:0x73 и установите галочку в Write (думаю вы это знаете, но на всякий случай). После этого при каждой записи в эту ячейку вы увидите место в программе где она изменяется.
Цитата
Эти глюки у меня проявляются в порче локальных переменных в функции при вызове других фуекций, т.к. компилятор почему-то выделяет для временных операций адреса тех-же переменных...

Имеется ввиду при вызове из одной функции другой функции? Потому что в любом другом случае компилятор имеет полное право использовать те же ячейки памяти для другой функции, не сохраняя их в стек. На то они и локальные.
Со своей стороны могу посоветовать следующее. Если вы не хотите объявлять переменную в качестве глобальной, то объявите ее через static. При этом компилятор если и будет использовать эту ячейку памяти, то при этом обязательно сохронит ее в стек. Только не совмещайте объявление переменной и ее инициализацию, т.к. переменные static инициализируются один раз.
Цитата
Какие настройки заставляют Keil раскидывать данные линейно, последовательно для ВСЕГО проекта?

Посмотрите в С51.pdf подраздел Linker Locaition Controls.

Еще есть вероятность что ошибки с переменными связаны с использованием их в подпрограммах прерывания. Поскольку прерывание может возникнуть в любой момент, то компилятор не может гарантированно отследить правильность использования переменных. На этот случай при объявлении существует дополнительная директива, но сейчас я не помню какая, так что гляньте сами.

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

YAM, а нельзя прислать кусок программы с глюком, или целиком? Хотелось бы покопаться с этой проблемой.
Go to the top of the page
 
+Quote Post



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

 


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


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