реклама на сайте
подробности

 
 
> STM32F7XX аналог bit-banding
amiller
сообщение Dec 26 2016, 10:11
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



В последние годы пришлось достаточно много писать для STM32F1XX и STM32F4XX.
Везде активно пользовался механизмом bit-banding для доступа к битовым переменным.
Сейчас заказал отладку с STM32F746ZG.
Читаю документацию и вижу, что там никаких упоминаний про bit-banding при работе с оперативной памятью...
Ткните носом, что на замену? Может появились неделимые операции "чтение-модификация-запись"?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение Dec 26 2016, 21:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(amiller @ Dec 26 2016, 13:11) *
Читаю документацию и вижу, что там никаких упоминаний про bit-banding при работе с оперативной памятью...
Ткните носом, что на замену? Может появились неделимые операции "чтение-модификация-запись"?

Механизм LDREX/STREX есть уже в M3.
Go to the top of the page
 
+Quote Post
amiller
сообщение Dec 27 2016, 03:05
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(jcxz @ Dec 27 2016, 01:34) *
Механизм LDREX/STREX есть уже в M3.

Это немного не то.
Команды предназначены для организации эксклюзивного доступа к ячейке памяти.
Причём они не гарантируют эксклюзивности, а позволяют проверить успешность операции по изменению данных.
В какой то мере это танцы с бубном, которые в некоторых случаях ещё сложнее простого запрета прерываний.
Хотелось бы обойтись без всего этого.
Чтобы код на С выглядел как то так:
X &= mask; или X |= mask;
И при этом, разместив переменную в определенной секции памяти или объявив эту переменную особым образом, мы бы получили результат, когда компилятор генерирует непрерываемый код (в идеале из одной команды), который модифицирует переменную прямо в памяти.
Например IAR (всегда?) генерирует код из трёх отдельных этапов - чтение - модификация - запись.
Механизм bit-banding в Cortex-M3 и Cortex-M4 позволял достаточно красиво обойти эту проблему.
А в Cortex-M7 решили отказаться от этого без каких либо альтернатив?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 27 2016, 09:45
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(amiller @ Dec 27 2016, 06:05) *
Это немного не то.
Команды предназначены для организации эксклюзивного доступа к ячейке памяти.
Причём они не гарантируют эксклюзивности, а позволяют проверить успешность операции по изменению данных.

... которая будет успешной только при эксклюзивном доступе.
И в чём разница?
Вы думаете классический битбандинг какие-то специальные операции делал по шине памяти предназначенные только для битов? wink.gif
Нет, процессор так же выполнял чтение-модификацию бита-запись для всей ячейки содержащей данный бит, но скрыто от программиста и в непрерывном режиме.

Вот моя реализация аналога команды CMPXCHG для x86:
CODE
PUBLIC _Z13AtomicCmpSwapPVjjj
;АтомарнаЯ операциЯ "сравнение и обмен" длЯ типа u32.
;u32 AtomicCmpSwap(u32 volatile *ptr, u32 newVal, u32 cmpVal);
_Z13AtomicCmpSwapPVjjj:
aCmpSwap32_01: LDREX R12, [R0]
CMP R12, R2
ITT EQ
STREXEQ R3, R1, [R0]
CMPEQ R3, #1
BEQ aCmpSwap32_01
MOV R0, R12
BX LR

На основе этой процедуры можно сделать и другие операции атомарной модификации памяти (хоть |=, хоть &=, ...).

Цитата(amiller @ Dec 27 2016, 06:05) *
Чтобы код на С выглядел как то так:
X &= mask; или X |= mask;
И при этом, разместив переменную в определенной секции памяти или объявив эту переменную особым образом, мы бы получили результат, когда компилятор генерирует непрерываемый код (в идеале из одной команды), который модифицирует переменную прямо в памяти.
Например IAR (всегда?) генерирует код из трёх отдельных этапов - чтение - модификация - запись.
Механизм bit-banding в Cortex-M3 и Cortex-M4 позволял достаточно красиво обойти эту проблему.

Святая наивность.... biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif
Похоже Вы никогда не заглядывали, что генерит IAR при работе с bit-banding-ом. Там команд подчас ещё больше, чем в той процедуре, что я привёл выше.
И это не "IAR генерирует", это архитектура Cortex-M такова - у него нет команд непосредственно модифицирующих данные в памяти. Чтобы получить то, что Вы хотите, Вам нужно поменять процессор.
Go to the top of the page
 
