roboforum.ru

Технический форум по робототехнике.

Команды на ASM в WinAvr

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Команды на ASM в WinAvr

Сообщение Drunya » 29 окт 2009, 15:11

Нужно в проект вставить файл с несколькими функциями на асме. Трудности возникают с командами типа
Код: Выделить всёРазвернуть
SBI  IOR, bit
CBI  IOR, bit
SBIC IOR, bit
CBIC IOR, bit
Записываю:
Код: Выделить всёРазвернуть
.equ    TxD, PB3
        . . .
        SBI _SFR_IO_ADDR(PORTB),TxD    ;    send '1'
        . . .
На что получаю:
Код: Выделить всёРазвернуть
sw_uart.s:56: Error: constant value required
sw_uart.s:56: Error: `,' required
sw_uart.s:56: Error: constant value required
sw_uart.s:56: Error: garbage at end of line
Так со всеми командами такого типа. Читаю юзер меньюел про avr-libc, там вроде говорят использовать _SFR_IO_ADDR(). Пробывал и без него - эффект тот же. В чем может быть проблема?
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Команды на ASM в WinAvr

Сообщение blindman » 29 окт 2009, 15:28

Ассемблер не знает, что такое PORTB. В начало файла добавить #include <avr/io.h>
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Команды на ASM в WinAvr

Сообщение Drunya » 29 окт 2009, 15:42

<avr/io.h> есть с самого начала. Проблема не в этом.
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Команды на ASM в WinAvr

Сообщение blindman » 29 окт 2009, 15:46

Значит ты чего-то не договариваешь
Код: Выделить всёРазвернуть
andrey@debian:~$ cat test.S
#include <avr/io.h>
.equ    TxD, PB3

SBI _SFR_IO_ADDR(PORTB),TxD    ;    send '1'


andrey@debian:~$ avr-gcc -c -mmcu=atmega8 test.S
andrey@debian:~$
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Команды на ASM в WinAvr

Сообщение Drunya » 29 окт 2009, 15:55

Хм, странно... Вот проект целиком, может глянете?
LineTracer.rar
(8.39 КиБ) Скачиваний: 16
Пол-дня уже мучаюсь, никак не можу понять в чем причина...

upd
И еще:
Код: Выделить всёРазвернуть
E:\>avr-gcc -c -mmcu=atmega8 test.s
test.s: Assembler messages:
test.s:4: Error: constant value required
test.s:4: Error: `,' required
test.s:4: Error: constant value required
test.s:4: Error: garbage at end of line

E:\>
У меня WinAvr20090313
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Команды на ASM в WinAvr

Сообщение blindman » 29 окт 2009, 16:23

test.s и test.S - это разные имена файлов. То, что Windows их не различает - это его проблемы. avr-gcc по-разному обрабатывает файлы .S и .s. Первый исходник на ассемблере, второй - промежуточный ассемблерный код, сгенерированный компилятором. И в Makefile они по-разному обрабатываются. Если заглянешь в Makefile - там об этом есть предупреждение. Переименуй файл в sw_uart.S.
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Команды на ASM в WinAvr

Сообщение Drunya » 29 окт 2009, 16:43

