Полная версия этой страницы:
AVR Си.
Kirusha
Mar 18 2011, 12:28
Кто-нибудь знает, как с Си для AVR переменную расположить в области регистров общего назначения?
VladislavS
Mar 18 2011, 14:12
В общем случае с помощью прочтения документации от компилятора.
Для помощи конкретно в вашем случае надо бы указать компилятор.
demiurg_spb
Mar 18 2011, 14:13
Для локальных переменных в теле функции зачастую это само происходит.
Для глобальных - песня отдельная и всё зависит от компилятора.
Какой компилятор?
Если честно то заниматься такой "фигнёй" не стоит вовсе...
_Артём_
Mar 18 2011, 14:19
Цитата(Kirusha @ Mar 18 2011, 14:28)

Кто-нибудь знает, как с Си для AVR переменную расположить в области регистров общего назначения?
__regvar __no_init int counter @ 14;
demiurg_spb +1
Да, для локальных переменных в функции, если они объявлены не как volatile, как правило, компилятор (во всяком случае WinAvr) использует регистры.
MrYuran
Mar 18 2011, 14:52
Имеет смысл, если использовать не РОНы, а неиспользуемые периферийные регистры в качестве СОЗУ
Kirusha
Mar 18 2011, 14:57
Компилятор CodeVision. А нужно это для увеличения быстродействия. Там так получается что на счету каждый такт. Чтобы переписать информацию из ОЗУ в регистр ввода/вывода нужно затратить больше тактов, чем если работать с РОНами.
Цитата(MrYuran @ Mar 18 2011, 17:52)

Имеет смысл, если использовать не РОНы, а неиспользуемые периферийные регистры в качестве СОЗУ
А можно поподробней?
_Pasha
Mar 18 2011, 15:26
Цитата(Kirusha @ Mar 18 2011, 18:57)

А можно поподробней?
А Вы в курсе архитектуры AVRовской, что задаете такие вопросы?
Kirusha
Mar 18 2011, 17:10
В курсе, но я не совсем понимаю, зачем использовать регистры настроек всяких UARTов, Таймеров и т.п. для хранения информации, если есть куча РОнов. Или я что-то неправильно понимаю?
_Pasha
Mar 18 2011, 18:45
Цитата(Kirusha @ Mar 18 2011, 20:10)

В курсе, но я не совсем понимаю, зачем использовать регистры настроек всяких UARTов, Таймеров и т.п. для хранения информации, если есть куча РОнов. Или я что-то неправильно понимаю?
Периферийные регистры - штука не во всех присутствующая, и максимум их аж 3 штуки. MrYuran видимо привел пример из другой архитектуры.
А в кодевижне почитайте хелп.
_Артём_
Mar 18 2011, 19:08
Цитата(_Pasha @ Mar 18 2011, 20:45)

Периферийные регистры - штука не во всех присутствующая, и максимум их аж 3 штуки. MrYuran видимо привел пример из другой архитектуры.
Разве речь шла не о регистрах типа DDRx и п.т?
Почему три штуки?
нечитатель
Mar 18 2011, 23:16
add, and, clr, com, inc, lsl... (0..31)
andi, cpi, ldi... (16..31)
in, out, cbi, sbi... (таких в неиспользуемой периферии найдётся несколько, но что конкретно выигрывается в сравнении с нормальным ОЗУ?)
lds, sts... (которое вот это оно и есть)
... тут про что пишут?
DDR, в принципе, тоже вариант... когда остальная периферия уже кончилась... с целью замутить чёрный ящик, который наружу абсолютно ничего не делает, зато внутри себя не дал пропасть ни одному байту рамы бесплатно, любого вида, какого там оказалась она.
Про "заниматься фигнёй", кажется, уже было.
Kirusha
Mar 19 2011, 05:46
Тут по-моему разговор ушёл куда-то не туда. По поводу "заниматься фигнёй" я кажется уже отписался: вполне вероятно, что в небольшом куске программы нужно будет экономить каждый такт. Да и вообще, я часто замечаю по переписке на форуме, что обязательно на чей-то вопрос обязательно несколько раз напишут, что он не тем занимается. Такое ощущение что тот кто спрашивает, обязательно, школьник... А вот тот, кто отвечает, тот обязательно гуру, и вообще у него дома стоит установка покруче коллайдра))) Естественно, это замечание не относится ко всем без исключения пользователям форума.
P.S.Вчера времени не было, думал здесь кто-нибудь навскидку ответит, но оказалось что ошибался. Сам разберусь... единственная мысль, которая понравилась, так это мысль про хелп)
MrYuran
Mar 19 2011, 07:29
Цитата(Kirusha @ Mar 19 2011, 08:46)

