Перейти к содержанию
    

Плавный переход C -> C++ под МК

Из того следует, что если ресурс не используется сугубо в многопоточной среде, то встраивать в него "предохранители" не обязательно.

Создание разных объектов для одного ресурса не имеет смысла. То есть, если у вас один PLL, но создано несколько объектов этого PPL,  то это как бы нечто непонятное.

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

Не стоит путать многопоточность и многообъектность. Если нет переключаемого контекста, то нет и многопоточности. 

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

Изменено пользователем EdgeAligned

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, EdgeAligned said:

Из того следует, что если ресурс не используется сугубо в многопоточной среде, то встраивать в него "предохранители" не обязательно.

Так точно, капитан Очевидность!

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

37 minutes ago, EdgeAligned said:

Создание разных объектов для одного ресурса не имеет смысла. То есть, если у вас один PLL, но создано несколько объектов этого PPL,  то это как бы нечто непонятное.

Это что, лекция о программировании на С++ драйверов устройств? Благодарю, не надо. Скажу по секрету, что если в системе только один, например, PLL, то в своей программе создать два объекта я не смогу при всём желании, ибо для реализации единственного объекта, работающего с единственным PLL, использую синглтон.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эх, была же хорошая тема. Заглянул узнать, что нового, а тут на тебе - переключились на мерянье пиписьками 🙂

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробую еще раз спросить про то, что было написано несколько страниц назад. У кого какие мнения относительно описания регистров иб итов микроконтроллера в стиле С+О

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, AHTOXA сказал:

Эх, была же хорошая тема. Заглянул узнать, что нового, а тут на тебе - переключились на мерянье пиписьками 🙂

Ага, а я как подстрекатель, выходит)) не по своей воле.

1 час назад, EdgeAligned сказал:

Попробую еще раз спросить про то, что было написано несколько страниц назад. У кого какие мнения относительно описания регистров иб итов микроконтроллера в стиле С+О

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

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

// Полная форма
// Установить GPIOD пины 12, 13, 14, 15 как выходы
GPIOD->MODER |= (GPIO_MODER::MODER[NUM_12](NUM_0) | GPIO_MODER::MODER[NUM_13](NUM_0) 
                | GPIO_MODER::MODER[NUM_14](NUM_0) | GPIO_MODER::MODER[NUM_15](NUM_0));

и сходу мне совсем не понятно, что такое NUM_0 в скобках, где я могу делать | а где нет. Т.е. без примеров - не разобраться. Т.е. автор перенес акцент внимания в другое место, не поменяв суть. Да, какие-то фишки плюсов могут быть полезны, но опять же - если я на приготовление пинов буду тратить по полчаса, разгребая хитрые манипуляции C++ еще и определенного стандарта (попутно вспоминая, можно ли так писать в своем компиляторе, т.к. далеко не все угонятся за последними версиями), я потеряю лишь время, не приблизившись к результату.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про ваше отношение понятно ещё было тогда 😃  Но интересуют другие мнения, для статистики и общего саморазвития, так сказать. Быть может, кто-то иначе думает, может, в этом есть глубокий смысел?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, Arlleex сказал:
// Полная форма
// Установить GPIOD пины 12, 13, 14, 15 как выходы
GPIOD->MODER |= (GPIO_MODER::MODER[NUM_12](NUM_0) | GPIO_MODER::MODER[NUM_13](NUM_0) 
                | GPIO_MODER::MODER[NUM_14](NUM_0) | GPIO_MODER::MODER[NUM_15](NUM_0));

Вот еще даже банальное наблюдение. Если смотреть независимо, то с первого взгляда такая строчка может завести в ступор - то ли я дурак, то ли автор косячит. Т.е. как я рассуждаю, смотря на эту строку:

1) Так, ну, в MODER автор пытается модифицировать поля, ок...
2) погоди-ка, он делает |=, не почистив эти поля предварительно...
3) :to_pick_ones_nose2:
4) ...
5) :russian_ru:
6) блеат, ну погоди, может он там перегрузил |= как-то хитро, это ж плюсы...?
7) да нет, бред же, ну ведь должно делаться то что написано, ведь для людей же пишется, чтоб понятно было!
8) *змей-искуситель*: ЛЕЕЕЕЕЕЗЬ В ИСХОДНИК И МУЧАЙСЯ!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

32 minutes ago, EdgeAligned said:

в этом есть глубокий смысел?

В переписывании хэдеров от производителя? Если кому-то занятся нечем, то почему бы и нет.

Большинство очень полезных библиотек написаны на С, с которым не хочется терять обратную совместимость, поэтому придётся иметь два комплекта хэдеров, для С и С++.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 минуты назад, EdgeAligned сказал:

