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

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

2 минуты назад, Forger сказал:

Чтобы избежать конкретизации области видимости, придется выносить объявление в глобальную область.

Хоспаде, они >30 лет пилят язык, и как мне уже кажется, совершенно не туда пилят...

Цитата

Кстати,  а почему в C++11 используете такую странную форму объявления?

Не понял. А как должно быть?

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


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

3 minutes ago, Arlleex said:

Не понял. А как должно быть?

Как минимум в вашем случае слов class там избыточно.

Я применяю using (см. мои примеры), мне оказалось гораздо удобнее )

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


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

Вообще не понял, где Вы увидели у меня typedef... enum class отличается от enum более строгой типизацией и проверкой соответствия типов при неявном преобразовании, что очень удобно. Вот буквально недавно читал, дескать, "вах как это удобно в этих наших C++":smile:

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


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

1 minute ago, Arlleex said:

где Вы увидели у меня typedef

А я и не говорил, что у вас там где-то typedef )

 

 

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


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

Ну я неявно кастовал сие выражение

15 минут назад, Forger сказал:

от себя рекомендую переходить на using. Благодаря ей, отказался от typedef как от страшного кошмара ))

на свой лад:biggrin: Что и ввело меня в замешательство, т.к. я не понимаю, почему using будет удобнее enum class.

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


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

1 minute ago, Arlleex said:

enum class отличается от enum более строгой типизацией и проверкой соответствия типов

Может и так, вот только вот какие там сложные конструкции можно применить в enum, чтобы были проблемы? ))

Это ж  надо постараться, чтобы с enum разложить грабли. Не подумайте, я не придираюсь, просто впервые вижу enum class вместе )

 

3 minutes ago, Arlleex said:

почему using будет удобнее

Потому что using дает как минимум единую схему для объявления всех типов: после using идет название типа, а потом вся "борода и вода". Мне лично так намного проще читать код.

Опять-таки не навязываю. Попробовал, оценил, теперь постепенно перевожу на такую схему старые проекты.

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


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

10 минут назад, Forger сказал:

Не подумайте, я не придираюсь, просто впервые вижу enum class вместе )

Ну я в том числе опирался на примеры и философию применения отсюда.

P.S. Частично можно сократить названия полей как-то так (но все равно не совсем то:beee:)

using eDMAMod = cUARTDMARx::eDMAMod;
using eDMAStr = cUARTDMARx::eDMAStr;

cUARTDMARx fifo(eDMAMod::DMA1n, eDMAStr::STR0n);

Хотелось то ведь, чтобы среда при открытии скобочки у fifo сама давала список выпадающий DMA1n/DMA2n и т.д.

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


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

9 minutes ago, Arlleex said:

P.S. Частично можно сократить названия полей как-то так...

Можно и так, но по-моему это будет сильно захламлять код.

В таких ситуациях, если вы заметили, стараюсь сокращать число параметров до одного.

Это вынуждает придумывать осмысленные названия методам (функциям), что очень положельно сказывается на читаемости кода.

При этом уходит "проблема" детализации области видимости - как раз наоборот, видно откуда "ноги растут" ))

 

К примеру, как понять, что тут происходит без доп. комментов? По мне - только хуже становится :boredom:

cUARTDMARx fifo(eDMAMod::DMA1n, eDMAStr::STR0n);

 

9 minutes ago, Arlleex said:

опирался на примеры и философию применения отсюда.

По мне - спорная философия: ни разу не сталкивался с нуждой проводить сравнения enum друг с другом. Даже не знаю где бы такое приходилось бы применять :mda:

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


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

1 минуту назад, Forger сказал:

К примеру, как понять, что тут происходит без доп. комментов?

Инстанцирование fifo класса cUARTDMARx (т.е. fifo на прием по UART-у с задействованием DMA), в качестве параметров для инициализации указываем модуль DMA (DMA1/DMA2) и номер потока для обслуживания.

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


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

2 minutes ago, Arlleex said:

Инстанцирование fifo класса cUARTDMARx (т.е. fifo на прием по UART-у с задействованием DMA), в качестве параметров для инициализации указываем модуль DMA (DMA1/DMA2) и номер потока для обслуживания.

Выходит этот текст придется добавить в комментарий над этой строчкой. А я не люблю писать комментарии, тем более такие заумные ))

Но, это все - сугубо вкусовщина. Поэтому проехали ))

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


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

10 минут назад, Forger сказал:

Но, это все - сугубо вкусовщина. Поэтому проехали ))

Не-не-не, не проехали:biggrin: Я хотел бы узнать, как написали бы Вы.

Т.е. что не понятно в приведенной мною строке? Сильные сокращения? Т.е.

cUARTDMARx fifo(eDMAModule::DMA1n, eDMAStream::STREAM0n);

