dimka76 59 1 августа Опубликовано 1 августа · Жалоба On 8/1/2024 at 10:13 PM, v05 said: Это результат. А каким образом достигается? Ну, и вы тогда дайте ссылки на ваши источники. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 1 августа Опубликовано 1 августа · Жалоба @dimka76 Вы вторую часть неправильно скопировали. SBR/CBR - это псевдоинструкции, транслируются в ANDI/ORI, выполняются за один такт. SBI/CBI выполняются за два такта, атомарные, по идее не должны быть чтение-изменение запись, оно же RISC, да пришлось бы делать три такта, конвейера ведь нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 1 августа Опубликовано 1 августа · Жалоба On 8/1/2024 at 10:48 PM, vov4ick said: @dimka76 Вы вторую часть неправильно скопировали. SBR/CBR - это псевдоинструкции, транслируются в ANDI/ORI, выполняются за один такт. SBI/CBI выполняются за два такта, атомарные, по идее не должны быть чтение-изменение запись, оно же RISC, да пришлось бы делать три такта, конвейера ведь нет. Да, в обоих цитатах заголовок был одинаковый - SBI. Хотя вторая цитата относится к SBR. Исправил. Или вы о другом ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vov4ick 39 1 августа Опубликовано 1 августа · Жалоба Только что, dimka76 сказал: Или вы о другом ? Нет, то есть да, всё хорошо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v05 1 1 августа Опубликовано 1 августа · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 2 августа Опубликовано 2 августа · Жалоба На уровне шины довольно расточительно делать отдельные линии управления для каждого бита данных (даже для 8 бит), поэтому так или иначе чтение будет. Просто это чтение не явное с точки зрения порождения инструкций компилятора. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 2 августа Опубликовано 2 августа · Жалоба 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. Там вообще на всю ОЗУ и на всю периферию распространяется. Или тут тоже обманули и через чтение-модификацию-запись сделали ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 81 2 августа Опубликовано 2 августа · Жалоба Потому что STM32 не стали наступать на грабли. А во-вторых, потому что у архитектуры ARM нет прямого доступа к регистрам вообще. И регистры BSRR/BRR представляют собой 16-разряднып лог. элементы с функцией OR и NOT-AND соответственно Бит-бандинг реализован не во всех семействах STM32, в линейках F7/H7 его уже нет, как раз по причине усложнения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v05 1 2 августа Опубликовано 2 августа · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 2 августа Опубликовано 2 августа · Жалоба 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), но всё никак не доходят руки разгуглить этот момент..... PPS: Склоняюсь скорее к тому, что запись в bit-band регион - это функция "write buffer"-а. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 2 августа Опубликовано 2 августа · Жалоба 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 такта. Можно сделать вывод, что значительно большее время в первом случае - результат выполнения операций чтений-модификаций-записей "буфером записи". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 2 августа Опубликовано 2 августа · Жалоба 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, то сколько получится ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 231 2 августа Опубликовано 2 августа · Жалоба 1 час назад, dimka76 сказал: Вы время перехода не учли. 2*100 - это время декремента счетчика. Я правильно понимаю ? Нет. Это время декремента + минимальное время перехода. Так как переменная часть времени перехода неизвестна, то я добавил в цикл множество команд STR. Чтобы минимизировать ошибку он неучтённой части времени перехода. 1 час назад, dimka76 сказал: У вас АРВ1 на частоте ядра работает ? (на этой шине GPIO сидит) Не помню. Но точно APB1 работает на макс. допустимой частоте. 1 час назад, dimka76 сказал: А если этот адрес заменить на GPIOx_BSRR, то сколько получится ? Я делал тест на скорую руку. По идее надо сравнить его время выполнения со временем записи в ту же самую периферию, но в не-bitband область. Попозже сделаю, проверю. Сейчас я далеко от STM32F103, а на XMC4xxx bitband-а нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 59 2 августа Опубликовано 2 августа · Жалоба 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 тактов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 172 2 августа Опубликовано 2 августа · Жалоба 10 часов назад, dimka76 сказал: Но например в STM32 для GPIO пошли на расточительство. И bit banding. Там вообще на всю ОЗУ и на всю периферию распространяется. Не совсем понял про GPIO. А про bit-banding - то же самое - на уровне шины слово ОЗУ читается целиком, делается операция RMW. С точки зрения прикладного уровня - атомарно. С точки зрения системного уровня - нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться