Jump to content

    

STM32F7XX аналог bit-banding

Блин... Похоже Вы ничего не поняли... :wacko:

Да понял я всё.

Просто не считаю, что предложенный Вами механизм, - это полная альтернатива бит-бандинга.

Поэтому жаль, что битбандинг не входит в состав архитектуры Cortex М в обязательном порядке.

Тем не менее, спасибо, при отсутствии аппаратных альтернатив этот способ наиболее хорошо подходит для решения моей задачи.

Придётся действительно переходить на программную реализацию атомарных операций по работе с битами.

Кстати в ИАР есть встроенные обертки на С для этих команд (core_cmInstr.h). Например:

/** \brief  STR Exclusive (16 bit)

   This function executes a exclusive STR instruction for 16 bit values.

   \param [in]  value  Value to store
   \param [in]    ptr  Pointer to location
   \return          0  Function succeeded
   \return          1  Function failed
*/
__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
{
  uint32_t result;

  __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) );
  return(result);
}

Edited by amiller

Share this post


Link to post
Share on other sites
Словом, если кто предложит решение - буду рад.

А зачем Вы у себя использовали CLREX?

 

Просто не считаю, что предложенный Вами механизм, - это полная альтернатива бит-бандинга.

Поэтому жаль, что битбандинг не входит в состав архитектуры Cortex М в обязательном порядке.

Как предположение: возможно бит-бандинг убрали из-за того, что он не работает в многопроцессорных системах?

По крайней мере про механизм LDREX/STREX в мануале заявлено, что он нормально работает и в многопроцессорных системах.

А я думаю, что цель развития МК в дальнейшем - по несколько ядер в одном чипе. Некоторые вендоры это уже осознали.

Так что может и не зря сейчас переходите. Потом когда выйдет новый МК с несколькими ядрами, окажется что Ваш код с бит-бандингом весь надо переписывать, а если напишете на LDREX/STREX - он и там окажется рабочим ;)

Share this post


Link to post
Share on other sites

Лично я использовал bit-band для доступа к отдельным ногам. При вызове функции дерганья ногой мне было достаточно передать один указатель, без bit-band на M0 приходится передавать указатель на регистр, маску и обеспечивать атомарность.

Share this post


Link to post
Share on other sites
Лично я использовал bit-band для доступа к отдельным ногам. При вызове функции дерганья ногой мне было достаточно передать один указатель, без bit-band на M0 приходится передавать указатель на регистр, маску и обеспечивать атомарность.

Во многих МК доступ к функциям установки 0 и 1 на GPIO-ногах сделан атомарным посредством периферийных регистров. В некоторых и атомарный toggle есть.

А передавать можно в старших битах - номер порта, в мл. - номер ноги. А в функции это нетрудно развернуть.

Share this post


Link to post
Share on other sites
А зачем Вы у себя использовали CLREX?

Там написано что это снятие блокировки, но мне кажется это корявый перевод гугла.

В реальности это очистка регистра адреса, который используется для мониторинга атомарного адреса. Прикол в том что когда __LDREXW и __STREXW применяется в прерывании, и перебивается другим прерыванием ровно между командами - при возврате получается глюк.

Поймал пару раз, теперь просто ставлю CLREX.

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

 

----------------

Есть мысли? как в функцию передать адрес члена битовой структуры???

Гугол молчит на эту тему, наверное это особо_извращённая методика программирования, возможная исключительно под грибами (запрещёнными Законодательством Российской Федерации). Грибы есть, мыслей нет.

Share this post


Link to post
Share on other sites
Прикол в том что когда __LDREXW и __STREXW применяется в прерывании, и перебивается другим прерыванием ровно между командами - при возврате получается глюк.

Поймал пару раз, теперь просто ставлю CLREX.

Странно.... Надо будет проверить на своём МК как нить.

Думал, что любого вложенного прерывания достаточно для очистки признака эксклюзивности.......

Share this post


Link to post
Share on other sites
Странно.... Надо будет проверить на своём МК как нить.

Думал, что любого вложенного прерывания достаточно для очистки признака эксклюзивности.......

Мне не очень интересно, поскольку вложенных прерываний для сколь-нибудь серьезных контроллеров, в том числе уже и мелких корексов, не использую принципиально. И для обработчиков прерываний использую макросы установки флагов без атомарных оберток.

Share this post


Link to post
Share on other sites
Мне не очень интересно, поскольку вложенных прерываний для сколь-нибудь серьезных контроллеров, в том числе уже и мелких корексов, не использую принципиально. И для обработчиков прерываний использую макросы установки флагов без атомарных оберток.

При модификации битовых флагов в ISR даже вложенных редко требуется дополнительное обеспечение атомарности, так как как правило только один ISR работает с данной конкретной флаговой переменной.

А если нужно более одного ISR для одной флаговой переменной, я просто располагаю эти ISR на одном уровне приоритета.

А Вы просто используете частный случай этого - все прерывания на одном приоритете.

Так что можете не бояться вложенности ;)

Share this post


Link to post
Share on other sites
Так что можете не бояться вложенности ;)

Я не боюсь вложенности. Не приписывайте мне фобий. Я ее просто не использую за ненадобностью в тех случаях, когда есть какая никакая операционная система, понятие задач и их приоритетов, и соответственно нет длинных обработчиков прерываний и пирамиды их приоритетов, как эрзаца системных приоритетов.

 

 

А Вы просто используете частный случай этого - все прерывания на одном приоритете.

Приоритеты прерываний и их вложенность есть две разных сущности. Приоритеты, естественно, используются.

 

Share this post


Link to post
Share on other sites
Мне не очень интересно, поскольку вложенных прерываний для сколь-нибудь серьезных контроллеров, в том числе уже и мелких корексов, не использую принципиально.

Вы серьёзно?

Просто это как купить билет на самолёт, и отправится в путь пешком.

Вложенные прерывания получаются автоматически, при назначении им разных приоритетов.

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

 

И не стоит забывать про call функции, которые в последнее время пихают куда попало, даже в обработчики прерываний. Посему, если есть возможность выстрелить себе в ногу - такой человек найдётся. Потом придётся искать глюк, который срабатывает синхронно с магнитными бурями на Марсе.

Обработка глобальных флагов в прерывании должна завершаться CLREX, всё по той-же причине.

Share this post


Link to post
Share on other sites
Вы серьёзно?

Да.

Просто это как купить билет на самолёт, и отправится в путь пешком.

Нет, это как имея костыли ими НЕ пользоваться. Костыли в виде вложенности не нужны по причине использования функциональной операционной системы. Я же писал об этом.

Вложенные прерывания получаются автоматически, при назначении им разных приоритетов.

Большая, но ненужная мне радость. На самом деле контроллер прерываний МЛАДШИХ кортексов это именно костыль. У старших, как и у "старых" армов, контролеры прерываний без этих костылей. Причина проста - явно предполагалось перетаскивать под крыло младших кортексов программистов с восьмибитовиков с их де-факто стилем писательства с стиле "суперцикл". Для такого подхода к делу наличие наворотов контролера в сторону навороченных вложенных прерываний, есть несомненное благо.

Посему, если есть возможность выстрелить себе в ногу - такой человек найдётся.

Посему для начала не надо плодить без надобности решения для стрельбы в ногу.

Share this post


Link to post
Share on other sites
Нет, это как имея костыли ими НЕ пользоваться. Костыли в виде вложенности не нужны по причине использования функциональной операционной системы. Я же писал об этом.

Костыли - это когда начинают по каким-то идеологическим/религиозным причинам игнорировать существующие механизмы и пытаться создать свой лисапет с квадратными колёсами.

Кто-то начинает городить интерфейсы ногодрыгом при наличии аппаратно-реализованных, кто-то не использует вложенность прерываний...

Какой бы ни была функциональной ОС, во многих случаях обработать какие-то события прямо в ISR (и соответственно, пропустить "вперёд" более время-критические ISR посредством приоритета)

бывает гораздо удобнее/быстрее, чем тащить это всё в задачу ОС.

 

Большая, но ненужная мне радость. На самом деле контроллер прерываний МЛАДШИХ кортексов это именно костыль. У старших, как и у "старых" армов, контролеры прерываний без этих костылей. Причина проста - явно предполагалось перетаскивать под крыло младших кортексов программистов с восьмибитовиков с их де-факто стилем писательства с стиле "суперцикл".

Да ладно!! Это FIQ/IRQ в ARM7/9 - лучше??? :laughing:

Ну да, он удобнее когда нет вытесняющей ОС. Когда не надо переключать контексты задач и когда мало ISR, могущих конкурировать друг с другом по времени. И можно одно-два самых быстрых прерывания вынести в отдельный контекст FIQ.

Но как только возникают задачи вытесняющей ОС, как только оказывается необходимым копировать стеки между разными состояниями CPU (нормальное/IRQ/FIQ/...) сразу всё это удобство превращается в огромный костыль.

И не надо тут сказки рассказывать - мне приходилось писать порты ОС и под ARM7/9 и под Cortex-M. И это небо и земля по сложности/размеру. И любой желающий может самостоятельно сделать такой вывод взглянув на готовые переключатели задач для классических ARM и для Cortex-M.

Архитектура NVIC в Cortex-M как раз и была создана с целью оптимизации для использования под ОС. В то время как IRQ/FIQ классических ARM - для ускорения обработки ISR без механизма вытеснения задач в ISR.

Share this post


Link to post
Share on other sites
Костыли - это когда начинают по каким-то идеологическим/религиозным причинам игнорировать существующие механизмы и пытаться создать свой лисапет с квадратными колёсами.

Операционная система с вытесняющей многозадачностью не является "лисапет с квадратными колёсами".

Какой бы ни была функциональной ОС, во многих случаях....

Количество таких случаев зависит от сложности решаемых контроллером задач и наличия головы на полечах у решающего эти задачи.

Да ладно!! Это FIQ/IRQ в ARM7/9 - лучше??? :laughing:

Да, лучше. В этом случае 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" есть благо, поскольку железо он абсолютно не понимает и то, что он сотворил с обработкой прерываний вообще и преключателе задач в частности, ни в какие ворота не лезет.

Share this post


Link to post
Share on other sites
То, что касается "сделать такой вывод взглянув на готовые переключатели задач для классических ARM", то глядя на некоторые реализации портов, например, uCOS для ARM7, можно сказать, что для его писателя, действительно "M" есть благо, поскольку железо он абсолютно не понимает и то, что он сотворил с обработкой прерываний вообще и преключателе задач в частности, ни в какие ворота не лезет.

Может приведёте здесь Ваш переключатель задач для classic ARM? Чтобы не быть голословным.

Share this post


Link to post
Share on other sites
Может приведёте здесь Ваш переключатель задач для classic ARM? Чтобы не быть голословным.

В первом приближении берете, например, FreeRTOSовские порты ARM7 и M3 и сравниваете на предмет наличия ужасных сложностей порта ARM7.

У меня отличия от штатного ARM7 порта под IAR не разительные. Могу, конечно, и свой выложить. Это не секрет. Просто под руками сейчас нет.

Потом можете сравнить с тем, что для ARM7 начиная со startup c бодуна понаписано в uCOS. Там действительно страшненько, но это не следствие ARM7, а следствие уровня писавшего порт.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this