Тут по-моему разговор ушёл куда-то не туда. По поводу "заниматься фигнёй" я кажется уже отписался: вполне вероятно, что в небольшом куске программы нужно будет экономить каждый такт.
Насчёт локальных переменных - можно и в РОНах. Хотя возможно, что компилятор сам сообразит их там разместить.
Про периферийные регистры речь шла, чтобы разместить там быстрые статические переменные.
Обращение к ним быстрее, чем к памяти, а в общих регистрах их хранить скорее всего неправильно
-SANYCH-
Mar 19 2011, 10:34
Цитата
Компилятор CodeVision. А нужно это для увеличения быстродействия. Там так получается что на счету каждый такт. Чтобы переписать информацию из ОЗУ в регистр ввода/вывода нужно затратить больше тактов, чем
На мой взгляд если нужно экономить каждый такт то такую программу нужно писать на ассемблере а не на Си.
Vetal-Soft
Mar 19 2011, 13:02
Если CodeVision, то надо прочитать "Allocation of Variables to Registers".
P.S. Такое ощущение что тот кто спрашивает, обязательно, школьник... не хочет читать документацию.
Dog Pawlowa
Mar 19 2011, 13:19
Цитата(Kirusha @ Mar 19 2011, 08:46)

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

Вряд ли у Вас получится лучше или Ваши костыли помогут компилятору. Скорее помешают.
KaMa3eR
Mar 19 2011, 15:09
госпада есть трудно выловимый

для меня трабл при написании генератора сигналов, с исходника одого из форумчан, нашел глюк и не могу выличить
далее по тексту объявление переменных
#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]);
помогите голову сломал ниче не могу понять
lisstret
Mar 20 2011, 03:29
А если сделать указатель и занести в него адрес одного из регистров общего назначения, а потом операцией разыменования работать с ним? переменная в регистре ведь, в регистре)
demiurg_spb
Mar 20 2011, 09:44
Можно как угодно, главное запретить компилятору использовать этот регистр для своих нужд.
_Pasha
Mar 20 2011, 12:00
Цитата(Dog Pawlowa @ Mar 19 2011, 16:19)

Проблема в том, что инструкции компилятору по размещению переменных сам компилятор вправе игнорировать.
Тю, блин! А volatile?
Можно критичные по времени функции сделать на ассемблере. Тут уж, как говорицца, все в своих руках
Genadi Zawidowski
Mar 21 2011, 06:15
Цитата(KaMa3eR @ Mar 19 2011, 18:09)

sprintf(&lcd_string[0], "%6u", freq);
sprintf(&lcd_string[0], "%6
lu", freq);
букву эл добавить в форматную строку.
KaMa3eR
Mar 21 2011, 18:05
Цитата(Genadi Zawidowski @ Mar 21 2011, 09:15)

sprintf(&lcd_string[0], "%6lu", freq);
букву эл добавить в форматную строку.
ок попробую
Nikkolaj
Mar 23 2011, 08:47
Если выбрана опция Avtomatic Register Allocation, то CV распределяет глобальные переменные в регистры в порядке их обявления.
Просто обявите Вашу переменную первой, и она будет в регистре.
Если опция Avtomatic Register Allocation не выбрана, тогда для размещения переменной в регистре, надо использовать ключевое слово register.
Например: register int a;
Опция находится в настройках проекта, закладка C Compiler.
Dog Pawlowa
Mar 23 2011, 13:53
Цитата(_Pasha @ Mar 20 2011, 16:00)

А volatile?
А это не инструкция по размещению.
SasaVitebsk
Mar 24 2011, 07:04
Цитата(_Артём_ @ Mar 18 2011, 23:08)

Разве речь шла не о регистрах типа DDRx и п.т?
Почему три штуки?
Нет речь, похоже, шла не о DDR. ))
Возьмите pdf на atmega88, к примеру, и почитайте про регистры GPIOR0 - GPIOR2. Соответственно вопросы про "заниматься фигнёй" одпадут. Есть правда некоторые моменты, что такие регистры есть не во всех контроллерах, поэтому не очень применимо, но тем не менее вещь предусмотренная разработчиком.
Это первое. Второе - вопрос абсолютно не в "вылизывании проги до такта". Эти регистры созданы как регистры флагов (насколько я понимаю), для получения атомарного доступа.
KaMa3eR
Mar 27 2011, 14:17
Цитата(Genadi Zawidowski @ Mar 21 2011, 09:15)

sprintf(&lcd_string[0], "%6lu", freq);
букву эл добавить в форматную строку.
попробовал есть смысл , но кроме того нуно визарду CVAVR в закладке project/config/C Compiler/ sprintf выставить размерность вывода вот откуда у меня лезли непонятки
skyled
Mar 29 2011, 05:46
при объявлении переменной используйте слово "register".
Код
register int abc;
demiurg_spb
Mar 29 2011, 10:47
Это ничего не даст.
слова register и auto, можно сказать, анахронизмы языка Си.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.