Спасибо, все понял. С этим понятно, только осталось вот что :(
Код: Выделить всёРазвернуть
Rxbyte   = 19         ;Received data
. . .
ror     Rxbyte
. . .
-------------------------------------------------------------
sw_uart.S:99: Error: register name or number from 0 to 31 required
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Команды на ASM в WinAvr

Сообщение blindman » 29 окт 2009, 16:55

Ага, тоже заметил. Похоже на баг в ассемблере - все что начинается с R он воспринимает как имя регистра
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Команды на ASM в WinAvr

Сообщение Drunya » 29 окт 2009, 17:00

То есть просто имя переменной заменить?

up
Откомпилилось. Теперь не линкуется :cry:
LineTracer.rar
(8.4 КиБ) Скачиваний: 9
Может есть еще способы как си с асмом в GCC состыковать?
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Команды на ASM в WinAvr

Сообщение blindman » 29 окт 2009, 17:21

Нормально всё линкуется

Код: Выделить всёРазвернуть
andrey@debian:/tmp/LineTracer$ make

-------- begin --------
avr-gcc (GCC) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


Compiling C: main.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=2000000UL -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o

Compiling C: stepper.c
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=2000000UL -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./stepper.lst  -std=gnu99 -MMD -MP -MF .dep/stepper.o.d stepper.c -o stepper.o

Assembling: sw_uart.S
avr-gcc -c -mmcu=atmega8 -I. -x assembler-with-cpp -DF_CPU=2000000 -Wa,-adhlns=./sw_uart.lst,-gstabs,--listing-cont-lines=100 sw_uart.S -o sw_uart.o

Linking: linetracer.elf
avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=2000000UL -O2 -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -MMD -MP -MF .dep/linetracer.elf.d main.o stepper.o sw_uart.o --output linetracer.elf -Wl,-Map=linetracer.map,--cref     -lm

Creating load file for Flash: linetracer.hex
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock linetracer.elf linetracer.hex

Creating load file for EEPROM: linetracer.eep
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \
   --change-section-lma .eeprom=0 --no-change-warnings -O ihex linetracer.elf linetracer.eep || exit 0

Creating Extended Listing: linetracer.lss
avr-objdump -h -S -z linetracer.elf > linetracer.lss

Creating Symbol Table: linetracer.sym
avr-nm -n linetracer.elf > linetracer.sym

Size after:
AVR Memory Usage
----------------
Device: atmega8

Program:     470 bytes (5.7% Full)
(.text + .data + .bootloader)

Data:         18 bytes (1.8% Full)
(.data + .bss + .noinit)



-------- end --------

andrey@debian:/tmp/LineTracer$


Сообщения об ошибках приводи, "не линкуется" - мало о чём говорит
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Команды на ASM в WinAvr

Сообщение Drunya » 29 окт 2009, 18:13

С тех пор я уже много переделал, теперь и у меня линкуется, хоть и криво. blindman, извини за навязчивость, но раз уж ты тут, помоги, пожалуйста :) . С вопросом стыковки асма с си встречаюсь впервые, сижу читаю avr-libc user manual, экзамплы. Но, если чесно, не очень понимаю как передавать в асмовские функции параметры из сишных функций. Понимаю, что через регистры, но не понимаю как. В прицепе проект, если не сложно, глянь что я там накрутил и объясни как надо :oops:
LineTracer.rar
(8.5 КиБ) Скачиваний: 14
Или было бы очень хорошо, если какую-нибудь литературу по этому вопросу посоветуешь - статейку там или доку.
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Команды на ASM в WinAvr

Сообщение Drunya » 29 окт 2009, 19:56

Так лучше?
Вообщем проблема данная решилась (точнее будет решаться) заменой асемблерного файла на сишный, с функциями с асмовыми вставками. И все дела. А то пока оно мне не по зубам видимо.
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Команды на ASM в WinAvr

Сообщение blindman » 30 окт 2009, 07:51

В мануале всё расписано вообще то.

Вкратце примерно так.

Если собираешься вызывать подпрограммы на ассемблере из си, надо в первую очередь изучить что такое call-clobbered registers и call-saved registers (их ещё называют volatile и non-volatile). Первые подпрограмма может произвольно изменять, вторые она обязана сохранять неизменными. Сохранять надо r2-r17, r28-r29. r1 перед выходом из подпрограммы надо обнулить.


Передача параметров. Параметры передаются в регистрах r25-r8, в регистре с бОльшим номером - старший байт, под каждый параметр выделяется количество регистров, кратное 2. Если передаётся параметр в 1 байт, один регистр из пары не используется. Например, если функция объявлена как func(char x), то x передаётся в r25. func(int x) - x передаётся в r24:r25 (в r25 старший байт), func(int x, char y) - x передаётся в r24:r25, y - в r23. func(сhar x, long y, char z, int k) - x передаётся в r24, y - в r20:r23, z - в r18, k - в r16:r17. Если r25-r8 недостаточно для всех аргументов, то "лишние" передаются через стэк. Например при вызове void a(uint32_t x, uint32_t y, uint32_t z, uint32_t i, uint32_t j) x будет в r22:r25, y - r18:r21, z - r14:r17, i - r10:r13, а стэк будет выглядеть так:

Код: Выделить всёРазвернуть
; SP - это указатель стэка
SP:
SP+1: ret0 ; адрес возврата - младший байт
SP+2: ret1 ; адрес возврата - старший байт
SP+3: j0  ; j - младшие 8 бит
SP+4: j1
SP+5: j2
SP+6: j3 ; j - старшие 8 бит


Возврат результата. 8 бит в r24 (не r25!), 16 бит в r25:r24, до 32 бит в r22-r25, до 64 бит в r18-r25. Если возвращаемое значение более 64 бит, то к списку параметров в начале добавляется ещё один - 16-битный указатель на область памяти, в которую поместить результат (всегда в r24:r25, и изменять эти регистры в подпрограмме нельзя).
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Команды на ASM в WinAvr

Сообщение Drunya » 30 окт 2009, 12:12

Спасибо, blindman! :friends: Теперь знаю в каком направлении искать. Изучу обязательно :wink:
Глюк по-немецки означает "счастье"...
Аватара пользователя
Drunya
 
Сообщения: 196
Зарегистрирован: 05 июн 2007, 12:20
Откуда: Киев
прог. языки: C/C++, ASSEMBLER

Re: Команды на ASM в WinAvr

Сообщение boez » 30 окт 2009, 12:35

r1 именно обнулить при выходе, а так можно трогать? Я считал что наоборот, туда при старте кладется 0 и любая процедура может быть уверена в том что там 0.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20