|
STM32F7XX аналог bit-banding |
|
|
|
 |
Ответов
|
Dec 28 2016, 02:11
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894

|
Цитата(amiller @ Dec 26 2016, 16:11)  Читаю документацию и вижу, что там никаких упоминаний про bit-banding при работе с оперативной памятью... Может появились неделимые операции "чтение-модификация-запись"? Атомарные операции не терялись. Вот только выглядят они как громадный костыль. Применимы к флагам которых безумно много, или как вариант - обязаны занимать минимальное место (не всегда правило). В общем у меня получатся так: глобальная структура с флагами ( ingl ) - цель, собрать в кучу мелкие имена флагов, строго 32б, ну и модификация с помощью стандартных команд __LDREXW и __STREXW. Поместил функции f_ask_с и f_ask_d в разные задачи, они там в цикле просто меняют свой флаг. Смысла в функции нет, потому как я не придумал способ передать указатель члена структуры (оно ниже физического адреса). Возможно можно перечислениями сделать, но как потом не запутаться - не знаю. Словом, если кто предложит решение - буду рад. CODE typedef union { struct { uint32_t stop:5; uint32_t start:1; uint32_t a:1; uint32_t b:1; uint32_t c:1; uint32_t d:2; uint32_t e:1; uint32_t f:1; uint32_t g:1; uint32_t h:1; uint32_t i:1; uint32_t j:1; uint32_t k:1; uint32_t l:1; uint32_t m:1; uint32_t n:1; uint32_t o:1; uint32_t p:1; uint32_t q:1; uint32_t r:1; uint32_t s:1; uint32_t t:1; uint32_t u:1; uint32_t v:1; uint32_t w:1; uint32_t x:1; uint32_t y:1; uint32_t z:1; } Flags; uint32_t Flagi; } Flag_Type;
Flag_Type ingl;
static void f_ask_c (void); void f_ask_c (void) { Flag_Type tmp; do { tmp.Flagi = __LDREXW(&ingl.Flagi); tmp.Flags.c ^= 1; }while ( __STREXW(tmp.Flagi, &ingl.Flagi)); __CLREX(); }
static void f_ask_d (void); void f_ask_d (void) { Flag_Type tmp; do { tmp.Flagi = __LDREXW(&ingl.Flagi); tmp.Flags.d ^= 1; }while ( __STREXW(tmp.Flagi, &ingl.Flagi)); __CLREX(); }
Сообщение отредактировал AVI-crak - Dec 28 2016, 02:19
|
|
|
|
|
Dec 28 2016, 10:48
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AVI-crak @ Dec 28 2016, 05:11)  Словом, если кто предложит решение - буду рад. А зачем Вы у себя использовали CLREX? Цитата(amiller @ Dec 28 2016, 06:15)  Просто не считаю, что предложенный Вами механизм, - это полная альтернатива бит-бандинга. Поэтому жаль, что битбандинг не входит в состав архитектуры Cortex М в обязательном порядке. Как предположение: возможно бит-бандинг убрали из-за того, что он не работает в многопроцессорных системах? По крайней мере про механизм LDREX/STREX в мануале заявлено, что он нормально работает и в многопроцессорных системах. А я думаю, что цель развития МК в дальнейшем - по несколько ядер в одном чипе. Некоторые вендоры это уже осознали. Так что может и не зря сейчас переходите. Потом когда выйдет новый МК с несколькими ядрами, окажется что Ваш код с бит-бандингом весь надо переписывать, а если напишете на LDREX/STREX - он и там окажется рабочим
|
|
|
|
|
Dec 28 2016, 16:02
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894

|
Цитата(jcxz @ Dec 28 2016, 16:48)  А зачем Вы у себя использовали CLREX? Там написано что это снятие блокировки, но мне кажется это корявый перевод гугла. В реальности это очистка регистра адреса, который используется для мониторинга атомарного адреса. Прикол в том что когда __LDREXW и __STREXW применяется в прерывании, и перебивается другим прерыванием ровно между командами - при возврате получается глюк. Поймал пару раз, теперь просто ставлю CLREX. В майне любое прерывание работает как CLREX, команда короткая и простая, к тому-же с явным указанием перезагрузки операторов "memory". Этот барьер запрещает GCC размазывать функцию по всему коду, как он это любит делать. ---------------- Есть мысли? как в функцию передать адрес члена битовой структуры??? Гугол молчит на эту тему, наверное это особо_извращённая методика программирования, возможная исключительно под грибами (запрещёнными Законодательством Российской Федерации). Грибы есть, мыслей нет.
|
|
|
|
|
Jan 9 2017, 13:23
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(AVI-crak @ Dec 28 2016, 18:02)  В реальности это очистка регистра адреса, который используется для мониторинга атомарного адреса. Прикол в том что когда __LDREXW и __STREXW применяется в прерывании, и перебивается другим прерыванием ровно между командами - при возврате получается глюк. Я тоже много думал и пытался найти подробнее, как работает LDREX/STREX пара, предполагая, что там какие-то адреса мониторятся. Все гораздо... тупее. Никаких адресов. Если между LDREX и STREX произошло хоть какое прерывание, считается, что оно МОГЛО что-то изменить в атомарной переменной, даже если обработчики ни сном, ни духом и нигде пальчиками не лазили, и операция экслюзивности отвергается. Так, на всякий случай. Я не подпишусь, как там с DMA, который может влезть на атомарную переменную. Не нашел упоминания по поводу (может, плохо искал), но по логике предполагаю, что если между LDREX и STREX хоть какое-то телодвижение со стороны DMA было, эффект будет аналогичный прерыванию. В этой связи есть у меня подозрение, что LDREX/STREX внутри прерывания может действительно приводить к странным эффектам. P.S. Касаемо bit-banding, а точнее - его нужности, то дискуссия в ее нынешнем состоянии есть просто излишня. Здесь нужно принимать явление феноменологически: коль ARM такое замутил, то в этом был и есть глубинный смысл и польза. Не нравится - не ешь.
Сообщение отредактировал KnightIgor - Jan 9 2017, 13:30
|
|
|
|
|
Jan 9 2017, 14:46
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(zltigo @ Jan 9 2017, 15:34)  И каким образом лишний сброс флага эксклюзивности развеивает Ваши подозрения? Никак. Я высказал предположение. Ход со сбросом - не моя идея, а другого автора здесь. Цитата(scifi @ Jan 9 2017, 15:47)  А что там думать? Всё же написано: Очень хорошо написано. Кратко. А кто спорит? Но мне в свое время недоставало в документации некой преамбулы, фразы о концепции, идее LDREX|STREX с точки зрения всей системы в процессоре. Вроде "если ход исполнения между LDREX и STREX будет прерыван, будем рассматривать такое ответвление как риск потерять целостность операции, потому, независимо от того, действительно ли изменилась атомарная переменная в результате прерывания или осталась нетронутой, атомарная операция отклоняется". Вроде того. Кстати, ни слова про DMA, как я на сей момент и предполагал. То есть, надо чисто организационными методами предотвратить какие-либо доступы со стороны DMA в память семафоров. Иначе - защиты от дурака нет.
Сообщение отредактировал KnightIgor - Jan 9 2017, 14:48
|
|
|
|
Сообщений в этой теме
amiller STM32F7XX аналог bit-banding Dec 26 2016, 10:11 jcxz Цитата(amiller @ Dec 26 2016, 13:11) Чита... Dec 26 2016, 21:34 amiller Цитата(jcxz @ Dec 27 2016, 01:34) Механиз... Dec 27 2016, 03:05  jcxz Цитата(amiller @ Dec 27 2016, 06:05) Это ... Dec 27 2016, 09:45   amiller Цитата(jcxz @ Dec 27 2016, 13:45) Вы дума... Dec 27 2016, 12:57    zltigo Цитата(amiller @ Dec 27 2016, 14:57) Есть... Dec 27 2016, 13:25     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   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      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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|