CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Я немного о другом - поскольку в Си предполагается, что начальное значение нелокальных статических переменных равно нулю, то программа может иметь участки кода, которые сработают неверно, если переменные нулю не равны. После рестарта программа пойдет с нуля и может "наступить" на эти грабли, поэтому исключать из цикла инициализации нулями весь сегмент полностью - нельзя. Вот об этом я и решил напомнить.
я ж не знаю, в какой регистр/ адрес памяти какую переменную компилятор засунет
Если те переменные, что нужно сохранять, поместить в начале сегмента данных, то можно, в виде исключения, (подсмотрев для подстраховки в map'е) и их сохранить - трюкачество, конечно, но иногда и без него никак - "не разбив яиц, не научиться ездить верхом". ;)
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Сообщение hd44780 »

Строго говоря все это - недостаток компилятора.
Если контроллеры имеют возможность рестартовать по разным причинам, то и компиляторы должны как-то это поддерживать.
Иначе преимущества всех этих Wathdog и пр. сводятся практически к нулю.

Кстати выкачал на днях последнюю демоверсию, они там ввели возможность запрета очистки всех глобальных переменных. В принципе то же самое, что и я сделал.

Запрета инициализации избранных переменных по прежнему нет.
Можно еще привязать переменную к регистру (cvAVR такое позволяет), а потом убрать из startup очистку именно этого регистра. Но я пока это не пробовал.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

hd44780 писал(а):Строго говоря все это - недостаток компилятора.
Согласен. А что заставило отказаться от WinAVR с его .noinit-секцией?
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Сообщение hd44780 »

Yellow Tiger писал(а):А что заставило отказаться от WinAVR с его .noinit-секцией?


Глюки непонятные с ним.
Я делаю метеостанцию с набором удаленных радиотермометров. База - приемник, LCD, датчики давления, влажности. Удаленые сенсоры измеряют температуру и передают инфу по радиоканалу на базу.

Когда микрокод сенсора был на WinAVR без засыпания - передача шла нормально. Добавил засыпание (для экомомии батарейки) - перестал передавать. Переписал этот же алгоритм на CVAVR - работает как часы. Правда пока датчик температуры отключил - отладка. Сейчас его как раз подключаю.
Радиомодуль - Telecontrolli RT4. Модуляция данных по таймеру.
Алгоритм такой - запустил измерение - заснул, через 2 сек проснулся по Watchdog, считал датчик, передал, запустил новое измерение - заснул.
А т.к. Watchdog - это сброс на меге8, соответственно и нужен этот .noinit.

Микрокод приемника в ходе экспериментов не менялся.
Аватара пользователя
Synergetik
Встал на лапы
Сообщения: 117
Зарегистрирован: Чт фев 28, 2008 23:54:35
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

Здравствуйте!

Кто-нибудь знает, как бороться с ошибкой:

" 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
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

кто-нибудь знает. приведенный синтаксис характерен для WinAVR, а не для CVAVR - отсюда и ругня компилятора. посмотрел в исходник - он действительно под WinAVR написан.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
hd44780
Встал на лапы
Сообщения: 132
Зарегистрирован: Вт июл 14, 2009 09:27:37
Откуда: Донецк, Украина

Сообщение hd44780 »

В CVavr - #asm("");
Но туда нельза пхать насколько команд разом.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Почему нельзя, можно, причем, по-разному:

Код: Выделить всё

    #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
Откуда: Воскресенск, МО
Контактная информация:

Сообщение Synergetik »

ARV писал(а):приведенный синтаксис характерен для WinAVR, а не для CVAVR - отсюда и ругня компилятора. посмотрел в исходник - он действительно под WinAVR написан.

Действительно, Спасибо!

Правда у WinAVR свои тараканы, то есть ошибки полезли. На первый взгляд совершенно неадекватные, типа "multiple definition", хотя множественное определение для главной функции - это просто бред.

Ладно, спасибо ещё раз. Перехожу в соседнюю тему. Параллельно буду изучать Ассемблер, чтобы по-нормальному преобразовать asm-вставки в Code Vision.
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Объясните пожалуста что это за строки генерируються генератором кода . :)

