Jump to content
    

Являются ли обращения через BIT BAND REGION истинно атомарными?

Да, для программиста - являются.

А для работы с периферией?

Ведь на самом деле происходит два обращения к регистру. Сначала считывается целиком, потом записывается с изменённым одним битом. 

Может ли за интервал между ими произойти коллизия?

Share this post


Link to post
Share on other sites

30 минут назад, dOb сказал:

Ведь на самом деле происходит два обращения к регистру

Это вы сами придумали?

Share this post


Link to post
Share on other sites

46 минут назад, VladislavS сказал:

Это вы сами придумали?

Ну, технически, как по-Вашему, выглядит доступ с точки зрения регистра?
 

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

Может ли за интервал между ими произойти коллизия?

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

Хм. А ведь возможно я и не прав. Это для APB нет стандартизированных сигналов блокировки шины. А вот для AHB такой сигнал вполне себе есть - HMASTLOCK.

Поэтому, некоторую гарантию можно иметь для AHB-периферии. Но я не вижу причин полагаться на то, что доступ бит-бэндом к APB-периферии (включая способы доступа через шинные мосты AHB-APB) будет атомарным при конкурентном доступе разными шинными мастерами.

Share this post


Link to post
Share on other sites

43 минуты назад, Arlleex сказал:

Ну, технически, как по-Вашему, выглядит доступ с точки зрения регистра?

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

Заглянул в "ARM® Cortex®‑M4 Processor Technical Reference Manual" и моментом нашёл ответ на все вопросы. Действительно, осуществляется атомарное R-M-W. ТС мог бы это за 1 мин найти тоже.

image.thumb.png.00b912d2b979754a6c1d969a9a6c0943.png

Share this post


Link to post
Share on other sites

5 минут назад, VladislavS сказал:

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

Ды нет. Процессор ведь вполне конкретный (хотя я предполагаю, т.к. раздел STM, а по большей части это либо Cortex-M3, либо M4), у него есть спецификация, в этой спецификации указаны в т.ч. версии и модели шинной архитектуры - и это AMBA 3. Поэтому никаких фокусов с битовыми адресациями в этих процессорах быть не может. В отличие от примитивных AVR, например, с инструкциями ядра, гарантирующими атомарность: sbi/cbi и т.д.

Share this post


Link to post
Share on other sites

2 часа назад, dOb сказал:

А для работы с периферией?

Уточните: Атомарными с точки зрения кого?

  1. С точки зрения доступа от одного и того же ядра?
  2. С точки зрения доступа от разных ядер?
  3. С точки зрения доступа от разных bus-masters (DMA, etc.)?
  4. С точки зрения работы внутренней кухни самой целевой периферии?

И о каком МК идёт речь?

Share this post


Link to post
Share on other sites

...ну и скажу, что в F0, F7, H7 от битбандинга отказались вовсе. Видимо, оное не шибко то нужно

Share this post


Link to post
Share on other sites

Только что, EdgeAligned сказал:

...ну и скажу, что в F0, F7, H7 от битбандинга отказались вовсе. Видимо, оное не шибко то нужно

Интересно тут другое: как часто кто-то этим вообще пользовался и какой в этом был прок. Лично мне ни разу не пригодилось.

Share this post


Link to post
Share on other sites

...ну и скажу, что в F0, F7, H7 от битбандинга отказались вовсе. Видимо, оное не шибко то нужно
CM0+ - "недоразумение": "ни богу - свечка, ни чёрту - кочерёжка" - не показатель, IMHO.
CM7 - "не царское дело" из ядра битодрыжствовать ;-)

как часто кто-то этим вообще пользовался и какой в этом был прок.
На CM3\CM4 - бывало, а прок? Feature есть, от использования хуже не становится - а вот могу! (((-8Ж

Share this post


Link to post
Share on other sites

Пробовать - пробовал. Для установки/сброса битов SPE, CEN, DMA_EN и тп. Но чтобы вот пользоваться - ни разу.
За одну операцию возможна манипуляция только с одним битом.

Share this post


Link to post
Share on other sites

3 часа назад, EdgeAligned сказал:

Пробовать - пробовал. Для установки/сброса битов SPE, CEN, DMA_EN и тп.

Ну так для этих битов битбэнд не нужен. Вообще чтение регистров не нужно.

Share this post


Link to post
Share on other sites

Почему чтение регистров не нужно? Вкл/выкл без изменения остальных настроек в этом же регистре - вполне нормальная вещь. Особенно хорошо это видно в регистрах RCC. Теоретически битбандинг для этого там и нужен. Но на практике я не использовал - не стал заморачиваться.

Share this post


Link to post
Share on other sites

17 минут назад, EdgeAligned сказал:

Почему чтение регистров не нужно? Вкл/выкл без изменения остальных настроек в этом же регистре - вполне нормальная вещь. Особенно хорошо это видно в регистрах RCC. Теоретически битбандинг для этого там и нужен. Но на практике я не использовал - не стал заморачиваться.

RCC ресурс разделяемый. А в SPI/DMA и т.д. почти всегда одной записью можно обойтись.

Share this post


Link to post
Share on other sites

Не в том дело. Например, приостановка таймера: void Disable() { ... &= ~TIM_CR1_CEN; }, возобновление счета: void Enable() { ... |= TIM_CR1_CEN}. В противном случае придется указывать все остальные используемые биты этого регистра. 
С SPI дело еще хуже - там настроек в одном регистре куда больше, и когда таскаешь их все по тексту, легко ошибиться. А выключать SPI может понадобиться для экономии тока потребления. Бывают же устройства и на батарейном питании тоже.

Share this post


Link to post
Share on other sites

Так таскаемые биты проще обозвать константой и записывать TIM->CR1 = TIM_CR1 | TIM_CR1_CEN.

7 минут назад, EdgeAligned сказал:

С SPI дело еще хуже - там настроек в одном регистре куда больше, и когда таскаешь их все по тексту, легко ошибиться. А выключать SPI может понадобиться для экономии тока потребления.

SPI->CR1 = 0x0;

Вот и все выключение на уровне модуля SPI.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...