|
AVR Си., Переменные, область хранения. |
|
|
|
Mar 19 2011, 13:02
|
Участник

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

|
Если CodeVision, то надо прочитать "Allocation of Variables to Registers".
P.S. Такое ощущение что тот кто спрашивает, обязательно, школьник... не хочет читать документацию.
|
|
|
|
|
Mar 19 2011, 13:19
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Kirusha @ Mar 19 2011, 08:46)  Тут по-моему разговор ушёл куда-то не туда. По поводу "заниматься фигнёй" я кажется уже отписался: вполне вероятно, что в небольшом куске программы нужно будет экономить каждый такт.... Проблема в том, что инструкции компилятору по размещению переменных сам компилятор вправе игнорировать. Так что выбор у Вас небольшой - если уж доверились компилятору ЯВУ, включите максимальную оптимизацию и молитесь!  Вряд ли у Вас получится лучше или Ваши костыли помогут компилятору. Скорее помешают.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Mar 19 2011, 15:09
|
Участник

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

|
госпада есть трудно выловимый  для меня трабл при написании генератора сигналов, с исходника одого из форумчан, нашел глюк и не могу выличить далее по тексту объявление переменных #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]); помогите голову сломал ниче не могу понять
|
|
|
|
|
Mar 21 2011, 18:05
|
Участник

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

|
Цитата(Genadi Zawidowski @ Mar 21 2011, 09:15)  sprintf(&lcd_string[0], "%6lu", freq);
букву эл добавить в форматную строку. ок попробую
|
|
|
|
|
Mar 24 2011, 07:04
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

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

Группа: Участник
Сообщений: 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 выставить размерность вывода вот откуда у меня лезли непонятки
|
|
|
|
|
Mar 29 2011, 05:46
|
Местный
  
Группа: Участник
Сообщений: 217
Регистрация: 11-06-10
Пользователь №: 57 868

|
при объявлении переменной используйте слово "register". Код register int abc;
Сообщение отредактировал skyled - Mar 29 2011, 05:48
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|