Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Опытный кот
Аватара пользователя
Сообщения: 859
Зарегистрирован: Ср апр 13, 2011 02:13:43

Сообщение ApTu(T »

Кто знает, что делать с ошибкой constant value required?
На вторую строку ругается:

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

waitForJ:
    sbis    USBIN, USBMINUS ;1 [40] wait for D- == 1
    rjmp    waitForJ        ;2
Гуглил, гуглил, вроде типа не объявлено что-то.
Я так подозреваю, что это USBIN. Так как не нашел его дефайн в проекте...
Реклама
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3636754#p3636754"]alex68md, если так, как написали Вы, то не надо. Надо если так:

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

asm volatile("sbi 0x18,0x07\n\t \
              sbi 0x18,0x06");
[/uquote]

а третья \ тут опечатка ? так должно быть как далее

asm volatile("sbi 0x18,0x07\n\t
sbi 0x18,0x06");

или всетаки как у вас ?
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

alex68md, как у меня будет работать с любым компилятором, так как многострочный литерал преобразуется в однострочный средствами препроцессора С. Как у Вас - зависит уже от компилятора и его параметров.
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

а перед третьим \ должен быть пробел?

т.е. это универсальный вариант ?

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

asm volatile("sbi 0x18, 7\n\t \
              sbi 0x18, 6\n\t \
              sbi 0x18, 5");
это тоже?

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

asm volatile("sbi 0x18, 7\n\t;
              sbi 0x18, 6\n\t;
              sbi 0x18, 5");
а это не всегда ?

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

asm volatile("sbi 0x18, 7\n\t
              sbi 0x18, 6\n\t
              sbi 0x18, 5");
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

alex68md, второй вариант, вообще не будет работать, так как после табуляции в нем символ комментария, а значит и весь текст до следующего \n будет воспринят, как комментарий, а не как команда.
Я же уже писал, что первый вариант будет работать всегда. Третий - если компилятор поддерживает такую многострочную запись строковых литералов.
Реклама
Грызет канифоль
Сообщения: 278
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

а можно ссылку какуюто с примерами про этот пустой литерал \
?

а то чёто както непонятно \нет я могу тупо повторять этот тимплейт и всё будет ок но хочеться больше понимания

так а пробел нужен или можно без ?
sbi port,pin \n\t\
sbi port,pin \n\t\
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

alex68md, достаточно почитать стандарт языка C. Да хоть С11 пункт 6.4.5.
Стандарт С внутри строкового литерала переход на новую строку не допускает, хотя многие компиляторы это позволяют.

Там же в подпукте 2 пункта 5.1.1.2 четко сказано, обратный слеш непосредственно предшествующий переходу на новую строку будет удален вместе с этим переходом, формируя одну логическую строку из нескольких физических.

Отсюда же следует, что пробел перед последним обратным слешем не обязателен, но заметно повышает читабельность.
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

Народ, кто-нибудь пробовал сдвиг многобайтной величины на 4 бита вправо реализовывать через операцию SWAP? Можно ли выжать чутка быстродействия по сравнению с реализацией в лоб через RORы?

Добавлено after 10 minutes 48 seconds:
Судя по всему можно:
Спойлер

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

;============
mov     tmp1,   val1
mov     tmp2,   val2
mov     tmp3,   val3
lsr     tmp3
ror     tmp2
ror     tmp1
lsr     tmp3
ror     tmp2
ror     tmp1
lsr     tmp3
ror     tmp2
ror     tmp1
lsr     tmp3
ror     tmp2
ror     tmp1
;============
mov     tmp1,   val1
swap    tmp1
andi    tmp1,   0x0F
mov     tmp2,   val2
swap    tmp2
eor     tmp1,   tmp2
andi    tmp2,   0x0F
eor     tmp1,   tmp2
mov     tmp3,   val3
swap    tmp3
eor     tmp2,   tmp3
andi    tmp3,   0x0F
eor     tmp2,   tmp3
;============
Добавлено after 7 minutes 12 seconds:
Правда выигрыш всего в две операции, и он не растёт, если наращивать число байт в величине.
Друг Кота
Аватара пользователя
Сообщения: 15792
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Это в пределах одного байта красиво смотрится.
А при многобайтовой цепочке придется промежуточный регистр да маски применить.
По итогу может и чуток быстрее, но сожрет дополнительные ресурсы в виде буфер-регистра.
:dont_know:
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

[uquote="BOB51",url="/forum/viewtopic.php?p=3658411#p3658411"]...но сожрет дополнительные ресурсы в виде буфер-регистра.
:dont_know:[/uquote]Так вон, смотрите под катом: сдвинул три байта без буферов вообще. Правда мне нужен был и результат сдвига, и изначальная величина, поэтому у меня не занято лишних регистров. Если сдвигать на месте, то может и не получиться.

Добавлено after 6 minutes 50 seconds:
Впрочем, получится. На месте свапами тоже прекрасно шифтится:
Спойлер

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

;============
lsr     val3
ror     val2
ror     val1

lsr     val3
ror     val2
ror     val1

lsr     val3
ror     val2
ror     val1

lsr     val3
ror     val2
ror     val1
;============
swap    val1
andi    val1,   0x0F

swap    val2
eor     val1,   val2
andi    val2,   0x0F
eor     val1,   val2

swap    val3
eor     val2,   val3
andi    val3,   0x0F
eor     val2,   val3
;============
Родился
Сообщения: 3
Зарегистрирован: Пт июл 12, 2019 16:12:19

Сообщение motorist82 »

Добрый день! Помогите пожалуйста!
Имеем пятибайтную константу, например

.equ NAME=0xE7E6E5E4E3

Как из неё взять старший байт для загрузки в РОН?
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

motorist82, боюсь, никак. Я просто не знаю 64-битного ассемблера для AVR. А 32-х битный с такой константой ничего сделать не сможет.
Модератор
Аватара пользователя
Сообщения: 19102
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

вот так:
ldi R16, byte5(NAME)
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Родился
Сообщения: 3
Зарегистрирован: Пт июл 12, 2019 16:12:19

Сообщение motorist82 »

[uquote="Starichok51",url="/forum/viewtopic.php?p=3665301#p3665301"]вот так:
ldi R16, byte5(NAME)[/uquote]

Так не получится. Нет такой функции byte5. Придется сохранять константу в Flash. Хотя студия не ругается на

.equ Name= 0xE7E6E5E4E3

Наверное все что свыше 32 бит просто игнорируется.
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Starichok51, А что это за ассемблер? Гнушный as меня конкретно посылает фразой "Error: bignum invalid"
Ну и про byte5 он ничего не знает.

Добавлено after 1 minute 30 seconds:
motorist82, пока константа в .equ - она для ассемблера просто строка для подстановки. Разбираться с ее содержимым он будет только при использовании имени из .equ
Родился
Сообщения: 3
Зарегистрирован: Пт июл 12, 2019 16:12:19

Сообщение motorist82 »

Спасибо
Вот макрос который суёт константу во Flash:

#define Address(v,w,x,y,z) NRF24_Addr: .db $##z, $##y, $##x, $##w, $##v

Используем так:

Address (E7,E6,E5,E4,E3)

Достаём из Flash:

ldZ (NRF24_Addr*2)
ldi R17, 5

Get_NRFAddr_Loop: lpm R16, Z+
dec R17
; Тут сохраняем R16 в какой-нибудь буфер для дальнейшего использования
brne Get_NRFAddr_Loop
[/code]
Модератор
Аватара пользователя
Сообщения: 19102
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

извиняюсь, я это "с потолка" взял.
byte4 работает, и я решил, что и byte5 будет работать.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

[uquote="motorist82",url="/forum/viewtopic.php?p=3665189#p3665189"].equ NAME=0xE7E6E5E4E3

Как из неё взять старший байт для загрузки в РОН?[/uquote]
А выражение

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

(NAME >> 32) & 0xFF
не взлетит?
Модератор
Аватара пользователя
Сообщения: 19102
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

если сделать
(NAME >> 32)
то
& 0xFF
уже не нужно делать.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

[uquote="B@R5uk",url="/forum/viewtopic.php?p=3666150#p3666150"]А выражение

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

(NAME >> 32) & 0xFF
не взлетит?[/uquote] Не взлетит. AVR-студия заносит 0xFF. Если через BYTE5, то заносит 0x00.

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

.equ	NAME=996011271395
;.equ	BYTE5=NAME/4294967296
;.equ NAME=0xE7E6E5E4E3

.cseg
RESET:
	RJMP	START
CONST:
;.DB	0,BYTE5,BYTE4(NAME),BYTE3(NAME),BYTE2(NAME),BYTE1(NAME)
;.DB	0,NAME >> 32,BYTE4(NAME),BYTE3(NAME),BYTE2(NAME),BYTE1(NAME)
.DB		0,(NAME >> 32) & 0xFF,BYTE4(NAME),BYTE3(NAME),BYTE2(NAME),BYTE1(NAME)

START:
	LDI	ZH,HIGH(CONST*2)
	LDI	ZL,LOW(CONST*2)

	LPM	R10,Z+
	LPM	R11,Z+
	LPM	R12,Z+
	LPM	R13,Z+
	LPM	R14,Z+
	LPM	R15,Z


	RJMP	START
Ответить

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