dOb 10 November 7 Posted November 7 · Report post Да, для программиста - являются. А для работы с периферией? Ведь на самом деле происходит два обращения к регистру. Сначала считывается целиком, потом записывается с изменённым одним битом. Может ли за интервал между ими произойти коллизия? Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 November 7 Posted November 7 · Report post 30 минут назад, dOb сказал: Ведь на самом деле происходит два обращения к регистру Это вы сами придумали? Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 November 7 Posted November 7 · Report post 46 минут назад, VladislavS сказал: Это вы сами придумали? Ну, технически, как по-Вашему, выглядит доступ с точки зрения регистра? 1 час назад, dOb сказал: Может ли за интервал между ими произойти коллизия? На уровне шины это две отдельных операции чтения и записи. AMBA не умеет объединять транзакции в разные стороны в одну Burst (неразрывную), поэтому, гипотетически, любой другой мастер (например, DMA), вполне может нарушить атомарность доступов. Хм. А ведь возможно я и не прав. Это для APB нет стандартизированных сигналов блокировки шины. А вот для AHB такой сигнал вполне себе есть - HMASTLOCK. Поэтому, некоторую гарантию можно иметь для AHB-периферии. Но я не вижу причин полагаться на то, что доступ бит-бэндом к APB-периферии (включая способы доступа через шинные мосты AHB-APB) будет атомарным при конкурентном доступе разными шинными мастерами. Quote Share this post Link to post Share on other sites More sharing options...
VladislavS 46 November 7 Posted November 7 · Report post 43 минуты назад, Arlleex сказал: Ну, технически, как по-Вашему, выглядит доступ с точки зрения регистра? Выглядеть он может поразному. Никто не запрещает адресовать каждый бит отдельно и производить непосредственную запись в него. Ну разве что увеличение количества транзисторов... Заглянул в "ARM® Cortex®‑M4 Processor Technical Reference Manual" и моментом нашёл ответ на все вопросы. Действительно, осуществляется атомарное R-M-W. ТС мог бы это за 1 мин найти тоже. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 November 7 Posted November 7 · Report post 5 минут назад, VladislavS сказал: Выглядеть он может поразному. Никто не запрещает адресовать каждый бит отдельно и производить непосредственную запись в него. Ну разве что увеличение количества транзисторов... Ды нет. Процессор ведь вполне конкретный (хотя я предполагаю, т.к. раздел STM, а по большей части это либо Cortex-M3, либо M4), у него есть спецификация, в этой спецификации указаны в т.ч. версии и модели шинной архитектуры - и это AMBA 3. Поэтому никаких фокусов с битовыми адресациями в этих процессорах быть не может. В отличие от примитивных AVR, например, с инструкциями ядра, гарантирующими атомарность: sbi/cbi и т.д. Quote Share this post Link to post Share on other sites More sharing options...
jcxz 344 November 7 Posted November 7 · Report post 2 часа назад, dOb сказал: А для работы с периферией? Уточните: Атомарными с точки зрения кого? С точки зрения доступа от одного и того же ядра? С точки зрения доступа от разных ядер? С точки зрения доступа от разных bus-masters (DMA, etc.)? С точки зрения работы внутренней кухни самой целевой периферии? И о каком МК идёт речь? Quote Share this post Link to post Share on other sites More sharing options...
EdgeAligned 122 November 8 Posted November 8 · Report post ...ну и скажу, что в F0, F7, H7 от битбандинга отказались вовсе. Видимо, оное не шибко то нужно Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 November 8 Posted November 8 · Report post Только что, EdgeAligned сказал: ...ну и скажу, что в F0, F7, H7 от битбандинга отказались вовсе. Видимо, оное не шибко то нужно Интересно тут другое: как часто кто-то этим вообще пользовался и какой в этом был прок. Лично мне ни разу не пригодилось. Quote Share this post Link to post Share on other sites More sharing options...
Obam 50 November 8 Posted November 8 · Report post ...ну и скажу, что в F0, F7, H7 от битбандинга отказались вовсе. Видимо, оное не шибко то нужно CM0+ - "недоразумение": "ни богу - свечка, ни чёрту - кочерёжка" - не показатель, IMHO. CM7 - "не царское дело" из ядра битодрыжствовать ;-) как часто кто-то этим вообще пользовался и какой в этом был прок. На CM3\CM4 - бывало, а прок? Feature есть, от использования хуже не становится - а вот могу! (((-8Ж Quote Share this post Link to post Share on other sites More sharing options...
EdgeAligned 122 November 9 Posted November 9 · Report post Пробовать - пробовал. Для установки/сброса битов SPE, CEN, DMA_EN и тп. Но чтобы вот пользоваться - ни разу. За одну операцию возможна манипуляция только с одним битом. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 November 9 Posted November 9 · Report post 3 часа назад, EdgeAligned сказал: Пробовать - пробовал. Для установки/сброса битов SPE, CEN, DMA_EN и тп. Ну так для этих битов битбэнд не нужен. Вообще чтение регистров не нужно. Quote Share this post Link to post Share on other sites More sharing options...
EdgeAligned 122 November 9 Posted November 9 · Report post Почему чтение регистров не нужно? Вкл/выкл без изменения остальных настроек в этом же регистре - вполне нормальная вещь. Особенно хорошо это видно в регистрах RCC. Теоретически битбандинг для этого там и нужен. Но на практике я не использовал - не стал заморачиваться. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 November 9 Posted November 9 · Report post 17 минут назад, EdgeAligned сказал: Почему чтение регистров не нужно? Вкл/выкл без изменения остальных настроек в этом же регистре - вполне нормальная вещь. Особенно хорошо это видно в регистрах RCC. Теоретически битбандинг для этого там и нужен. Но на практике я не использовал - не стал заморачиваться. RCC ресурс разделяемый. А в SPI/DMA и т.д. почти всегда одной записью можно обойтись. Quote Share this post Link to post Share on other sites More sharing options...
EdgeAligned 122 November 9 Posted November 9 · Report post Не в том дело. Например, приостановка таймера: void Disable() { ... &= ~TIM_CR1_CEN; }, возобновление счета: void Enable() { ... |= TIM_CR1_CEN}. В противном случае придется указывать все остальные используемые биты этого регистра. С SPI дело еще хуже - там настроек в одном регистре куда больше, и когда таскаешь их все по тексту, легко ошибиться. А выключать SPI может понадобиться для экономии тока потребления. Бывают же устройства и на батарейном питании тоже. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 316 November 9 Posted November 9 · Report post Так таскаемые биты проще обозвать константой и записывать TIM->CR1 = TIM_CR1 | TIM_CR1_CEN. 7 минут назад, EdgeAligned сказал: С SPI дело еще хуже - там настроек в одном регистре куда больше, и когда таскаешь их все по тексту, легко ошибиться. А выключать SPI может понадобиться для экономии тока потребления. SPI->CR1 = 0x0; Вот и все выключение на уровне модуля SPI. Quote Share this post Link to post Share on other sites More sharing options...