Код: Выделить всё

// 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 »

Так устанавливается делитель тактовой. Смотри "Clock Prescale Register" в ДШ.
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

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

Сообщение ARV »

jerry писал(а):sprintf(buf, "%-f", cat);
Вот такой вывод не работает. Подскажите как правильно юзать.
ясен-красен, не будет работать. сказано же: после процента надо f ставить, а вы минус рисуете...

Код: Выделить всё

sprintf(buf, "%f", cat);
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Re: sprintf в CodeVision не пойму как выводить float

Сообщение Yellow Tiger »

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
Откуда: Киев

Сообщение __Alexander »

Не буду утверждать, что по умолчанию компилятор подставляет какое-либо число (надо читать), но если подумать, то если вы ставите знак ширины поля и чисел после запятой, то может его нужно таки указывать? типа %-2.3f (два поля с выравниваем влево и три знака после запятой).

Хотя не факт.

----------
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: sprintf в CodeVision не пойму как выводить float

Сообщение ARV »

Yellow Tiger писал(а):Так работать будет, так как знак формата может быть предварен другими символами, в частности - признаками выравнивания. Выравнивание влево обозначается символом '-'.

%[flags][width][.precision][l]type_char

The optional flags characters are:
'-' left-justifies the result, padding on the right with spaces.
и куда и на сколько будет выравниваться в таком формате: "%-f" ? не торопитесь...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

Куда и на сколько, это вопросы, на которые можно отвечать потом, после того, как мы отметим, что вот в этом утверждении:
ясен-красен, не будет работать. сказано же: после процента надо f ставить, а вы минус рисуете...
есть несколько неточностей:
1. работать будет,
2. никем не требуется сразу после процента ставить type_char, более того, между процентом и type_char могут стоять еще четыре разных поля, управляющих форматированием,
3. минус, поставленный до type_char, не противоречит синтаксису и к неработоспособности строки формата не приводит.

А хотел он выравнивать влево или не хотел - это уже совсем другая история, ибо вопрос, напомню, был не о форматировании, а о том - почему нет обещанного "[-]ddd.dddddd format", и утверждать что он и не должен работать при такой форматной строке - было явно рановато.
А уж говорить, что type_char нужно непременно ставить сразу после после процента... кхм... :roll:
Аватара пользователя
__Alexander
Потрогал лапой паяльник
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Проверил, что с минусом что без, работает одинаково. Т.е. без задания параметров ширины и кол-ва знаков после запятой этот минус, грубо говоря, игнорируется.

А вот если поставить "+", то и без параметров результат: +0.100000,
т.е. "+" в виде символа ASCII тоже присутствует.



----------
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

__Alexander писал(а):без задания параметров ширины и кол-ва знаков после запятой этот минус, грубо говоря, игнорируется.
Автора вопроса ширина, количество знаков и прочие мелочи не интересовали - у него эта функция вовсе не отрабатывала, сдается мне. Изображение
Это одна из очень часто встречающихся у нас ошибок (RTFM называется) - опции, подключающие необходимые библиотеки форматного вывода, не включены, а вывода-таки хочется. Изображение

Опции включаются здесь:
Изображение
Shutilla
Открыл глаза
Сообщения: 52
Зарегистрирован: Чт июл 03, 2008 12:34:48
Откуда: Волгоград

Сообщение Shutilla »

Здравствуйте, уважаемые коты! Как использовать рандом в CVAVR? В мануалах были найдены 2 функции srand и rand, однако дело не продвинулось. Можно кинуть в меня примерчиком функции типа

Код: Выделить всё

unsigned char random(unsigned char max_random)
выдающей значения 0..max_random? Ну или если лень/религия не позволяет, хоть пните в нужном направлении. :oops:
Ответить

Вернуться в «AVR»