Но интересуют другие мнения, для статистики и общего саморазвития, так сказать. Быть может, кто-то иначе думает, может, в этом есть глубокий смысел?

Ссылочку бы. Пока, читая приведённые @Arlleex-ом кусочки, я согласен с мнением, что ненужно:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, AHTOXA сказал:

Ссылочку бы. Пока, читая приведённые @Arlleex-ом кусочки, я согласен с мнением, что ненужно:)

Ссылка на статью тут

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, tonyk_av сказал:

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

Не обязательно. И даже иногда вредно в случае однократной операции RMW (или даже нескольких подряд). Часто лучше использовать эксклюзивную RMW и спин-блокировку на её основе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, tonyk_av сказал:

Это что, лекция о программировании на С++ драйверов устройств?

Лекция от гуру диванного программирования.  :biggrin:

15 часов назад, dimka76 сказал:

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

Вот тут то Штирлиц и понял, что провалился!.... :biggrin:

По постам всё видно. Видно, человек никогда на практике разработкой не занимался. Потому он и всякие советы интернетных "гуру" воспринимает догматически. Так как не может оценить их на своём опыте. А все практические вопросы заметьте - игнорирует. Или несёт какую-то чушь, вообще никак не относящуюся к делу.

8 часов назад, EdgeAligned сказал:

Сейчас, увидев тот код, понял, что jcxz от меня недалеко ушел

Ну-ну.... каждый мнит себя Наполеоном... :wink:

8 часов назад, EdgeAligned сказал:

То есть, чтобы не получилось круто замешанное гумно, как в примене jcxz , надо разделять уровни абстракции.

В очередной раз (уже в 5-й?) от вас слышу про "гумно". Хотя вроде я вас не оскорблял - это вы начали и продолжаете про некое "гумно". Причём совершенно безосновательно - даже не видев моего кода(!), уже оцениваете его. Это оценивает вас как человека (как раз на аналогичную оценку). Как "специалист" вы уже себя давно "показали" во всей "красе".  :biggrin:

 

PS: Не буду опускаться на ваш уровень и более вступать с вами в полемику, просто буду ставить соответствующие отметки вашим словоизвержениям.

Сразу пишу что оценка вам - за прямую ложь (про мой код), провокации и безосновательные оскорбления.

PPS: Надеюсь в этот раз не побежите снова регить новый аккаунт и с него мстить?  :negative:

 

8 часов назад, EdgeAligned сказал:

И следовательно, встраивать "предохранители" в виде критических секций следует уровнем выше, а не на уровне общения с регистрами. То есть, чтобы не получилось круто замешанное гумно, как в примене jcxz , надо разделять уровни абстракции. 

И требую конкретного примера (с цитатой) - где именно у меня вы увидели: "встраивать "предохранители" в виде критических секций на уровне общения с регистрами"?

Цитату в студию!

 

Иначе буду считать вас лжецом!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Arlleex сказал:

Ссылка на статью тут

Идея очень хорошая. Проверка допустимости флагов для данного регистра, подсказки среды разработки. Примерно это же самое ST пытались реализовать на макросах в SPL:

#define IS_GPIO_MODE(MODE) (((MODE) == GPIO_Mode_IN)|| ((MODE) == GPIO_Mode_OUT) || \ 
                            ((MODE) == GPIO_Mode_AF)|| ((MODE) == GPIO_Mode_AN)) 

(Ну, понятное дело, что подсказок не было, но хоть какие-то проверки).

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

58 minutes ago, jcxz said:

эксклюзивную RMW и спин-блокировку на её основе.

Можно пояснить, что это такое и как реализуется на практике применительно к ARM? Или ссылку для чтения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, tonyk_av сказал:

Можно пояснить, что это такое и как реализуется на практике применительно к ARM? Или ссылку для чтения.

В том примере инита SPI для работы с flash, что я приводил ранее, как раз она используется: 

Эта:

AtomicOrI(&DLR.LNEN, 1 << nDMALINE_df_TX);

Здесь как раз производится операция '|=' между регистром DLR.LNEN и константой (1 << nDMALINE_df_TX), но не с помощью обычных команд RMW, а с помощью команд эксклюзивного доступа ARM. Т.е. - атомарно. Регистр DLR.LNEN - содержит линии DMA-запросов к разным каналам DMA. Используемым разными драйверами периферии в разных задачах/ISR. Поэтому доступ к нему нужен атомарный.

Почитать можете в мануалах на ядро Cortex-M3/M4. Описание команд LDREX/STREX/CLREX.

 

PS: AtomicOr...() у меня - это набор макросов, для атомарного '|='. На встроенном ассемблере.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...