WinAvr в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

IfoR писал(а):...
имхо, чем меньше ассемблерных вставок, тем спокойнее жизнь программиста. вам действительно нельзя обойтись средствами Си? точно-точно? в таком случае рекомендовал бы просто сделать ассемблерный файл с нужными функциями - это намного проще.
odnk писал(а):При установленных уровнях оптимизации Q1,Q2,Q3,Qs не работают бесконечные циклы while(1),
for(;;), а также оператор безусловного перехода goto. На уровне Q0(без оптимизации)
таких проблем нет.
это все фантазии - все работает. очевидно, проблема у вас, как это водится, в том, что вы не до конца понимаете, что делаете. ну и/или volatile не используете, там, где это необходимо. обо всем на форуме писалось стопитцот раз - ищите поиском.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

IfoR писал(а):при -Os транслируется в нечто вроде

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

.L11:
    rjmp .L11

А как по вашему должен выглядеть бесконечный цикл на асме?
Читайте книжки вот пример из книги Керниган и Риччи (Brian W. Kernighan, Dennis M. Ritchie)
.
Спойлер3.5 Циклы while и for
Мы уже встречались с циклами while и for. В цикле

while (выражение)
инструкция

вычисляется выражение. Если его значение отлично от нуля, то выполняется инструкция, и вычисление выражения повторяется. Этот цикл продолжается до тех пор, пока выражение не станет равным нулю, после чего вычисления продолжатся с точки, расположенной сразу за инструкцией.

Инструкция for

for (выр1; выр2; выр3)
инструкция

эквивалентна конструкции

выр1;
while (выр2) {
инструкция
выр3;
}

если не считать отличий в поведении инструкции continue, речь о которой пойдет в параграфе 3.7.

С точки зрения грамматики три компоненты цикла for представляют собой произвольные выражения, но чаще выр1 и выр3 — это присваивания или вызовы функций, а выр2 - выражение отношения. Любое из этих трех выражений может отсутствовать, но точку с запятой опускать нельзя. При отсутствии выр1, или выр3 считается, что их просто нет в конструкции цикла; при отсутствии выр2, предполагается, что его значение как бы всегда истинно. Например,

for (;;) {

}


есть "бесконечный" цикл, выполнение которого,й вероятно, прерывается каким-то другим способом, например с помощью инструкций break или return.


IfoR писал(а):На что он мне вежливо отвечает:

Странно у меня вот это нормально компилируется.
Спойлер#include <avr/io.h>
#define buffersize2 5
int main(void){

char bip(char in)
{ // Двоично-инверсная перестановка
char r = buffersize2, out;

asm volatile(
"loop: \n"
"rol inr \n"
"ror outr \n"
"dec ir \n"
"brne loop"
: [outr]"=%d" (out) : [inr]"d" (in), [ir]"d" (r) );

return out;
}

}
Последний раз редактировалось vitalik_1984 Сб фев 11, 2012 04:33:27, всего редактировалось 1 раз.
В поисках истины человек развивается.
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение IfoR »

Мастер Ломастер писал(а):имхо, чем меньше ассемблерных вставок, тем спокойнее жизнь программиста.

Обойтись то можно, но дело в том, что эта часть программы будет часто вызываться и нужно реализовать выполнение этой функции максимально быстрым. К тому же, реализовать эту часть на асм-е, как ни странно, проще, чем на Си (а в железе так вообще тупо проводочки подпаял и всё :music: ).

Вот, например, на Си:

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

uint8_t r, out = 0;
 for (= 0; r < buffersize2; r++)
  { out = (out << 1) | (in & 1); in >>= 1; }
 return buf; 

Этот кусок кода транслируется в это:

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


    mov r18
,r24 // Параметр in
    ldi r25,lo8(8) // Количество переставляемых бит
    ldi r24,lo8(0) // Переменная out
.L9:
    lsl r24
    mov r19
,r18
    andi r19
,lo8(1)
    or r24,r19
    lsr r18
    subi r25
,lo8(-(-1))
    brne .L9
/* epilogue start */
    ret


Что, собственно, близко к моему варианту, но всё таки здесь 7 команд против моих 4-х. Итого: 56 тактов против 32.

vitalik_1984, первая цитата, это IfoR писал, а не odnk. Я имел ввиду, что у меня транслируется всё правильно. :)
А какой у тебя компилятор и версия?
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

Итого: 56 тактов против 32
а это вы в компилированом варианте для своего кода берете?
у меня студия четыре.последней сборки
В поисках истины человек развивается.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

IfoR писал(а):К тому же, реализовать эту часть на асм-е, как ни странно, проще, чем на Си
так я вам и посоветовал сделать файл *.s и в нем вашу функцию именно на ассемблере реализовать - не в виде вставки, а именно в виде ассемблера, где вы можете развернуться вовсю в своем умении писать на нем. вставка - костыль, я же посоветовал шагать без костылей.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение IfoR »

vitalik_1984 писал(а):а это вы в компилированом варианте для своего кода берете?

Нет естественно, но разве после компиляции в моей вставке что-то должно поменяться?
Я сравнивал именно сам функциональный код.
Мастер ломастер на счет костылей. У меня стандартный вопрос: с фига-ли это костыль (ну кроме синтаксиса, а то в таком случае весь Си для AVR один большой костыль)? И чем тогда не костыль вынесение функций в отдельный файл? И зачем мне вообще это здесь?
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

IfoR писал(а):Мастер ломастер на счет костылей. У меня стандартный вопрос: с фига-ли это костыль (ну кроме синтаксиса, а то в таком случае весь Си для AVR один большой костыль)? И чем тогда не костыль вынесение функций в отдельный файл? И зачем мне вообще это здесь?

я понимаю, что ваши вопросы скорее риторические, но тем не менее постараюсь ответить.
1. Си не костыль хотя бы по тому, что позволяет ускорить решение большинства задач, а не замедлить. если вы потратите 3 дня на попытку понять, что не так в вашей ассемблерной вствке и так и не продвинитесь в этом - то по-моему очевидно, что именно мешает вам двигаться... это костыль мешает, а не Си.
2. Создание ассемблерного исходника с нужными вам "особо скоростными" функциями это как раз нормальное решение проблемы (не костыль) ровно по той же самой причине: вы отлично знаете, как писать на ассемблере и не морочите себе голову над внедрением этого в сишный текст. нормальная практика, опять-таки, позволяющая максимально быстро двигаться к цели, а не ковылять.
3. а вот зачем все это вам - я не знаю, тут я пас.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение IfoR »

Да, блин, о чем ты? Я же только спросил: что я делаю не так? Каким образом эта вставка может стать источником багов здесь? А может я хочу эту функцию inline-овой сделать или макросом. Зачем мне самому расставлять регистры, если компилятор сам их может расставить по месту.
Изображение
/dev/urandom - гигабайты информации.

OS: openSUSE 13.2 (x86_64)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

Мастер Ломастер, вроде не маленький давно, старожил..
А предыдущее сообщение - полностью цитируешь..
Сам-же понимаешь, что читать темы с таким цитированием - крайне трудно.. :wink:

МитяРа..



расставил? сутки уже прошли... речь не о багах, а о том, что силы тратятся непонятно на что - с ассемблерным модулем давно бы уже доделал весь проект, а не только его одну функцию. я вот не знаю, как там все эти параметры входные-выходные правильно задаются - и что-то не тянет узнавать. не вижу в этом смысла. извини, что на ты, и еще извини, что высказал свое мнение.
битва с дураками проиграна, победители торжествуют. слава победителям!
svs39
Встал на лапы
Сообщения: 95
Зарегистрирован: Вс авг 22, 2010 09:23:08

Re: WinAvr в вопросах и ответах

Сообщение svs39 »

codenamehawk писал(а):
Прочитать записанное

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

eeprom_read_block(&t_0_ram, &t_0_rom, sizeof(t_0_ram)); 

у меня такая структура
struct term {
int top[5];
int bottom[5];
};

struct term TR; // structura v RAM
EEMEM struct term TE; // structura v ROM

А как бы мне прочитать 1слово со сквозной нумерацией как из массива типа
int my= eeprom_read_word(&TE[i]); // i= 0..9
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение urry »

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

union uterm {
   struct {
      int top[5];
      int bottom[5];
   }term;
   int arr[10];
};

union uterm TR; // structura v RAM
EEMEM union uterm TE; // structura v ROM
TR.term.top[0]=1;
TR.term.bottom[0]=2;
int my= eeprom_read_word(&TE.arr+i); // i= 0..9

Код не проверял, могут быть ошибки.
svs39
Встал на лапы
Сообщения: 95
Зарегистрирован: Вс авг 22, 2010 09:23:08

Re: WinAvr в вопросах и ответах

Сообщение svs39 »

urry писал(а):

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


int my= eeprom_read_word(&TE.arr+i); // i= 0..9

Код не проверял, могут быть ошибки.

вроде заработало (в ПРОТЕУСЕ)

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


int my= eeprom_read_word( &TE.arr[i] ); // i= 0..9

СПАСИБО! Я union не использовал- надо мне учиться, учиться...
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

Re: WinAvr в вопросах и ответах

Сообщение TICLIR »

Доброе время. Где то видел заметку,как в WinAvr вставить калькулятор, вроде прочитал, и благопалучно забыл.
Кто знает дайте ссылочку пажалуйста.
Аватара пользователя
kot-69
Встал на лапы
Сообщения: 88
Зарегистрирован: Сб апр 19, 2008 12:26:13
Откуда: Херсон
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение kot-69 »

До начала работы над проектом следует тщательно продумать все возможные ошибки и связи между ними.
Это значительно упростит работу над ошибками в самом проекте. (с)
TICLIR
Встал на лапы
Сообщения: 134
Зарегистрирован: Вс авг 01, 2010 16:05:25

Re: WinAvr в вопросах и ответах

Сообщение TICLIR »

kot-69 писал(а):может эта? - http://myrobot.ru/articles/p_winavr_tools.php

Огр.Спасибо. То что надо.
anray
Родился
Сообщения: 18
Зарегистрирован: Сб апр 02, 2011 14:16:26
Откуда: Украина, Одесса

Re: WinAvr в вопросах и ответах

Сообщение anray »

Уважаемые, а не подскажете, есть ли в природе библиотеки к winavr, для перехода с codevisionavr?
Или нужно переписывать полностью код?
Я в avr не силен, но на языке C писал кроссплатформенные приложения под i386 FreeBSD и Linux. Codevisionavr мне не нравится, но есть исходник, написанный под него, судя по заголовочным файлам.
Т.е. я расчитываю на заголовочные файлы, которые можно подсунуть исходнику и он скомпилируется на avr-gcc
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение vitalik_1984 »

не получится скорее всего там в нем много примочек, неподвластных языку си , можно только скомпилить с самом CVAVR
А что конкретно хотели сделать? может получится спрятать свою брезгливость насчет Кодвижна и изменить то, что вам там хотелось?
В поисках истины человек развивается.
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: WinAvr в вопросах и ответах

Сообщение slavik.ksu »

Здравствуйте! пробую запустить таймер:
TCCR0 =(3<<CS0) ; // выдает ошибку:
error: 'CS0' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
Если же записать просто число:
TCCR0 =0x3; // работает как надо!
может что Подскажите... :)
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: WinAvr в вопросах и ответах

Сообщение Мастер Ломастер »

slavik.ksu писал(а):Здравствуйте! пробую запустить таймер:
TCCR0 =(3<<CS0) ; // выдает ошибку:
error: 'CS0' undeclared (first use in this function)
error: (Each undeclared identifier is reported only once
Если же записать просто число:
TCCR0 =0x3; // работает как надо!
может что Подскажите... :)

#include <avr/io.h> вам поможет

только не понятно, что за экзотику вы пишите: (3 << CS0) ?! это вы тут что намерены получить? для выбора одного бита следует использовать макрос _BV() вот так: TCCR0 = _BV(CS0);
битва с дураками проиграна, победители торжествуют. слава победителям!
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: WinAvr в вопросах и ответах

Сообщение slavik.ksu »

Мастер Ломастер писал(а):#include <avr/io.h> вам поможет

только не понятно, что за экзотику вы пишите: (3 << CS0) ?! это вы тут что намерены получить? для выбора одного бита следует использовать макрос _BV() вот так: TCCR0 = _BV(CS0);


такой инклуд у меня уже есть.
CS0 там 3х битный. Записывая туда 3ку я получаю частоту работы таймера СК\64!
На Ваш вариант TCCR0 = _BV(CS0); тоже ругается.
И еще момент! Строчку:
TIMSK = 1<<OCIE0; // компилятор понимает!
Ответить

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