[an error occurred while processing this directive]
Так нельзя - эти имена уже определены в хидерах, у них уже есть ДРУГИЕ значения - 7,6,3 cjjndtncndtyyj
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =AVR= 24 марта 2006 г. 16:49
В ответ на: To AVR. Что если пойти еще дальше и сделать такие назначения в заголовке отправлено GM 24 марта 2006 г. 15:44

Весь трагизЬм в том, что так ПРИДУМАНА система команд AVR - производитель (Атмел) именно в таком виде опубликовал ее, и по такому же дурному принципу реализовал свой ассемблер, а за ним это повторили и другие. На самом деле в АВР, как и в некоторых других МК, ЕСТЬ гомогенное непрерывное битовое пространство в/в, и никто не мешал объявить его таким же, как в собратьях - х51, например. Тогда манипуляции отдельным битом производились бы командами

SBI/CBI/SBIS/SBIC ioreg.bitnum

или просто SBI/CBI/SBIS/SBIC absbitaddr.

Но из-за скупости разработчиков АВР, решивших любой ценой упихать всю систему команд (кроме нескольких команд длинных переходов) в 16-битное слово, таких бит-адресуемых позиций всего 256 бит (да и в х51 их всего 128), полноценное адресное пространство i/o тоже маленькое (32 байта), и с ростом бортовой периферии пришлось отображать новые i/o на адреса RAM, с которой АВР умеет делать только байтовые пересылки регистр-память-регистр. Вот тут-то неожиданно и проявилась дурная генетика - так как отдельные бит-позиции имеют "адреса" только в диапазоне 0..7, то якобы появилась возможность воспользоваться теми же битовыми именами и в регистровых операциях - вместо SBI ioreg,bitname использовать такую связку:


LDS gpreg,ioreg
SBGR gpreg,bitname
STS ioreg,gpreg

Но не тут-то было - в архитектуре (и системе команд) АВР нет такой команды - установить/сбросить отдельный бит в РОН (я выше употребил несуществующую мнемонику SBGR). Есть лишь кманды ANDI gpreg,const и ORI gpreg,const - и в них const - уже не номер бита, а 8-битная константа, с которой РОНу будет сделан AND или OR соответственно. Вот тут и начались извращения по инлайн-сборке групповых масок посредством нагромождений типа:


ldi tmp,(1 << TXEN0)|(1 << RXEN0)|(1 << RXCIE0)

Еще раз подчеркну, что битовым символам в поставляемых с компиляторами/ассемблерами хидерах присвоены значения, равные позициям этих бит в байте, т.е. от 0 до 7. Тем самым значения битовых символов утратили уникальность, и многократно повторяются для каждого следующего регистра:


; ADCSRA - The ADC Control and Status register
.equ ADPS0 = 0 ; ADC Prescaler Select Bits
.equ ADPS1 = 1 ; ADC Prescaler Select Bits
.equ ADPS2 = 2 ; ADC Prescaler Select Bits
.equ ADIE = 3 ; ADC Interrupt Enable
.equ ADIF = 4 ; ADC Interrupt Flag
.equ ADFR = 5 ; ADC Free Running Select
.equ ADSC = 6 ; ADC Start Conversion
.equ ADEN = 7 ; ADC Enable

; UCSRA - USART Control and Status Register A
.equ MPCM = 0 ; Multi-processor Communication Mode
.equ U2X = 1 ; Double the USART transmission speed
.equ UPE = 2 ; Parity Error
.equ DOR = 3 ; Data overRun
.equ FE = 4 ; Framing Error
.equ UDRE = 5 ; USART Data Register Empty
.equ TXC = 6 ; USART Transmitt Complete
.equ RXC = 7 ; USART Receive Complete

; UCSRB - USART Control and Status Register B
.equ TXB8 = 0 ; Transmit Data Bit 8
.equ RXB8 = 1 ; Receive Data Bit 8
.equ UCSZ2 = 2 ; Character Size
.equ TXEN = 3 ; Transmitter Enable
.equ RXEN = 4 ; Receiver Enable
.equ UDRIE = 5 ; USART Data register Empty Interrupt Enable
.equ TXCIE = 6 ; TX Complete Interrupt Enable
.equ RXCIE = 7 ; RX Complete Interrupt Enable

Соответственно, если начать переделывать хидеры, как ты предлагаешь, то групповые бит-операции станут несколько более читабельными, но для обращения к отдельному биту придется городить обратный огород, чтобы из 0х80 сделать 7 - типа SBI ioreg,log2(ADEN). Это, конечно, компактнее, но переписывать все хидеры никто ради этого не станет. Как говорится - нет в жизни полного счастья :)

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru