Vetal-Soft 0 19 марта, 2011 Опубликовано 19 марта, 2011 · Жалоба Если CodeVision, то надо прочитать "Allocation of Variables to Registers". P.S. Такое ощущение что тот кто спрашивает, обязательно, школьник... не хочет читать документацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 19 марта, 2011 Опубликовано 19 марта, 2011 · Жалоба Тут по-моему разговор ушёл куда-то не туда. По поводу "заниматься фигнёй" я кажется уже отписался: вполне вероятно, что в небольшом куске программы нужно будет экономить каждый такт.... Проблема в том, что инструкции компилятору по размещению переменных сам компилятор вправе игнорировать. Так что выбор у Вас небольшой - если уж доверились компилятору ЯВУ, включите максимальную оптимизацию и молитесь! ;) Вряд ли у Вас получится лучше или Ваши костыли помогут компилятору. Скорее помешают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kama3er 0 19 марта, 2011 Опубликовано 19 марта, 2011 · Жалоба госпада есть трудно выловимый :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]); помогите голову сломал ниче не могу понять Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lisstret 0 20 марта, 2011 Опубликовано 20 марта, 2011 · Жалоба А если сделать указатель и занести в него адрес одного из регистров общего назначения, а потом операцией разыменования работать с ним? переменная в регистре ведь, в регистре) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 20 марта, 2011 Опубликовано 20 марта, 2011 · Жалоба Можно как угодно, главное запретить компилятору использовать этот регистр для своих нужд. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 20 марта, 2011 Опубликовано 20 марта, 2011 · Жалоба Проблема в том, что инструкции компилятору по размещению переменных сам компилятор вправе игнорировать. Тю, блин! А volatile? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nk@ 0 20 марта, 2011 Опубликовано 20 марта, 2011 · Жалоба Можно критичные по времени функции сделать на ассемблере. Тут уж, как говорицца, все в своих руках :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 21 марта, 2011 Опубликовано 21 марта, 2011 (изменено) · Жалоба sprintf(&lcd_string[0], "%6u", freq); sprintf(&lcd_string[0], "%6lu", freq); букву эл добавить в форматную строку. Изменено 21 марта, 2011 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kama3er 0 21 марта, 2011 Опубликовано 21 марта, 2011 · Жалоба sprintf(&lcd_string[0], "%6lu", freq); букву эл добавить в форматную строку. ок попробую Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nikkolaj 0 23 марта, 2011 Опубликовано 23 марта, 2011 · Жалоба Если выбрана опция Avtomatic Register Allocation, то CV распределяет глобальные переменные в регистры в порядке их обявления. Просто обявите Вашу переменную первой, и она будет в регистре. Если опция Avtomatic Register Allocation не выбрана, тогда для размещения переменной в регистре, надо использовать ключевое слово register. Например: register int a; Опция находится в настройках проекта, закладка C Compiler. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 23 марта, 2011 Опубликовано 23 марта, 2011 · Жалоба А volatile? А это не инструкция по размещению. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 24 марта, 2011 Опубликовано 24 марта, 2011 · Жалоба Разве речь шла не о регистрах типа DDRx и п.т? Почему три штуки? Нет речь, похоже, шла не о DDR. )) Возьмите pdf на atmega88, к примеру, и почитайте про регистры GPIOR0 - GPIOR2. Соответственно вопросы про "заниматься фигнёй" одпадут. Есть правда некоторые моменты, что такие регистры есть не во всех контроллерах, поэтому не очень применимо, но тем не менее вещь предусмотренная разработчиком. Это первое. Второе - вопрос абсолютно не в "вылизывании проги до такта". Эти регистры созданы как регистры флагов (насколько я понимаю), для получения атомарного доступа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kama3er 0 27 марта, 2011 Опубликовано 27 марта, 2011 · Жалоба sprintf(&lcd_string[0], "%6lu", freq); букву эл добавить в форматную строку. попробовал есть смысл , но кроме того нуно визарду CVAVR в закладке project/config/C Compiler/ sprintf выставить размерность вывода вот откуда у меня лезли непонятки Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skyled 0 29 марта, 2011 Опубликовано 29 марта, 2011 (изменено) · Жалоба при объявлении переменной используйте слово "register". register int abc; Изменено 29 марта, 2011 пользователем skyled Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 29 марта, 2011 Опубликовано 29 марта, 2011 · Жалоба Это ничего не даст. слова register и auto, можно сказать, анахронизмы языка Си. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться