|
STM32F7XX аналог bit-banding |
|
|
|
 |
Ответов
|
Dec 27 2016, 03:05
|
Частый гость
 
Группа: Участник
Сообщений: 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 решили отказаться от этого без каких либо альтернатив?
|
|
|
|
|
Dec 27 2016, 09:45
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(amiller @ Dec 27 2016, 06:05)  Это немного не то. Команды предназначены для организации эксклюзивного доступа к ячейке памяти. Причём они не гарантируют эксклюзивности, а позволяют проверить успешность операции по изменению данных. ... которая будет успешной только при эксклюзивном доступе. И в чём разница? Вы думаете классический битбандинг какие-то специальные операции делал по шине памяти предназначенные только для битов?  Нет, процессор так же выполнял чтение-модификацию бита-запись для всей ячейки содержащей данный бит, но скрыто от программиста и в непрерывном режиме. Вот моя реализация аналога команды 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 позволял достаточно красиво обойти эту проблему. Святая наивность.... Похоже Вы никогда не заглядывали, что генерит IAR при работе с bit-banding-ом. Там команд подчас ещё больше, чем в той процедуре, что я привёл выше. И это не "IAR генерирует", это архитектура Cortex-M такова - у него нет команд непосредственно модифицирующих данные в памяти. Чтобы получить то, что Вы хотите, Вам нужно поменять процессор.
|
|
|
|
|
Dec 27 2016, 12:57
|
Частый гость
 
Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612

|
Цитата(jcxz @ Dec 27 2016, 13:45)  Вы думаете классический битбандинг какие-то специальные операции делал по шине памяти предназначенные только для битов?  Нет, не думаю. Цитата(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 для доступа к отдельным битам. Может быть и коряво, но задачу решало, причём с минимумом накладных расходов.
|
|
|
|
|
Dec 27 2016, 13:25
|

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

|
Цитата(amiller @ Dec 27 2016, 14:57)  Есть переменная, содержащая набор флагов. С помощью bit-banding я мог спокойно установить или сбросить любой бит в этой переменой, не заботясь о том, что одновременно другие процессы с разными приоритетами могут работать с другими битами этой переменной. При этом если работать с несколькими битами, то все становится сразу неудобным. При этом количество тактов на этот bit-banding это не один такт. Цитата И похоже для Cortex M7 можно работать с битовыми структурами только через критические секции. Разумнее с проверкой доступа к памяти. Цитата Спорить не буду, но я не занимался вычислением адресов. Я создавал две секции памяти, одна в bit области, другая в band области памяти. В этих секциях синхронно создавались две переменные, одна - битовая переменная нужного размера битовая НЕ может быть "нужного размера"  . Она только битовая. Цитата вторая - структура из переменных int32 для доступа к отдельным битам. В свою очередь 32bit обеспечивает доступ сразу ко всем 32 битам, а не отдельным. Цитата Может быть и коряво, но задачу решало, причём с минимумом накладных расходов. Минимума накладных расходов по производительности, увы, не было. Как то то, что решаемую задачу Вы тоже описали шиворот на выворот.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|