+Quote Post
amiller
сообщение Dec 27 2016, 12:57
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(jcxz @ Dec 27 2016, 13:45) *
Вы думаете классический битбандинг какие-то специальные операции делал по шине памяти предназначенные только для битов? wink.gif

Нет, не думаю.

Цитата(jcxz @ Dec 27 2016, 13:45) *
Похоже Вы никогда не заглядывали, что генерит IAR при работе с bit-banding-ом. Там команд подчас ещё больше, чем в той процедуре, что я привёл выше.

Нет, заглядывал.

Я прекрасно знаю, как работать с разделяемыми переменными программными средствами.
И эти механизмы можно реализовать в любой архитектуре.
Чаще всего существует поддержка на уровне системы команд, т.е. есть специальные команды для упрощения реализации, в Cortex M это LDREX/STREX.
Если речь идёт о реализации семафоров, то bit-banding ничем не поможет,так как он не обеспечивает атомарный доступ (теперь уже к биту).

Позвольте уточню, для чего я использовал этот механизм:
Есть переменная, содержащая набор флагов. С помощью bit-banding я мог спокойно установить или сбросить любой бит в этой переменой, не заботясь о том, что одновременно другие процессы с разными приоритетами могут работать с другими битами этой переменной.
И похоже для Cortex M7 можно работать с битовыми структурами только через критические секции.



Цитата(zltigo @ Dec 27 2016, 16:45) *
Альтернатива, причем более, чем разумная, Вам была названа. А вот работу с псевдобитами разумной назвать сложно, ввиду затрат на вычисление адреса бита.

Спорить не буду, но я не занимался вычислением адресов.
Я создавал две секции памяти, одна в bit области, другая в band области памяти.
В этих секциях синхронно создавались две переменные, одна - битовая переменная нужного размера, вторая - структура из переменных int32 для доступа к отдельным битам.
Может быть и коряво, но задачу решало, причём с минимумом накладных расходов.


Go to the top of the page
 
+Quote Post
zltigo
сообщение Dec 27 2016, 13:25
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(amiller @ Dec 27 2016, 14:57) *
Есть переменная, содержащая набор флагов. С помощью bit-banding я мог спокойно установить или сбросить любой бит в этой переменой, не заботясь о том, что одновременно другие процессы с разными приоритетами могут работать с другими битами этой переменной.

При этом если работать с несколькими битами, то все становится сразу неудобным. При этом количество тактов на этот bit-banding это не один такт.
Цитата
И похоже для Cortex M7 можно работать с битовыми структурами только через критические секции.

Разумнее с проверкой доступа к памяти.
Цитата
Спорить не буду, но я не занимался вычислением адресов.
Я создавал две секции памяти, одна в bit области, другая в band области памяти.
В этих секциях синхронно создавались две переменные, одна - битовая переменная нужного размера

битовая НЕ может быть "нужного размера" sad.gif. Она только битовая.
Цитата
вторая - структура из переменных int32 для доступа к отдельным битам.

В свою очередь 32bit обеспечивает доступ сразу ко всем 32 битам, а не отдельным.
Цитата
Может быть и коряво, но задачу решало, причём с минимумом накладных расходов.

