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

Если CodeVision, то надо прочитать "Allocation of Variables to Registers".

 

P.S. Такое ощущение что тот кто спрашивает, обязательно, школьник... не хочет читать документацию.

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


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

Тут по-моему разговор ушёл куда-то не туда. По поводу "заниматься фигнёй" я кажется уже отписался: вполне вероятно, что в небольшом куске программы нужно будет экономить каждый такт....

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

Так что выбор у Вас небольшой - если уж доверились компилятору ЯВУ, включите максимальную оптимизацию и молитесь! ;)

Вряд ли у Вас получится лучше или Ваши костыли помогут компилятору. Скорее помешают.

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


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

госпада есть трудно выловимый :laughing: для меня трабл при написании генератора сигналов, с исходника одого из форумчан, нашел глюк и не могу выличить

далее по тексту объявление переменных

 

#define FREQ_MAX 65536

 

unsigned long int accumulator, add_value, temp=0, freq, freq_last=6553; //32 bit variables

unsigned char waveform[256];

unsigned char lcd_string[32];

unsigned char mode;

обратите внимание freq_last=6553 тоесть добавив цыфру более 5 мы превысим значение unsigned char и FREQ_MAX размерность позволяет еще не раз добавить младший разряд , но после

case 0x05:

freq = (freq * 10) + 5; значение freq равно 0 и далее на лсд выводить 0

lcd_gotoxy(8,1);

sprintf(&lcd_string[0], "%6u", freq);

lcd_puts(&lcd_string[0]);

помогите голову сломал ниче не могу понять

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


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

А если сделать указатель и занести в него адрес одного из регистров общего назначения, а потом операцией разыменования работать с ним? переменная в регистре ведь, в регистре)

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


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

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

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


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

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

Тю, блин! А volatile?

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


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

Можно критичные по времени функции сделать на ассемблере. Тут уж, как говорицца, все в своих руках :)

 

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


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

sprintf(&lcd_string[0], "%6u", freq);

sprintf(&lcd_string[0], "%6lu", freq);

 

букву эл добавить в форматную строку.

Изменено пользователем Genadi Zawidowski

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


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

sprintf(&lcd_string[0], "%6lu", freq);

 

букву эл добавить в форматную строку.

ок попробую

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


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

Если выбрана опция Avtomatic Register Allocation, то CV распределяет глобальные переменные в регистры в порядке их обявления.

Просто обявите Вашу переменную первой, и она будет в регистре.

Если опция Avtomatic Register Allocation не выбрана, тогда для размещения переменной в регистре, надо использовать ключевое слово register.

Например: register int a;

Опция находится в настройках проекта, закладка C Compiler.

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


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

Разве речь шла не о регистрах типа DDRx и п.т?

Почему три штуки?

Нет речь, похоже, шла не о DDR. ))

Возьмите pdf на atmega88, к примеру, и почитайте про регистры GPIOR0 - GPIOR2. Соответственно вопросы про "заниматься фигнёй" одпадут. Есть правда некоторые моменты, что такие регистры есть не во всех контроллерах, поэтому не очень применимо, но тем не менее вещь предусмотренная разработчиком.

Это первое. Второе - вопрос абсолютно не в "вылизывании проги до такта". Эти регистры созданы как регистры флагов (насколько я понимаю), для получения атомарного доступа.

 

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


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

sprintf(&lcd_string[0], "%6lu", freq);

 

букву эл добавить в форматную строку.

попробовал есть смысл , но кроме того нуно визарду CVAVR в закладке project/config/C Compiler/ sprintf выставить размерность вывода вот откуда у меня лезли непонятки

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


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

при объявлении переменной используйте слово "register".

register int abc;

 

Изменено пользователем skyled

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


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

Это ничего не даст.

слова register и auto, можно сказать, анахронизмы языка Си.

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


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

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

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

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

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

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

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

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

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

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