|
In-line assembler avrgcc, Кто нибудь пробовал ? |
|
|
|
Apr 26 2008, 13:27
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Apr 26 2008, 14:58
|
Участник

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

|
Ладно , извините , я не знал , что на Микроконтроллеры (МК) - Microcontrollers (MCs) и другие разделы есть ... Картинка для убедительности , что пример существует в природе ... На то он и пример , чтоб его использовать , не для того чтоб "заработало" , а чтобы по-крайней мере он нормально откомпилировался в качестве примера .... А по теме у Вас ничего нет сказать ?
|
|
|
|
|
Apr 26 2008, 15:00
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(nicname @ Apr 26 2008, 17:27)  Вставляю в Programmer's Notepad - asm volatile("in %0, %1" : "=r" (value) : "I" (PORTB) : ); , выдаёт кучу ошибок , в чём тут дело ? Вы думаете я побегу раскладывать карты, и угадывать куда вы эту строчку вставили и какие ошибки получили. НЕТ!!! Если нужна помощь, задавайте по человечески вопрос. Анатолий.
|
|
|
|
|
Apr 26 2008, 15:04
|
Участник

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

|
Да в Нотепад Программера вставил , второй раз повторяю ... А ошибки вот :  кстати , выход в Нотепаде не копируется , только снимком ...
Сообщение отредактировал nicname - Apr 26 2008, 15:12
|
|
|
|
|
Apr 26 2008, 15:28
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
|
Apr 26 2008, 15:36
|
Участник

Группа: Новичок
Сообщений: 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) : );
|
|
|
|
|
Apr 26 2008, 15:42
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 26 2008, 15:47
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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) : ); Ого! Ну тогда всё написанное мной читать после того, как файл примет нужный вид
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 26 2008, 16:18
|
Участник

Группа: Новичок
Сообщений: 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
|
|
|
|
|
Apr 26 2008, 17:22
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
А что вы тут ждете уже целый час? Перевода вот этого: 'value' undeclared ??? Вот один переводчик: http://www.translate.ru/text.asp?lang=ru Вот второй: http://www.lingvo.ru/Извините, но я не справочник, и не буду собой заменять Вам книгу по языку С. Анатолий.
|
|
|
|
|
Apr 26 2008, 17:29
|

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

|
Ну раз nop-ы нормально скомпилировались, значит режим компилятора позволяет просто asm Про value правильно сказано, что такой переменной нет. Заведите её где-то, асм-вставка, как и любой другой код, может работать только с существующими переменными.
По поводу PORTD - "ну не знаю". Порты описаны в <avr/io.h> и включаемых через него в зависимости от указанного типа контроллера файлах. Если <avr/io.h> включен, но тип контроллера не указан - тоже порты не будут описаны. Ищите, как заставить среду включить файл и/или как в ней задать тип контроллера.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Apr 26 2008, 17:34
|

фанат дивана
     
Группа: Свой
Сообщений: 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> в начале? Нету. Вот и вторая ошибка. Вы для начала просто Си немножко займитесь, а уж потом ассемблерные вставки.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|