EdgeAligned 85 8 сентября Опубликовано 8 сентября (изменено) · Жалоба Из того следует, что если ресурс не используется сугубо в многопоточной среде, то встраивать в него "предохранители" не обязательно. Создание разных объектов для одного ресурса не имеет смысла. То есть, если у вас один PLL, но создано несколько объектов этого PPL, то это как бы нечто непонятное. Это как вот у вас есть один чайник и всё, он один и клонировать его не получится, доступ всегда к одному чайнику через один сливной патрубок. А вот если есть описание чайника и склад с чайниками, тогда другое дело. Но каждый чайник все равно будет одним целым чайником, тих просто много на складе. Не стоит путать многопоточность и многообъектность. Если нет переключаемого контекста, то нет и многопоточности. Если одним чайником пользуются несколько человек, тут уже два человека не могут одновременно ухватить один чайник. Схватить то они могут, но выйдет конфликт использования одного чайника. Вот это будет многопоточность, и доступ к чайнику нужно защищать Изменено 8 сентября пользователем EdgeAligned Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 8 сентября Опубликовано 8 сентября · Жалоба 32 minutes ago, EdgeAligned said: Из того следует, что если ресурс не используется сугубо в многопоточной среде, то встраивать в него "предохранители" не обязательно. Так точно, капитан Очевидность! Например, у меня объекты изначально создаются для работы в многопоточной среде. Ессно, что, например, UART имеет только один разделяемый с другими объектами периферийный регистр, поэтому только к этому регистру доступ идёт через критическую секцию, а ко всем остальным регистрам без всяких синхронизаций. 37 minutes ago, EdgeAligned said: Создание разных объектов для одного ресурса не имеет смысла. То есть, если у вас один PLL, но создано несколько объектов этого PPL, то это как бы нечто непонятное. Это что, лекция о программировании на С++ драйверов устройств? Благодарю, не надо. Скажу по секрету, что если в системе только один, например, PLL, то в своей программе создать два объекта я не смогу при всём желании, ибо для реализации единственного объекта, работающего с единственным PLL, использую синглтон. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 8 сентября Опубликовано 8 сентября · Жалоба Эх, была же хорошая тема. Заглянул узнать, что нового, а тут на тебе - переключились на мерянье пиписьками 🙂 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 85 8 сентября Опубликовано 8 сентября · Жалоба Попробую еще раз спросить про то, что было написано несколько страниц назад. У кого какие мнения относительно описания регистров иб итов микроконтроллера в стиле С+О Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 8 сентября Опубликовано 8 сентября · Жалоба 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++ еще и определенного стандарта (попутно вспоминая, можно ли так писать в своем компиляторе, т.к. далеко не все угонятся за последними версиями), я потеряю лишь время, не приблизившись к результату. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 85 8 сентября Опубликовано 8 сентября · Жалоба Про ваше отношение понятно ещё было тогда 😃 Но интересуют другие мнения, для статистики и общего саморазвития, так сказать. Быть может, кто-то иначе думает, может, в этом есть глубокий смысел? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 8 сентября Опубликовано 8 сентября · Жалоба 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) 4) ... 5) 6) блеат, ну погоди, может он там перегрузил |= как-то хитро, это ж плюсы...? 7) да нет, бред же, ну ведь должно делаться то что написано, ведь для людей же пишется, чтоб понятно было! 8) *змей-искуситель*: ЛЕЕЕЕЕЕЗЬ В ИСХОДНИК И МУЧАЙСЯ!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 8 сентября Опубликовано 8 сентября · Жалоба 32 minutes ago, EdgeAligned said: в этом есть глубокий смысел? В переписывании хэдеров от производителя? Если кому-то занятся нечем, то почему бы и нет. Большинство очень полезных библиотек написаны на С, с которым не хочется терять обратную совместимость, поэтому придётся иметь два комплекта хэдеров, для С и С++. Производители МК примеры программирования приводят, как правило, на С. Кому как, но мне проще, когда я везде вижу одну и туже мнемонику в обозначениях регистров и битов. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 8 сентября Опубликовано 8 сентября · Жалоба 54 минуты назад, EdgeAligned сказал: Но интересуют другие мнения, для статистики и общего саморазвития, так сказать. Быть может, кто-то иначе думает, может, в этом есть глубокий смысел? Ссылочку бы. Пока, читая приведённые @Arlleex-ом кусочки, я согласен с мнением, что ненужно:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 180 8 сентября Опубликовано 8 сентября · Жалоба 20 минут назад, AHTOXA сказал: Ссылочку бы. Пока, читая приведённые @Arlleex-ом кусочки, я согласен с мнением, что ненужно:) Ссылка на статью тут Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 8 сентября Опубликовано 8 сентября · Жалоба 9 часов назад, tonyk_av сказал: Поэтому приходится при работе с такими разделяемыми регистрами делать доступ к ним через критические секции. Не обязательно. И даже иногда вредно в случае однократной операции RMW (или даже нескольких подряд). Часто лучше использовать эксклюзивную RMW и спин-блокировку на её основе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 8 сентября Опубликовано 8 сентября · Жалоба 4 часа назад, tonyk_av сказал: Это что, лекция о программировании на С++ драйверов устройств? Лекция от гуру диванного программирования. 15 часов назад, dimka76 сказал: Но что-то не сходится. То вы строительством занимаетесь, то у вас одинаковый стаж программирования с человеком, который всю жизнь программированием МК занимался. Вот тут то Штирлиц и понял, что провалился!.... По постам всё видно. Видно, человек никогда на практике разработкой не занимался. Потому он и всякие советы интернетных "гуру" воспринимает догматически. Так как не может оценить их на своём опыте. А все практические вопросы заметьте - игнорирует. Или несёт какую-то чушь, вообще никак не относящуюся к делу. 8 часов назад, EdgeAligned сказал: Сейчас, увидев тот код, понял, что jcxz от меня недалеко ушел Ну-ну.... каждый мнит себя Наполеоном... 8 часов назад, EdgeAligned сказал: То есть, чтобы не получилось круто замешанное гумно, как в примене jcxz , надо разделять уровни абстракции. В очередной раз (уже в 5-й?) от вас слышу про "гумно". Хотя вроде я вас не оскорблял - это вы начали и продолжаете про некое "гумно". Причём совершенно безосновательно - даже не видев моего кода(!), уже оцениваете его. Это оценивает вас как человека (как раз на аналогичную оценку). Как "специалист" вы уже себя давно "показали" во всей "красе". PS: Не буду опускаться на ваш уровень и более вступать с вами в полемику, просто буду ставить соответствующие отметки вашим словоизвержениям. Сразу пишу что оценка вам - за прямую ложь (про мой код), провокации и безосновательные оскорбления. PPS: Надеюсь в этот раз не побежите снова регить новый аккаунт и с него мстить? 8 часов назад, EdgeAligned сказал: И следовательно, встраивать "предохранители" в виде критических секций следует уровнем выше, а не на уровне общения с регистрами. То есть, чтобы не получилось круто замешанное гумно, как в примене jcxz , надо разделять уровни абстракции. И требую конкретного примера (с цитатой) - где именно у меня вы увидели: "встраивать "предохранители" в виде критических секций на уровне общения с регистрами"? Цитату в студию! Иначе буду считать вас лжецом! 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 8 сентября Опубликовано 8 сентября · Жалоба 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)) (Ну, понятное дело, что подсказок не было, но хоть какие-то проверки). Но сам бы я сейчас таким заморачиваться не стал. Это подход для писателей библиотек, чтобы пользователю было легко. Для себя проще отладить периферийный драйвер и забыть про этот модуль. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tonyk_av 43 8 сентября Опубликовано 8 сентября · Жалоба 58 minutes ago, jcxz said: эксклюзивную RMW и спин-блокировку на её основе. Можно пояснить, что это такое и как реализуется на практике применительно к ARM? Или ссылку для чтения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 236 8 сентября Опубликовано 8 сентября · Жалоба 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: Вот как раз в данном конкретном случае - использование операции эксклюзивной модификации оптимальнее, чем критическая секция. О чём я и говорил. Хотя можно было конечно и критическую секцию использовать. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться