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

 
 
> Распределение переменных в ОЗУ, как заставить 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
Ответов
AndreyS
сообщение Oct 18 2006, 07:37
Сообщение #2


Местный
***

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



Добрый день.

Огромное всем спасибо.

Буду учить мат часть wink.gif Просто подход к изучению Си для 51 был с изучения ANSI Си. Соответственно специфические директивы и объявления приходится изучать по ходу дела.

Бум читать.

Согласен, что в 99% виноват я сам. Но 1% - это удобное представление информации о компиляции проекта (карта памяти как ОЗУ так и ПЗУ).

То DimG:
По поводу бряки на изменение ячейки. Не получится это сделать в ядре (можно только в эмуляшке). Потому как в это момент снижается тактовая частота проца. Вернее, думаю, что частота остается прежней, просто отладчик часто тормозит ядро и перечитывает состояние ячейки и далее запускает его. В общем производительность падает, все тайминги растягиваются и приложение получается не работоспособно. Я обычно ставлю в код везде, где есть частый вызов (приревание например, или глобальный цикл) проверку переменной на изменение и после условия ставлю бряк. Это конечно не дает большой эффективности, приходится долго ждать.

Взглянул на M51 но там все перемешано. Есть ли возможность вывода всех DATA, CODE и XDATA в свои таблицы???


--------------------
Удачи.
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 18 2006, 08:11
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(AndreyS @ Oct 18 2006, 13:37) *
Согласен, что в 99% виноват я сам. Но 1% - это удобное представление информации о компиляции проекта (карта памяти как ОЗУ так и ПЗУ).

Если вам нужно наглядное представление глобальных переменных, то объявите одну глобальную структуру данных, которая будет состоять их мелких под-структур. Тогда точно все глобальные перменные будет лежать в одном месте ОЗУ и последовательно. Структуры удобно создавать с помощью typdef. А обращаться к ним через указатели.
например
Код
typdef struct st_uart
{
....
unsigned char uartBuf[20];
} st_uart;

typdef struct st_adc
{
....
} st_adc;

typdef struct st_var
{
.....
} st_var;

typedef struct st_globalData
{ st_uart uart0;
   st_adc adc0;
   st_val varl;
} st_globalData;


А потом перед main-ом объявляете
Код
st_globalData globalData;
st_globalData *pGD=&globalData;

Чтобы, например, обратиться ко 2-му символу в буфере UART в программе пишете
Код
unsigned char a;
a = pGD->uart0->uartBuf[1];

ну и т.д. и т.п. Может показаться, что писанины много, но зато имеем вполне переносимый на другие МК код.
Go to the top of the page
 
+Quote Post



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

 


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


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