Минимума накладных расходов по производительности, увы, не было. Как то то, что решаемую задачу Вы тоже описали шиворот на выворот.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- amiller   STM32F7XX аналог bit-banding   Dec 26 2016, 10:11
|||- - amiller   Цитата(zltigo @ Dec 27 2016, 17:25) При э...   Dec 27 2016, 14:06
||- - jcxz   Цитата(amiller @ Dec 27 2016, 15:57) Позв...   Dec 27 2016, 14:58
||- - amiller   Цитата(jcxz @ Dec 27 2016, 18:58) Блин......   Dec 28 2016, 03:15
|- - zltigo   Цитата(amiller @ Dec 27 2016, 05:05) А в ...   Dec 27 2016, 12:45
- - SSerge   Идея bit-banding в том, что он делается не процесс...   Dec 27 2016, 07:19
|- - SasaVitebsk   Цитата(SSerge @ Dec 27 2016, 10:19) Ну и ...   Dec 27 2016, 11:56
|- - _Pasha   Цитата(SasaVitebsk @ Dec 27 2016, 14:56) ...   Dec 27 2016, 12:37
- - SasaVitebsk   На AVR это делал. А теперь вообще так не делаю. Ка...   Dec 27 2016, 19:39
|- - jcxz   Цитата(SasaVitebsk @ Dec 27 2016, 22:39) ...   Dec 27 2016, 22:04
- - AVI-crak   Цитата(amiller @ Dec 26 2016, 16:11) Чита...   Dec 28 2016, 02:11
|- - jcxz   Цитата(AVI-crak @ Dec 28 2016, 05:11...   Dec 28 2016, 10:48
|- - AVI-crak   Цитата(jcxz @ Dec 28 2016, 16:48) А зачем...   Dec 28 2016, 16:02
|- - jcxz   Цитата(AVI-crak @ Dec 28 2016, 19:02...   Dec 29 2016, 12:23
||- - zltigo   Цитата(jcxz @ Dec 29 2016, 14:23) Странно...   Dec 29 2016, 12:30
||- - jcxz   Цитата(zltigo @ Dec 29 2016, 15:30) Мне н...   Dec 29 2016, 13:10
|||- - zltigo   Цитата(jcxz @ Dec 29 2016, 15:10) Так что...   Dec 29 2016, 13:31
||- - AVI-crak   Цитата(zltigo @ Dec 29 2016, 18:30) Мне н...   Dec 29 2016, 18:17
||- - zltigo   Цитата(AVI-crak @ Dec 29 2016, 20:17...   Dec 29 2016, 20:52
||- - jcxz   Цитата(zltigo @ Dec 29 2016, 23:52) Нет, ...   Dec 30 2016, 08:23
||- - zltigo   Цитата(jcxz @ Dec 30 2016, 10:23) Костыли...   Dec 30 2016, 08:51
||- - jcxz   Цитата(zltigo @ Dec 30 2016, 11:51) То, ч...   Dec 30 2016, 13:03
||- - zltigo   Цитата(jcxz @ Dec 30 2016, 15:03) Может п...   Dec 30 2016, 13:50
||- - klen   интересненько почитал... а то как то вяло на элект...   Dec 30 2016, 15:24
||- - zltigo   Цитата(klen @ Dec 30 2016, 17:24) по суще...   Dec 30 2016, 15:58
||- - AVI-crak   Цитата(zltigo @ Dec 30 2016, 21:58) Вот з...   Dec 30 2016, 18:51
||- - zltigo   Цитата(AVI-crak @ Dec 30 2016, 20:51...   Dec 30 2016, 20:52
||- - jcxz   Цитата(AVI-crak @ Dec 30 2016, 21:51...   Dec 31 2016, 11:23
|- - KnightIgor   Цитата(AVI-crak @ Dec 28 2016, 18:02...   Jan 9 2017, 13:23
|- - zltigo   Цитата(KnightIgor @ Jan 9 2017, 15:23) В ...   Jan 9 2017, 13:34
||- - KnightIgor   Цитата(zltigo @ Jan 9 2017, 15:34) И каки...   Jan 9 2017, 14:46
||- - scifi   Цитата(KnightIgor @ Jan 9 2017, 17:46) Но...   Jan 9 2017, 14:56
||- - jcxz   Цитата(KnightIgor @ Jan 9 2017, 17:46) Кс...   Jan 9 2017, 16:05
|- - scifi   Цитата(KnightIgor @ Jan 9 2017, 16:23) Я ...   Jan 9 2017, 13:47
- - Сергей Борщ   Лично я использовал bit-band для доступа к отдельн...   Dec 28 2016, 11:25
|- - jcxz   Цитата(Сергей Борщ @ Dec 28 2016, 14:25) ...   Dec 28 2016, 12:05
- - Obam   "The code designed for other Cortex®-M proces...   Jan 9 2017, 09:50
- - amiller   В процессе переезда с bit-banding сделал несколько...   Jan 9 2017, 10:52
- - scifi   Цитата(amiller @ Jan 9 2017, 13:52) В про...   Jan 9 2017, 11:38
- - zltigo   Цитата(amiller @ Jan 9 2017, 12:52) В про...   Jan 9 2017, 12:17


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th August 2025 - 23:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01466 секунд с 7
ELECTRONIX ©2004-2016