Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: In-line assembler avrgcc
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
nicname
Вот пример из GCC-AVR Inline Assembler Cookbook 2/8 .

Вставляю в Programmer's Notepad - asm volatile("in %0, %1" : "=r" (value) : "I" (PORTB) : ); , выдаёт кучу ошибок , в чём тут дело ?
zltigo
Moderator:
Настоятельно рекомендую:
- тщательнее выбирать раздел - тему перенес;
- не встявлять картинки без надобности;
- не выдирать бездумно строчки в надежде,что оно вдруг заработает.
nicname
Ладно , извините , я не знал , что на Микроконтроллеры (МК) - Microcontrollers (MCs) и другие разделы есть ...
Картинка для убедительности , что пример существует в природе ...
На то он и пример , чтоб его использовать , не для того чтоб "заработало" , а чтобы по-крайней мере он нормально откомпилировался в качестве примера .... А по теме у Вас ничего нет сказать ?
aesok
Цитата(nicname @ Apr 26 2008, 17:27) *
Вставляю в Programmer's Notepad - asm volatile("in %0, %1" : "=r" (value) : "I" (PORTB) : ); , выдаёт кучу ошибок , в чём тут дело ?

Вы думаете я побегу раскладывать карты, и угадывать куда вы эту строчку вставили и какие ошибки получили. НЕТ!!! Если нужна помощь, задавайте по человечески вопрос.

Анатолий.
nicname
Да в Нотепад Программера вставил , второй раз повторяю ...
А ошибки вот :

кстати , выход в Нотепаде не копируется , только снимком ...
aesok
а еще интересно взглянуть на строчки 60...80 файла asm.c
MrYuran
Цитата(nicname @ Apr 26 2008, 18:04) *
Да в Нотепад Программера вставил , второй раз повторяю ...
А ошибки вот :

кстати , выход в Нотепаде не копируется , только снимком ...

ну и где собственно куча
После слова асм хочет скобку.
Вот у меня примерчик есть по mspgss, я думаю avrgcc не сильно отличается
Код
void Pause(register unsigned int n)
{
    __asm__ __volatile__
    (
            "1: \n"
            " dec %[n] \n"
            "nop \n"
            "nop \n"
            " jne 1b \n"
            : [n] "+r"(n)
    );

}

Это так кпримеру рекомендуют делать паузу на нопах, чтобы оптимизатор её не покоцал
nicname
Цитата(aesok @ Apr 26 2008, 22:27) *
а еще интересно взглянуть на строчки 60...80 файла asm.c

Вот файл целиком :

asm volatile("in %0, %1" : "=r" (value) : "I" (PORTD) : );
aesok
Цитата(nicname @ Apr 26 2008, 19:36) *
Вот файл целиком :

asm volatile("in %0, %1" : "=r" (value) : "I" (PORTD) : );


Оператор asm должен располагаться внутри функции. Также должна быть объявлена переменная 'value' локальная в этой функции или глобальная.

Анатолий.
ReAl
Если стоит ключ языка - стандарт ANSI (C89/С99), то ключевое слово asm отсутствует, пожтому оно воспринимается как идентификатор и дальше уже идут ошибки в зависимсоти от версии компилятора и что он думает про этот идентификатор. В данном случае подумал, что это должна быть (необъявленная до сих пор) функция, а после её имени должна быть "(".
Так что привыкайте писать __asm__.

(2 aeosk - всё забываю написать - в некоторых заголовочных файлах встречается asm - в eeprom.h уже поправили, кажется, в interrupt.h осталось, выдаёт ошибки в случае -std=c99. Можно этот ключ и не ставить, но...)

Кроме этого просто PORTD имеет адрес памяти, а не IO-пространства, для правильной адресации надо вернуть его в IO-зону.
Итого:
Код
    __asm__ __volatile__ (
        "in %0, %1"
        : "=r" (value)
        : "I" (_SFR_IO_ADDR(PORTD))
    );



Цитата(nicname @ Apr 26 2008, 18:36) *
Вот файл целиком :
asm volatile("in %0, %1" : "=r" (value) : "I" (PORTD) : );

Ого!
Ну тогда всё написанное мной читать после того, как файл примет нужный вид smile.gif
nicname
Понятно , что пример в GCC-AVR Inline Assembler Cookbook 2/8 бестолковый для бестолковых начинающих ... Собственно , начал я отсюда , да простит меня модератор , но программу на FBD в Floworks можно представить только в форме картинки :

хотя вот эта вставка
asm volatile("nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
: : ) ;
из кукбук нормально компилировалась -
int main()
{ //Initialisation
MCUSR=0x00;
WDTCR=0x10;
//Interrupt initialisation code
//C code
//C Code:
asm volatile(
"nop\n\t"
"nop\n\t"
"nop\n\t"
"nop\n\t"
: : ) ;
mainendloop: goto mainendloop;
}

Получилось -
int main()
{
//Initialisation
MCUSR=0x00;
WDTCR=0x10;
//Interrupt initialisation code
//C code
//C Code:
__asm__ __volatile__ (
"in %0, %1"
: "=r" (value)
: "I" (_SFR_IO_ADDR(PORTD))
);
mainendloop: goto mainendloop;
}
aesok
А что вы тут ждете уже целый час? Перевода вот этого: 'value' undeclared ???

Вот один переводчик: http://www.translate.ru/text.asp?lang=ru
Вот второй: http://www.lingvo.ru/

Извините, но я не справочник, и не буду собой заменять Вам книгу по языку С.

Анатолий.
ReAl
Ну раз nop-ы нормально скомпилировались, значит режим компилятора позволяет просто asm
Про value правильно сказано, что такой переменной нет.
Заведите её где-то, асм-вставка, как и любой другой код, может работать только с существующими переменными.

По поводу PORTD - "ну не знаю".
Порты описаны в <avr/io.h> и включаемых через него в зависимости от указанного типа контроллера файлах. Если <avr/io.h> включен, но тип контроллера не указан - тоже порты не будут описаны.
Ищите, как заставить среду включить файл и/или как в ней задать тип контроллера.
AHTOXA
Цитата(nicname @ Apr 26 2008, 22:18) *
Понятно , что пример в GCC-AVR Inline Assembler Cookbook 2/8 бестолковый для бестолковых начинающих ...


Он нормальный, просто он для начинающих в ассемблерных вставках, а не для начинающих в Си:-)

Цитата(nicname @ Apr 26 2008, 22:18) *
Код
        __asm__ __volatile__ (
            "in %0, %1"
            : "=r" (value)
            : "I" (_SFR_IO_ADDR(PORTD))
        );
    mainendloop: goto mainendloop;
}


Что должен, по-вашему, сделать этот кусок ассемблера? Скопировать значение из PORTD в value, так? Где объявление переменной value? Нету, вот и ошибка номер раз. Где объявление переменной PORTD? В файле avr/io.h. Где строчка
#include <avr/io.h> в начале? Нету. Вот и вторая ошибка.

Вы для начала просто Си немножко займитесь, а уж потом ассемблерные вставки.
MrYuran
В самом вверху обычно пишут
#include "ФАЙЛ_ОПИСАНИЯ_ПРОЦЕССОРА.h" // это шоб не ругался на PORTD

Шоба не было "value'' undeclared, это value должно быть определено до первого использования.

То есть: char value;
nicname
Поставил вместо величины 16 , исправил на портВ , у меня тини13 :
int main()
{
//Initialisation
MCUSR=0x00;
WDTCR=0x10;
//Interrupt initialisation code
//C code
//C Code:
asm
volatile (
"in %0, %1"
: "=r" (16)
: "I" (PORTB)
);
mainendloop: goto mainendloop;
}
получил то же , что и позавчера :
ReAl
Цитата(nicname @ Apr 26 2008, 21:05) *
asm
volatile (
"in %0, %1"
: "=r" (16)
: "I" (PORTB)
);
mainendloop: goto mainendloop;
}

Вы хоть поняли, что написали? Вы пытаетесь в число 16 занестит значение, прочитанное из порта.
Всё, моё терпение закончилось. Дальше без меня.
oll
asm volatile ("in %0, %1" : "=r" (16): "I" (PORTB));
подобные конструкции используются так:
#define cbi(addr,bit) asm("cbi %0,%1"::"I" _SFR_IO_ADDR(addr),"I" (bit));
#define sbi(addr,bit) asm("sbi %0,%1"::"I" _SFR_IO_ADDR(addr),"I" (bit));

void main()
{
.......
sbi(PORTB,5);
cbi(PORTB,5);


.......
}
nicname
Спасибо всем , победил его на ixbt smile.gif
aesok
Цитата(nicname @ Apr 28 2008, 14:44) *
Спасибо всем , победил его на ixbt smile.gif


А чему Вы радуетесь? Ведь этоже не Вы победили.

Анатолий.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.