|
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 размазывать функцию по всему коду, как он это любит делать. ---------------- Есть мысли? как в функцию передать адрес члена битовой структуры??? Гугол молчит на эту тему, наверное это особо_извращённая методика программирования, возможная исключительно под грибами (запрещёнными Законодательством Российской Федерации). Грибы есть, мыслей нет.
|
|
|
|
|
Dec 29 2016, 18:17
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894

|
Цитата(zltigo @ Dec 29 2016, 18:30)  Мне не очень интересно, поскольку вложенных прерываний для сколь-нибудь серьезных контроллеров, в том числе уже и мелких корексов, не использую принципиально. Вы серьёзно? Просто это как купить билет на самолёт, и отправится в путь пешком. Вложенные прерывания получаются автоматически, при назначении им разных приоритетов. Второе, обработка флагов регистров прерываний - это эксклюзивная, никому больше не нужная операция. Если прерывание перебивает другое на обработке флагов - ничего страшного не случится, адреса флагов не пересекаются. И не стоит забывать про call функции, которые в последнее время пихают куда попало, даже в обработчики прерываний. Посему, если есть возможность выстрелить себе в ногу - такой человек найдётся. Потом придётся искать глюк, который срабатывает синхронно с магнитными бурями на Марсе. Обработка глобальных флагов в прерывании должна завершаться CLREX, всё по той-же причине.
|
|
|
|
|
Dec 29 2016, 20:52
|

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

|
Цитата(AVI-crak @ Dec 29 2016, 20:17)  Вы серьёзно? Да. Цитата Просто это как купить билет на самолёт, и отправится в путь пешком. Нет, это как имея костыли ими НЕ пользоваться. Костыли в виде вложенности не нужны по причине использования функциональной операционной системы. Я же писал об этом. Цитата Вложенные прерывания получаются автоматически, при назначении им разных приоритетов. Большая, но ненужная мне радость. На самом деле контроллер прерываний МЛАДШИХ кортексов это именно костыль. У старших, как и у "старых" армов, контролеры прерываний без этих костылей. Причина проста - явно предполагалось перетаскивать под крыло младших кортексов программистов с восьмибитовиков с их де-факто стилем писательства с стиле "суперцикл". Для такого подхода к делу наличие наворотов контролера в сторону навороченных вложенных прерываний, есть несомненное благо. Цитата Посему, если есть возможность выстрелить себе в ногу - такой человек найдётся. Посему для начала не надо плодить без надобности решения для стрельбы в ногу.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 30 2016, 08:23
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zltigo @ Dec 29 2016, 23:52)  Нет, это как имея костыли ими НЕ пользоваться. Костыли в виде вложенности не нужны по причине использования функциональной операционной системы. Я же писал об этом. Костыли - это когда начинают по каким-то идеологическим/религиозным причинам игнорировать существующие механизмы и пытаться создать свой лисапет с квадратными колёсами. Кто-то начинает городить интерфейсы ногодрыгом при наличии аппаратно-реализованных, кто-то не использует вложенность прерываний... Какой бы ни была функциональной ОС, во многих случаях обработать какие-то события прямо в ISR (и соответственно, пропустить "вперёд" более время-критические ISR посредством приоритета) бывает гораздо удобнее/быстрее, чем тащить это всё в задачу ОС. Цитата(zltigo @ Dec 29 2016, 23:52)  Большая, но ненужная мне радость. На самом деле контроллер прерываний МЛАДШИХ кортексов это именно костыль. У старших, как и у "старых" армов, контролеры прерываний без этих костылей. Причина проста - явно предполагалось перетаскивать под крыло младших кортексов программистов с восьмибитовиков с их де-факто стилем писательства с стиле "суперцикл". Да ладно!! Это FIQ/IRQ в ARM7/9 - лучше??? Ну да, он удобнее когда нет вытесняющей ОС. Когда не надо переключать контексты задач и когда мало ISR, могущих конкурировать друг с другом по времени. И можно одно-два самых быстрых прерывания вынести в отдельный контекст FIQ. Но как только возникают задачи вытесняющей ОС, как только оказывается необходимым копировать стеки между разными состояниями CPU (нормальное/IRQ/FIQ/...) сразу всё это удобство превращается в огромный костыль. И не надо тут сказки рассказывать - мне приходилось писать порты ОС и под ARM7/9 и под Cortex-M. И это небо и земля по сложности/размеру. И любой желающий может самостоятельно сделать такой вывод взглянув на готовые переключатели задач для классических ARM и для Cortex-M. Архитектура NVIC в Cortex-M как раз и была создана с целью оптимизации для использования под ОС. В то время как IRQ/FIQ классических ARM - для ускорения обработки ISR без механизма вытеснения задач в ISR.
|
|
|
|
|
Dec 30 2016, 08:51
|

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

|
Цитата(jcxz @ Dec 30 2016, 10:23)  Костыли - это когда начинают по каким-то идеологическим/религиозным причинам игнорировать существующие механизмы и пытаться создать свой лисапет с квадратными колёсами. Операционная система с вытесняющей многозадачностью не является "лисапет с квадратными колёсами". Цитата Какой бы ни была функциональной ОС, во многих случаях.... Количество таких случаев зависит от сложности решаемых контроллером задач и наличия головы на полечах у решающего эти задачи. Цитата Да ладно!! Это FIQ/IRQ в ARM7/9 - лучше???  Да, лучше. В этом случае FIQ это действительно и быстрое и приоритетное. Как раз для таких случаев когда действительно надо. На форуме уже было пара веток разговоров чем контроллер препываний ARM7/9 и старших кортексов лучше, чем удобный "кирпич" младших кортексов. Например: https://electronix.ru/forum/index.php?showt...t&p=1348629Цитата Ну да, он удобнее когда нет вытесняющей ОС. Глупость. Удобство состоит в возможности реализации замыслов, а не в том, что что то там "само" сохраняется не требуя умственных усилий и кода. Цитата Архитектура NVIC в Cortex-M как раз и была создана с целью оптимизации для использования под ОС. В то время как IRQ/FIQ классических ARM - для ускорения обработки ISR бс в ISR. По Вашей "теории" Cortex-A так же рождены для безосевых решений  P.S. То, что касается "сделать такой вывод взглянув на готовые переключатели задач для классических ARM", то глядя на некоторые реализации портов, например, uCOS для ARM7, можно сказать, что для его писателя, действительно "M" есть благо, поскольку железо он абсолютно не понимает и то, что он сотворил с обработкой прерываний вообще и преключателе задач в частности, ни в какие ворота не лезет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Dec 30 2016, 13:03
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zltigo @ Dec 30 2016, 11:51)  То, что касается "сделать такой вывод взглянув на готовые переключатели задач для классических ARM", то глядя на некоторые реализации портов, например, uCOS для ARM7, можно сказать, что для его писателя, действительно "M" есть благо, поскольку железо он абсолютно не понимает и то, что он сотворил с обработкой прерываний вообще и преключателе задач в частности, ни в какие ворота не лезет. Может приведёте здесь Ваш переключатель задач для classic ARM? Чтобы не быть голословным.
|
|
|
|
Сообщений в этой теме
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 Цитата(zltigo @ Dec 29 2016, 15:30) Мне н... Dec 29 2016, 13:10      zltigo Цитата(jcxz @ Dec 29 2016, 15:10) Так что... Dec 29 2016, 13:31          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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|