реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> In-line assembler avrgcc, Кто нибудь пробовал ?
nicname
сообщение Apr 26 2008, 13:27
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 10-03-07
Пользователь №: 26 022



Вот пример из GCC-AVR Inline Assembler Cookbook 2/8 .

Вставляю в Programmer's Notepad - asm volatile("in %0, %1" : "=r" (value) : "I" (PORTB) : ); , выдаёт кучу ошибок , в чём тут дело ?

Сообщение отредактировал nicname - Apr 26 2008, 13:31
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 26 2008, 14:28
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Moderator:
Настоятельно рекомендую:
- тщательнее выбирать раздел - тему перенес;
- не встявлять картинки без надобности;
- не выдирать бездумно строчки в надежде,что оно вдруг заработает.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
nicname
сообщение Apr 26 2008, 14:58
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 10-03-07
Пользователь №: 26 022



Ладно , извините , я не знал , что на Микроконтроллеры (МК) - Microcontrollers (MCs) и другие разделы есть ...
Картинка для убедительности , что пример существует в природе ...
На то он и пример , чтоб его использовать , не для того чтоб "заработало" , а чтобы по-крайней мере он нормально откомпилировался в качестве примера .... А по теме у Вас ничего нет сказать ?
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 26 2008, 15:00
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(nicname @ Apr 26 2008, 17:27) *
Вставляю в Programmer's Notepad - asm volatile("in %0, %1" : "=r" (value) : "I" (PORTB) : ); , выдаёт кучу ошибок , в чём тут дело ?

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

Анатолий.
Go to the top of the page
 
+Quote Post
nicname
сообщение Apr 26 2008, 15:04
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 10-03-07
Пользователь №: 26 022



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

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

Сообщение отредактировал nicname - Apr 26 2008, 15:12
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 26 2008, 15:27
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



а еще интересно взглянуть на строчки 60...80 файла asm.c
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 26 2008, 15:28
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(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)
    );

}

Это так кпримеру рекомендуют делать паузу на нопах, чтобы оптимизатор её не покоцал


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
nicname
сообщение Apr 26 2008, 15:36
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 10-03-07
Пользователь №: 26 022



Цитата(aesok @ Apr 26 2008, 22:27) *
а еще интересно взглянуть на строчки 60...80 файла asm.c

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

asm volatile("in %0, %1" : "=r" (value) : "I" (PORTD) : );
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 26 2008, 15:42
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(nicname @ Apr 26 2008, 19:36) *
Вот файл целиком :

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


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

Анатолий.

Сообщение отредактировал aesok - Apr 26 2008, 15:43
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 26 2008, 15:47
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Если стоит ключ языка - стандарт 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


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
nicname
сообщение Apr 26 2008, 16:18
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 10-03-07
Пользователь №: 26 022



Понятно , что пример в 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;
}


Сообщение отредактировал nicname - Apr 26 2008, 16:21
Go to the top of the page
 
+Quote Post
aesok
сообщение Apr 26 2008, 17:22
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



А что вы тут ждете уже целый час? Перевода вот этого: 'value' undeclared ???

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

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

Анатолий.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 26 2008, 17:29
Сообщение #13


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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

По поводу PORTD - "ну не знаю".
Порты описаны в <avr/io.h> и включаемых через него в зависимости от указанного типа контроллера файлах. Если <avr/io.h> включен, но тип контроллера не указан - тоже порты не будут описаны.
Ищите, как заставить среду включить файл и/или как в ней задать тип контроллера.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 26 2008, 17:34
Сообщение #14


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(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> в начале? Нету. Вот и вторая ошибка.

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 26 2008, 17:39
Сообщение #15


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

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

То есть: char value;


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th June 2025 - 13:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016