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

 
 
> 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
Ответов
AVI-crak
сообщение Dec 28 2016, 02:11
Сообщение #2


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

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
jcxz
сообщение Dec 28 2016, 10:48
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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 - он и там окажется рабочим wink.gif
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Dec 28 2016, 16:02
Сообщение #4


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

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(jcxz @ Dec 28 2016, 16:48) *
А зачем Вы у себя использовали CLREX?

Там написано что это снятие блокировки, но мне кажется это корявый перевод гугла.
В реальности это очистка регистра адреса, который используется для мониторинга атомарного адреса. Прикол в том что когда __LDREXW и __STREXW применяется в прерывании, и перебивается другим прерыванием ровно между командами - при возврате получается глюк.
Поймал пару раз, теперь просто ставлю CLREX.
В майне любое прерывание работает как CLREX, команда короткая и простая, к тому-же с явным указанием перезагрузки операторов "memory". Этот барьер запрещает GCC размазывать функцию по всему коду, как он это любит делать.

----------------
Есть мысли? как в функцию передать адрес члена битовой структуры???
Гугол молчит на эту тему, наверное это особо_извращённая методика программирования, возможная исключительно под грибами (запрещёнными Законодательством Российской Федерации). Грибы есть, мыслей нет.
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jan 9 2017, 13:23
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 9 2017, 13:34
Сообщение #6


Гуру
******

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



Цитата(KnightIgor @ Jan 9 2017, 15:23) *
В этой связи есть у меня подозрение, что LDREX/STREX внутри прерывания может действительно приводить к странным эффектам.

И каким образом лишний сброс флага эксклюзивности развеивает Ваши подозрения?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Jan 9 2017, 14:46
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


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


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