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

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

Осмысленность имен не имеет особого значения вне определенного контекста. Поэтому о лаконичности обычного send() в драйверах UART-а или send_uart1_slip_protocol() можно спорить до бесконечности.

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


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

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

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


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

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

Множество людей не могут заблуждаться же.

Ну да: "Миллион мух не могут заблуждаться. Если они туда летят, значит там действительно что-то вкусное." Подумал Вася, направляясь к объекту "М/Ж".  :biggrin:

 

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

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

Так и эти ваши правила, которым вы слепо поклоняетесь, как религиозный фанатик, не вникая - они придуманы для начинающих. Чтобы помочь им сделать первые шаги. Когда ещё ноги не уверенно стоят на земле и голова не соображает куда идти. Чтобы не пропал этот карапуз, не заблудился, не попал в беду.

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

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

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

 

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

А вот B0 - как раз не является хорошим тоном в программировании.

Я выше приводил конкретный пример. Который как раз иллюстрирует преимущество использования числовых констант. С вопросом: "Как то же самое написать без привязки к конкретным номерам битов?" Вы что-то сказали по нему (по делу)? Показали как это можно реализовать в соответствии с вашими проповедями? Нет, ничего не предложили. А треплетесь бесцельно уже сколько времени....

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

Шо за зверь такой этот 29 бит? Разумеется, в готовых хидерах его нет. Ну раз надо его кепт, то я его кепт, просто этим самым макросом

Скорее всего - типичный копи-паст fail. Но не факт конечно.

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


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

Понятно. Вы конечно мега-монстр программирования, но корона вам не жмет? 🙂 Считаете себя умнее основоположников программирования и авторов языков программиования 🙂 А всё потому, что вы мало читаете и слишком много о себе мните. Хотя мы с вами - ровня. Я пишу такой же говнокод, как и вы, точь-в-точь 🙂 У нас одинаковый опыт, одинаковый возраст и стаж. Просто я, в отличие от вас, не считаю себя умнее всех и не изобретаю велосипедов на треугольных колесах, а еще умею слышать оппонентов. Вы - ничего кроме себя не слышите. В этом и ваша слабость 🙂 

В чем вы в совершенстве преуспели - так это в искусстве СПОРА. В полемике. Это у вас не отнять, вы мега-мастер споров. А в остальном - точно такой же как и я, не лучше, не хуже. Просто я читаю гораздо больше вас, а вы, кроме своих мух, ничего не знаете. Точка. 

Дальше я в этих спорах участвовать не собираюсь. Я не мастер полемики, мне это просто скучно. Это как с голубем в шахматы играть - он раскидает все фигуры и полетит хвастаться 🙂

 

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


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

On 9/7/2024 at 8:12 PM, EdgeAligned said:

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

Можно еще сократить до snd.
И даже еще больше - до tx.

On 9/7/2024 at 9:12 PM, EdgeAligned said:

У нас одинаковый опыт, одинаковый возраст и стаж.

Вы уж извините.

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

On 9/7/2024 at 7:58 PM, Arlleex said:

Ну раз надо его кепт, то я его кепт, просто этим самым макросом

А я просто чтение-модификация-запись использую

// switch system clock to HSI
RCC->CFGR &= ~(0x03UL << RCC_CFGR_SW_Pos);

 

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


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

27 минут назад, dimka76 сказал:

А я просто чтение-модификация-запись использую

// switch system clock to HSI
RCC->CFGR &= ~(0x03UL << RCC_CFGR_SW_Pos);

Такое я стараюсь избегать, по возможности. А возможность - это когда статически (т.е. не в рантайме) можно знать содержимое регистров управления. Поэтому делаю набор "базовых" значений и при необходимости добавляю к ним флаги