было бы лучше? Просто я всегда читаю код, опираясь на контекст. Читающему, вроде, понятно, что можно выбрать DMA1/DMA2 и нужный поток (stream), если он знаком с периферией STM32.

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


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

33 minutes ago, Arlleex said:

Я хотел бы узнать, как написали бы Вы.

На предыдущей странице пример есть.

 

33 minutes ago, Arlleex said:

Читающему, вроде, понятно,

Это - основное заблуждение программиста (любого) ))

 

Если требуются жирные комментарии для понимания некой строчки, то уверяю вас, что через полгода они уже не помогут :)

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


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

38 минут назад, Arlleex сказал:

понятно, что можно выбрать DMA1/DMA2 и нужный поток (stream), если он знаком с периферией STM32.

В том примере, что я приводил, все эти DMAx, DMA-stream-ы, маски всякие и пр. заполняются автоматом. Макросом. Периферию STM32 вспоминать приходится по-минимуму.

Макрос вычисляет всё необходимое сам, по номеру порта:

#define UartHnd_SET(port, trapr, ol) \
  .uart = &concat(UART, nUART_##port),                                                                               \
  .nDMASTRtx = nDMASTR_##port##_TX,                                                                                  \
  .nDMASTRrx = nDMASTR_##port##_RX,                                                                                  \
  .uartNvic = concat(NVIC_UART, nUART_##port),                                                                       \
  .txDmaNvic = concat(NVIC_DMA, concat(DMASTR, nDMASTR_##port##_TX)),                                                \
  .rxDmaNvic = concat(NVIC_DMA, concat(DMASTR, nDMASTR_##port##_RX)),                                                \
  .rccUart = concat(RCC_APB_UART, nUART_##port),                                                                     \
  .dmaTxStat = (nDMASTR_##port##_TX & 3) * 6 + (nDMASTR_##port##_TX & B1) * 2,                                       \
  .dmaRxStat = (nDMASTR_##port##_RX & 3) * 6 + (nDMASTR_##port##_RX & B1) * 2,                                       \
  .dmaTxISR = (UartHnd::IoIsrIfcr *)&((nDMASTR_##port##_TX >> 3) ? &DMA2: &DMA1)->ISR[nDMASTR_##port##_TX >> 2 & 1], \
  .dmaRxISR = (UartHnd::IoIsrIfcr *)&((nDMASTR_##port##_RX >> 3) ? &DMA2: &DMA1)->ISR[nDMASTR_##port##_RX >> 2 & 1], \
  .streamTx = &((nDMASTR_##port##_TX >> 3) ? &DMA2: &DMA1)->STREAM[nDMASTR_##port##_TX & 7],                         \
  .streamRx = &((nDMASTR_##port##_RX >> 3) ? &DMA2: &DMA1)->STREAM[nDMASTR_##port##_RX & 7],                         \
  .streamTxCR = 1 << DMA_CR_EN | 1 << DMA_CR_TEIE | 1 << DMA_CR_TCIE |                                               \
    1 << DMA_CR_DIR | 1 << DMA_CR_MINC |                                                                             \
    0 << DMA_CR_PSIZE | 0 << DMA_CR_MSIZE | DMAPRI_UART_TX << DMA_CR_PL |                                            \
    concat(DMAREQ_S, nDMASTR_##port##_TX, _UART, nUART_##port, _TX) << DMA_CR_CHSEL,                                 \
  .streamRxCR = 1 << DMA_CR_EN | 1 << DMA_CR_DMEIE | 1 << DMA_CR_TEIE | 1 << DMA_CR_TCIE |                           \
    0 << DMA_CR_DIR | 1 << DMA_CR_DBM | DMAPRI_UART_RX << DMA_CR_PL |                                                \
    1 << DMA_CR_MINC | 0 << DMA_CR_PSIZE | 0 << DMA_CR_MSIZE |                                                       \
    concat(DMAREQ_S, nDMASTR_##port##_RX, _UART, nUART_##port, _RX) << DMA_CR_CHSEL,                                 \
  .trapRegion = trapr,                                                                                               \
  .overlock = ol

Всё вычисляется по 'port'.  :wink:

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


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

34 minutes ago, Arlleex said:

Сильные сокращения? 

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

Я стараюсь разбивать действия на отдельные короткие методы, имеющие осмысленные названия. В основном без параметров, реже один, гораздо реже - два. И практически никогда - три.

Возвращаемый результат осмыслен с названием метода/функции.

Например, если результат логический (да/нет), то название начинает с глагола is, has, was и т.п. 

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

Если число возвращается, то название отражает тип возращаемого результата и название отражает, что делает функция при возврате: getVoltage, getTimeMs и т.п.

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


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

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

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

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

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

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

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

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

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

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