Перейти к содержанию
    

Вопрос по побитовым операциям

On 8/1/2024 at 10:13 PM, v05 said:

Это результат. А каким образом достигается?

Ну, и вы тогда дайте ссылки на ваши источники.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@dimka76 Вы вторую часть неправильно скопировали.

SBR/CBR - это псевдоинструкции, транслируются в ANDI/ORI, выполняются за один такт.

SBI/CBI выполняются за два такта, атомарные, по идее не должны быть чтение-изменение запись, оно же RISC, да  пришлось бы делать три такта, конвейера ведь нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/1/2024 at 10:48 PM, vov4ick said:

@dimka76 Вы вторую часть неправильно скопировали.

SBR/CBR - это псевдоинструкции, транслируются в ANDI/ORI, выполняются за один такт.

SBI/CBI выполняются за два такта, атомарные, по идее не должны быть чтение-изменение запись, оно же RISC, да  пришлось бы делать три такта, конвейера ведь нет.

Да, в обоих цитатах заголовок был одинаковый - SBI. Хотя вторая цитата относится к SBR.
Исправил.

Или вы о другом ?

image.thumb.png.1610f83765f4bd59306bd8d70450b767.png

image.thumb.png.ba3e9e0beff0536ce9cc59c1e033b0e0.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/1/2024 at 10:36 PM, dimka76 said:

Ну, и вы тогда дайте ссылки на ваши источники.

Берём первый попавшийся даташит, например Atmel-42735B-ATmega328/P_Datasheet_Complete-11/2016. Смотрим 4.12.1.  USART I/O Data Register 0:

Quote

The receive buffer consists of a two level FIFO. The FIFO will change its state whenever the receive
buffer is accessed. Due to this behavior of the receive buffer, do not use Read-Modify-Write instructions
(SBI and CBI) on this location. Be careful when using bit test instructions (SBIC and SBIS), since these
also will change the state of the FIFO.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На уровне шины довольно расточительно делать отдельные линии управления для каждого бита данных (даже для 8 бит), поэтому так или иначе чтение будет. Просто это чтение не явное с точки зрения порождения инструкций компилятора.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/2/2024 at 2:02 AM, v05 said:

Берём первый попавшийся даташит, например Atmel-42735B-ATmega328/P_Datasheet_Complete-11/2016. Смотрим 4.12.1.  USART I/O Data Register 0:

ОК.
Но что же они в описании инструкций об этом ничего не указали.

On 8/2/2024 at 7:34 AM, Arlleex said:

На уровне шины довольно расточительно делать отдельные линии управления для каждого бита данных (даже для 8 бит), поэтому так или иначе чтение будет. Просто это чтение не явное с точки зрения порождения инструкций компилятора.

Но например в STM32 для GPIO пошли на расточительство.

И bit banding. Там вообще на всю ОЗУ и на всю периферию распространяется.

Или тут тоже обманули и через чтение-модификацию-запись сделали ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что STM32 не стали наступать на грабли. А во-вторых, потому что у архитектуры ARM нет прямого доступа к регистрам вообще. И регистры BSRR/BRR представляют собой 16-разряднып лог. элементы с функцией  OR и NOT-AND соответственно

Бит-бандинг реализован не во всех  семействах STM32, в линейках F7/H7 его уже нет, как раз по причине усложнения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/2/2024 at 9:00 AM, dimka76 said:

Но что же они в описании инструкций об этом ничего не указали.

ХЗ. Они указали это в описании портов. Смотрим в этом же даташите:
 

Quote

18.  I/O-Ports
18.1.  Overview
All AVR ports have true Read-Modify-Write functionality when used as general digital I/O ports. This
means that the direction of one port pin can be changed without unintentionally changing the direction of
any other pin with the SBI and CBI instructions.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, dimka76 сказал:

Но например в STM32 для GPIO пошли на расточительство.

Такое есть не только в STM32, но и во множестве других МК. И не только для GPIO, но и для многих других регистров периферии.

4 часа назад, dimka76 сказал:

И bit banding. Там вообще на всю ОЗУ и на всю периферию распространяется.

Вроде как не во всех МК bit-band регион-ы покрывают всю периферию и ОЗУ.

4 часа назад, dimka76 сказал:

Или тут тоже обманули и через чтение-модификацию-запись сделали ?

Не знаю как именно там реализовано, но вряд-ли это чтение-модификация-запись через ядро. Проверил сейчас на STM32F103VE: запись в bit-band регион занимает == 1 такт (по показаниям J-Link). Либо в пакете записи, отправляемом по шине к контроллеру ОЗУ, указывается сразу и битовая маска; либо это всё-таки "чтение-модификация-запись", но каким-то образом укладывающаяся в 1 такт. Например: саму операцию "чтение-модификация-запись" может выполнять "буфер записи", через который идёт запись в ОЗУ. А "буфер записи" может работать частично параллельно с выполнением инструкций.

Ещё как вариант: На время bit-band "чтение-модификация-запись" ядру может выставляться halt-сигнал, и поэтому счётчик тактов не инкрементируются, хотя в реале вся операция занимает несколько тактов.

 

PS: Тоже ранее уже задумывался не раз над этим вопросом (о реальной длительности и механизме bit-band), но всё никак не доходят руки разгуглить этот момент.....  :unknw:

PPS: Склоняюсь скорее к тому, что запись в bit-band регион - это функция "write buffer"-а.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS: Протестил. Код:

               PUBLIC   TestBB
               THUMB
TestBB:        LDR      R2, =42220194h
               MRS      R12, PRIMASK
               CPSID    I
               MOVS     R3, #100
               MOVS     R0, #0
               MOVS     R1, #1
TestBB_01:     SUBS     R3, R3, #1
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               STR      R0, [R2]
               STR      R1, [R2]
               BNE      TestBB_01
               MSR      PRIMASK, R12
               BX       LR

На STM32F103VE выполняется из ОЗУ за 23790 тактов. Адрес 42220194h - это область bit-band GPIO.

Получается, что одна STR занимает = (23790-2*100)/100/30 = ~7.86 тактов!

Если адрес 42220194h заменить на адрес обычной ОЗУ, то выполнение длится уже всего = 5900 тактов. Т.е. одна STR = (5900-2*100)/100/30 = ~1.9 такта.

 

Можно сделать вывод, что значительно большее время в первом случае - результат выполнения операций чтений-модификаций-записей "буфером записи".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/2/2024 at 2:37 PM, jcxz said:

 

Получается, что одна STR занимает = (23790-2*100)/100/30 = ~7.86 тактов!

Вы время перехода не учли.

2*100 - это время декремента счетчика. Я правильно понимаю ?

У вас АРВ1 на частоте ядра работает ? (на этой шине GPIO сидит)

Но в любом случае документация гCortex™-M3 Revision: r1p1 Technical Reference Manual (страница 18-7) говорит

Quote

Even a stalled STR normally only take two cycles, because of the store buffer (bit band, data segment, and unaligned).
 

 

On 8/2/2024 at 2:37 PM, jcxz said:

Если адрес 42220194h заменить на адрес обычной ОЗУ, то выполнение длится уже всего = 5900 тактов. Т.е. одна STR = (5900-2*100)/100/30 = ~1.9 такта.

А если этот адрес заменить на GPIOx_BSRR, то сколько получится ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, dimka76 сказал:

Вы время перехода не учли.

2*100 - это время декремента счетчика. Я правильно понимаю ?

Нет. Это время декремента + минимальное время перехода. Так как переменная часть времени перехода неизвестна, то я добавил в цикл множество команд STR. Чтобы минимизировать ошибку он неучтённой части времени перехода.

1 час назад, dimka76 сказал:

У вас АРВ1 на частоте ядра работает ? (на этой шине GPIO сидит)

Не помню. Но точно APB1 работает на макс. допустимой частоте.

1 час назад, dimka76 сказал:

А если этот адрес заменить на GPIOx_BSRR, то сколько получится ?

Я делал тест на скорую руку. По идее надо сравнить его время выполнения со временем записи в ту же самую периферию, но в не-bitband область. Попозже сделаю, проверю. Сейчас я далеко от STM32F103, а на XMC4xxx bitband-а нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 8/2/2024 at 4:47 PM, jcxz said:

Чтобы минимизировать ошибку он неучтённой части времени перехода.

А как насчет ?

Even a stalled STR normally only take two cycles, because of the store buffer (bit band, data segment, and unaligned).

А то у вас что-то больно много получилось - почти 8 тактов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, dimka76 сказал:

Но например в STM32 для GPIO пошли на расточительство.

И bit banding. Там вообще на всю ОЗУ и на всю периферию распространяется.

Не совсем понял про GPIO.

А про bit-banding - то же самое - на уровне шины слово ОЗУ читается целиком, делается операция RMW.

С точки зрения прикладного уровня - атомарно. С точки зрения системного уровня - нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...