namespace SPI {
  enum {
    SPI_CR1 = 0x2 << SPI_CR1_BR_Pos |
              SPI_CR1_SSM           |
              SPI_CR1_SSI           |
              SPI_CR1_MSTR
  };
  
  
  inline void init() {
    CPU::CriticalSection();
    
    SPI3->CR1     = SPI_CR1;
    SPI3->CR2     = SPI_CR2_RXDMAEN |
                    SPI_CR2_TXDMAEN;
    SPI3->SR      = 0x0;
    SPI3->CRCPR   = 0x0;
    SPI3->I2SCFGR = 0x0;
    SPI3->I2SPR   = 0x0;
    
    __DSB();
  }
  
  inline void enable() {
    SPI3->CR1 = SPI_CR1 |
                SPI_CR1_SPE;
  }
  
  ...
}

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


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

On 9/7/2024 at 11:57 PM, Arlleex said:

Такое я стараюсь избегать, по возможности.

Почему ?

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


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

Только что, dimka76 сказал:

Почему ?

А зачем? К тому же иногда один и тот же код "вдруг" становится разделяемым с другим потоком или прерыванием. И все - операции RMW становятся не атомарными. Ловить такие грабли очень не приятно, а лечится лишь приучением делать именно одиночную запись там, где это можно сделать именно обычной записью.

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


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

On 9/8/2024 at 12:15 AM, Arlleex said:

А зачем? К тому же иногда один и тот же код "вдруг" становится разделяемым с другим потоком или прерыванием. И все - операции RMW становятся не атомарными. Ловить такие грабли очень не приятно, а лечится лишь приучением делать именно одиночную запись там, где это можно сделать именно обычной записью.

Тут пример был про PLL.
PLL инициализируется до всех прерываний.

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


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

19 минут назад, dimka76 сказал:

Тут пример был про PLL.
PLL инициализируется до всех прерываний.

У меня - нет.

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


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

5 hours ago, dimka76 said:

Почему ?

Потому, что когда пишешь на С++, разные объекты могут работать с одним и тем же регистром периферии, а код объектов выполнятся в разных потоках. Поэтому приходится при работе с такими разделяемыми регистрами делать доступ к ним через критические секции.

image.thumb.png.56c532462c1891758cbca71798127a9b.png

Вот, кстати пример с PLL, когда в одном регистре флаги нескольких устройств: и PLL процессора, и PLL интерфейса I2S, и PLL интерфейса SAI. Наивная RMW для установки битов xON может привести к очень странному поведению объектов, работающих с этой периферией из разных потоков.

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


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

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

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

правильно. Электроника - моё хобби еще со школы 🙂 Но в 90-х годах идти по специальности "электроника" - самоубийство. Потому выбрал строительство.
Сейчас, увидев тот код, понял, что jcxz от меня недалеко ушел, ибо совсем не знает философии программирования 🙂 Смешал всех мух в одну кучу, нарушив все парадигмы программирования, описываемые в книгах. А потому что просто не читал их. Следовательно, его уровень владения ничуть не выше моего 🙂 

Ладно, это всё лирическое отступление. А че тут у нас по теме обсуждения? Ага, опять скатились в Си. А хотелось бы послушать мнение относительно заданной несколько страниц назад проблематики с описанием регистров и битов в С++ стиле. Ну что, есть тут разбирающиеся в таком?

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


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

Про PLL. Тут не важно, С++ или Си. Тут надо смотреть выше, на общую концепцию взаимодействия. Ситуация с разными потоками (при одноядерном МК) будет возникать только если используется вытесняющая РТОС.
И следовательно, встраивать "предохранители" в виде критических секций следует уровнем выше, а не на уровне общения с регистрами. То есть, чтобы не получилось круто замешанное гумно, как в примене jcxz , надо разделять уровни абстракции. 

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

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

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


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

1 hour ago, EdgeAligned said:

Про PLL. Тут не важно, С++ или Си.

Совершенно верно. Но в С++ потребность разделения доступа видна явно в силу явного создания объектов, работающих с разделяемыми между этими объектами регистрами.

1 hour ago, EdgeAligned said:

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

Не понял, из чего это следует.

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

 

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


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

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

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

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

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

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

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

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

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

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