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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> AVR Си., Переменные, область хранения.
Vetal-Soft
сообщение Mar 19 2011, 13:02
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 16-06-05
Пользователь №: 6 074



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

P.S. Такое ощущение что тот кто спрашивает, обязательно, школьник... не хочет читать документацию.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Mar 19 2011, 13:19
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Kirusha @ Mar 19 2011, 08:46) *
Тут по-моему разговор ушёл куда-то не туда. По поводу "заниматься фигнёй" я кажется уже отписался: вполне вероятно, что в небольшом куске программы нужно будет экономить каждый такт....

Проблема в том, что инструкции компилятору по размещению переменных сам компилятор вправе игнорировать.
Так что выбор у Вас небольшой - если уж доверились компилятору ЯВУ, включите максимальную оптимизацию и молитесь! wink.gif
Вряд ли у Вас получится лучше или Ваши костыли помогут компилятору. Скорее помешают.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
KaMa3eR
сообщение Mar 19 2011, 15:09
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-09
Из: Украина Шостка
Пользователь №: 53 609



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

#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]);
помогите голову сломал ниче не могу понять
Go to the top of the page
 
+Quote Post
lisstret
сообщение Mar 20 2011, 03:29
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 10-06-10
Из: Владивосток
Пользователь №: 57 835



А если сделать указатель и занести в него адрес одного из регистров общего назначения, а потом операцией разыменования работать с ним? переменная в регистре ведь, в регистре)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 20 2011, 09:44
Сообщение #20


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 20 2011, 12:00
Сообщение #21


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Dog Pawlowa @ Mar 19 2011, 16:19) *
Проблема в том, что инструкции компилятору по размещению переменных сам компилятор вправе игнорировать.

Тю, блин! А volatile?
Go to the top of the page
 
+Quote Post
nk@
сообщение Mar 20 2011, 19:03
Сообщение #22


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 8-12-09
Пользователь №: 54 138



Можно критичные по времени функции сделать на ассемблере. Тут уж, как говорицца, все в своих руках sm.gif
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Mar 21 2011, 06:15
Сообщение #23


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(KaMa3eR @ Mar 19 2011, 18:09) *
sprintf(&lcd_string[0], "%6u", freq);

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

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

Сообщение отредактировал Genadi Zawidowski - Mar 21 2011, 06:16
Go to the top of the page
 
+Quote Post
KaMa3eR
сообщение Mar 21 2011, 18:05
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-09
Из: Украина Шостка
Пользователь №: 53 609



Цитата(Genadi Zawidowski @ Mar 21 2011, 09:15) *
sprintf(&lcd_string[0], "%6lu", freq);

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

ок попробую
Go to the top of the page
 
+Quote Post
Nikkolaj
сообщение Mar 23 2011, 08:47
Сообщение #25


Частый гость
**

Группа: Участник
Сообщений: 147
Регистрация: 25-09-08
Пользователь №: 40 467



Если выбрана опция Avtomatic Register Allocation, то CV распределяет глобальные переменные в регистры в порядке их обявления.
Просто обявите Вашу переменную первой, и она будет в регистре.
Если опция Avtomatic Register Allocation не выбрана, тогда для размещения переменной в регистре, надо использовать ключевое слово register.
Например: register int a;
Опция находится в настройках проекта, закладка C Compiler.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Mar 23 2011, 13:53
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(_Pasha @ Mar 20 2011, 16:00) *
А volatile?

А это не инструкция по размещению.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 24 2011, 07:04
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(_Артём_ @ Mar 18 2011, 23:08) *
Разве речь шла не о регистрах типа DDRx и п.т?
Почему три штуки?

Нет речь, похоже, шла не о DDR. ))
Возьмите pdf на atmega88, к примеру, и почитайте про регистры GPIOR0 - GPIOR2. Соответственно вопросы про "заниматься фигнёй" одпадут. Есть правда некоторые моменты, что такие регистры есть не во всех контроллерах, поэтому не очень применимо, но тем не менее вещь предусмотренная разработчиком.
Это первое. Второе - вопрос абсолютно не в "вылизывании проги до такта". Эти регистры созданы как регистры флагов (насколько я понимаю), для получения атомарного доступа.
Go to the top of the page
 
+Quote Post
KaMa3eR
сообщение Mar 27 2011, 14:17
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 13-11-09
Из: Украина Шостка
Пользователь №: 53 609



Цитата(Genadi Zawidowski @ Mar 21 2011, 09:15) *
sprintf(&lcd_string[0], "%6lu", freq);

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

попробовал есть смысл , но кроме того нуно визарду CVAVR в закладке project/config/C Compiler/ sprintf выставить размерность вывода вот откуда у меня лезли непонятки
Go to the top of the page
 
+Quote Post
skyled
сообщение Mar 29 2011, 05:46
Сообщение #29


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868



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



Сообщение отредактировал skyled - Mar 29 2011, 05:48
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Mar 29 2011, 10:47
Сообщение #30


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


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


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