Если те переменные, что нужно сохранять, поместить в начале сегмента данных, то можно, в виде исключения, (подсмотрев для подстраховки в map'е) и их сохранить - трюкачество, конечно, но иногда и без него никак - "не разбив яиц, не научиться ездить верхом".я ж не знаю, в какой регистр/ адрес памяти какую переменную компилятор засунет
CodeVision AVR в вопросах и ответах
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Я немного о другом - поскольку в Си предполагается, что начальное значение нелокальных статических переменных равно нулю, то программа может иметь участки кода, которые сработают неверно, если переменные нулю не равны. После рестарта программа пойдет с нуля и может "наступить" на эти грабли, поэтому исключать из цикла инициализации нулями весь сегмент полностью - нельзя. Вот об этом я и решил напомнить.

- hd44780
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вт июл 14, 2009 09:27:37
- Откуда: Донецк, Украина
Строго говоря все это - недостаток компилятора.
Если контроллеры имеют возможность рестартовать по разным причинам, то и компиляторы должны как-то это поддерживать.
Иначе преимущества всех этих Wathdog и пр. сводятся практически к нулю.
Кстати выкачал на днях последнюю демоверсию, они там ввели возможность запрета очистки всех глобальных переменных. В принципе то же самое, что и я сделал.
Запрета инициализации избранных переменных по прежнему нет.
Можно еще привязать переменную к регистру (cvAVR такое позволяет), а потом убрать из startup очистку именно этого регистра. Но я пока это не пробовал.
Если контроллеры имеют возможность рестартовать по разным причинам, то и компиляторы должны как-то это поддерживать.
Иначе преимущества всех этих Wathdog и пр. сводятся практически к нулю.
Кстати выкачал на днях последнюю демоверсию, они там ввели возможность запрета очистки всех глобальных переменных. В принципе то же самое, что и я сделал.
Запрета инициализации избранных переменных по прежнему нет.
Можно еще привязать переменную к регистру (cvAVR такое позволяет), а потом убрать из startup очистку именно этого регистра. Но я пока это не пробовал.
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
- hd44780
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вт июл 14, 2009 09:27:37
- Откуда: Донецк, Украина
Yellow Tiger писал(а):А что заставило отказаться от WinAVR с его .noinit-секцией?
Глюки непонятные с ним.
Я делаю метеостанцию с набором удаленных радиотермометров. База - приемник, LCD, датчики давления, влажности. Удаленые сенсоры измеряют температуру и передают инфу по радиоканалу на базу.
Когда микрокод сенсора был на WinAVR без засыпания - передача шла нормально. Добавил засыпание (для экомомии батарейки) - перестал передавать. Переписал этот же алгоритм на CVAVR - работает как часы. Правда пока датчик температуры отключил - отладка. Сейчас его как раз подключаю.
Радиомодуль - Telecontrolli RT4. Модуляция данных по таймеру.
Алгоритм такой - запустил измерение - заснул, через 2 сек проснулся по Watchdog, считал датчик, передал, запустил новое измерение - заснул.
А т.к. Watchdog - это сброс на меге8, соответственно и нужен этот .noinit.
Микрокод приемника в ходе экспериментов не менялся.
- Synergetik
- Встал на лапы
- Сообщения: 117
- Зарегистрирован: Чт фев 28, 2008 23:54:35
- Откуда: Воскресенск, МО
- Контактная информация:
Здравствуйте!
Кто-нибудь знает, как бороться с ошибкой:
" undefined symbol '__asm__' " ?
Контекст такой:
__asm__ __volatile__ ("1: ldi r26, %2 \n" "2: dec r26 \n" " brne 2b \n" " sbiw %0, 1 \n" " brne 1b \n" : "=w" (us) : "w" (us), "i" (LOOPS_PER_US) : "r26" );
Первоисточник: http://www.rlocman.ru/shem/schematics.html?di=33473.
Ошибка повторяется и в 1.25 и в 2.03 версиях. Причём если "volatile" опознаётся как ключевое слово (выделяется жирным), то "asm" - не хочет.
Может заголовочный файл нужно какой подключить?
Кто-нибудь знает, как бороться с ошибкой:
" undefined symbol '__asm__' " ?
Контекст такой:
__asm__ __volatile__ ("1: ldi r26, %2 \n" "2: dec r26 \n" " brne 2b \n" " sbiw %0, 1 \n" " brne 1b \n" : "=w" (us) : "w" (us), "i" (LOOPS_PER_US) : "r26" );
Первоисточник: http://www.rlocman.ru/shem/schematics.html?di=33473.
Ошибка повторяется и в 1.25 и в 2.03 версиях. Причём если "volatile" опознаётся как ключевое слово (выделяется жирным), то "asm" - не хочет.
Может заголовочный файл нужно какой подключить?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
кто-нибудь знает. приведенный синтаксис характерен для WinAVR, а не для CVAVR - отсюда и ругня компилятора. посмотрел в исходник - он действительно под WinAVR написан.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Почему нельзя, можно, причем, по-разному:
Знай и умей свой CV AVR!
Код: Выделить всё
#asm
ld r30,y+
ld r31,y+
adiw r30,0
#endasm
#asm("ld r30,y+ \ ld r31,y+ \ adiw r30,0")Знай и умей свой CV AVR!
- Synergetik
- Встал на лапы
- Сообщения: 117
- Зарегистрирован: Чт фев 28, 2008 23:54:35
- Откуда: Воскресенск, МО
- Контактная информация:
ARV писал(а):приведенный синтаксис характерен для WinAVR, а не для CVAVR - отсюда и ругня компилятора. посмотрел в исходник - он действительно под WinAVR написан.
Действительно, Спасибо!
Правда у WinAVR свои тараканы, то есть ошибки полезли. На первый взгляд совершенно неадекватные, типа "multiple definition", хотя множественное определение для главной функции - это просто бред.
Ладно, спасибо ещё раз. Перехожу в соседнюю тему. Параллельно буду изучать Ассемблер, чтобы по-нормальному преобразовать asm-вставки в Code Vision.
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
Объясните пожалуста что это за строки генерируються генератором кода .
Код: Выделить всё
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
jerry писал(а):Подскажите как правильно юзать функцию sprintf в CodeVision если нужно вывести float. В официальной доке написано следующее:
'f' - the function argument is a float, that will be outputted using the [-]ddd.dddddd format.
Допустим имеем:
float cat=0.1;
char buf[20];
sprintf(buf, "%-f", cat);
Вот такой вывод не работает. Подскажите как правильно юзать.
.
Что значит "не работает"? В чем это выражается?
В опциях проекта использование float включено?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: sprintf в CodeVision не пойму как выводить float
ясен-красен, не будет работать. сказано же: после процента надо f ставить, а вы минус рисуете...jerry писал(а):sprintf(buf, "%-f", cat);
Вот такой вывод не работает. Подскажите как правильно юзать.
Код: Выделить всё
sprintf(buf, "%f", cat);если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Re: sprintf в CodeVision не пойму как выводить float
"Тараписса нинада!" (с) "Кавказская пленница"ARV писал(а):ясен-красен, не будет работать. сказано же: после процента надо f ставить, а вы минус рисуете...Код: Выделить всё
sprintf(buf, "%f", cat);
%[flags][width][.precision][l]type_char
The optional flags characters are:
'-' left-justifies the result, padding on the right with spaces.
- __Alexander
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Вт сен 11, 2007 10:27:08
- Откуда: Киев
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: sprintf в CodeVision не пойму как выводить float
и куда и на сколько будет выравниваться в таком формате: "%-f" ? не торопитесь...Yellow Tiger писал(а):Так работать будет, так как знак формата может быть предварен другими символами, в частности - признаками выравнивания. Выравнивание влево обозначается символом '-'.%[flags][width][.precision][l]type_char
The optional flags characters are:
'-' left-justifies the result, padding on the right with spaces.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Куда и на сколько, это вопросы, на которые можно отвечать потом, после того, как мы отметим, что вот в этом утверждении:
1. работать будет,
2. никем не требуется сразу после процента ставить type_char, более того, между процентом и type_char могут стоять еще четыре разных поля, управляющих форматированием,
3. минус, поставленный до type_char, не противоречит синтаксису и к неработоспособности строки формата не приводит.
А хотел он выравнивать влево или не хотел - это уже совсем другая история, ибо вопрос, напомню, был не о форматировании, а о том - почему нет обещанного "[-]ddd.dddddd format", и утверждать что он и не должен работать при такой форматной строке - было явно рановато.
А уж говорить, что type_char нужно непременно ставить сразу после после процента... кхм...
есть несколько неточностей:ясен-красен, не будет работать. сказано же: после процента надо f ставить, а вы минус рисуете...
1. работать будет,
2. никем не требуется сразу после процента ставить type_char, более того, между процентом и type_char могут стоять еще четыре разных поля, управляющих форматированием,
3. минус, поставленный до type_char, не противоречит синтаксису и к неработоспособности строки формата не приводит.
А хотел он выравнивать влево или не хотел - это уже совсем другая история, ибо вопрос, напомню, был не о форматировании, а о том - почему нет обещанного "[-]ddd.dddddd format", и утверждать что он и не должен работать при такой форматной строке - было явно рановато.
А уж говорить, что type_char нужно непременно ставить сразу после после процента... кхм...
- __Alexander
- Потрогал лапой паяльник
- Сообщения: 335
- Зарегистрирован: Вт сен 11, 2007 10:27:08
- Откуда: Киев
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Автора вопроса ширина, количество знаков и прочие мелочи не интересовали - у него эта функция вовсе не отрабатывала, сдается мне.__Alexander писал(а):без задания параметров ширины и кол-ва знаков после запятой этот минус, грубо говоря, игнорируется.
Это одна из очень часто встречающихся у нас ошибок (RTFM называется) - опции, подключающие необходимые библиотеки форматного вывода, не включены, а вывода-таки хочется.
Опции включаются здесь:

Здравствуйте, уважаемые коты! Как использовать рандом в CVAVR? В мануалах были найдены 2 функции srand и rand, однако дело не продвинулось. Можно кинуть в меня примерчиком функции типа выдающей значения 0..max_random? Ну или если лень/религия не позволяет, хоть пните в нужном направлении. 
Код: Выделить всё
unsigned char random(unsigned char max_random)