EdgeAligned 86 7 сентября Опубликовано 7 сентября · Жалоба 6 минут назад, jcxz сказал: SPI-флешь у меня работает на разных XMC4xxx в разных проектах. Вот не скажу за XMC, но на примере STM32 сия замута далеко не везде будет работать. Например, при переходе с F103 на H750 весь SPI-код придется переписывать, просто потому что у H750 совсем другой модуль SPI, работает он соверщенно иначе. Разница не только в описании регистров и битов, но разница в структуре и функционировании модуля. Так что, "не все йогурты одинаково полезны". И везет вам, если работаете только совместимыми по периферии микроконтроллерами. Всем бы так 🙂 11 минут назад, jcxz сказал: Посложнее по периферии??? Вот уж не уверен. Есть! 🙂 мир ведь очень обширен. И если вы чего-то не видите, то это не значит еще, что этого нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 7 сентября Опубликовано 7 сентября · Жалоба 16 минут назад, EdgeAligned сказал: С XMC4700 не работаю, нет в нем нужды. Но на примере STM32, пожалста (в сокращенном виде, разумеется): HAL: static void Write(uint16_t data) { constexpr SPI_TypeDef *spi = getBase(); while(!(spi->SR & SPI_SR_TXE)); spi->DR = data; } И всё???! Серьёзно??? Я же писал: Примитивный код да на простой периферии - он будет читаемым и с символьными именами. И даже более читаем с ними. Мой драйвер транзакций SPI-флешь (точнее - его нижний уровень по абстракции) = ~800 строк (только .cpp, без .h). И это с численными битами. С символьными именами был бы намного тяжелее. Попробуете написать что-то подобное ему со своим подходом - утонете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 7 сентября Опубликовано 7 сентября · Жалоба 8 минут назад, jcxz сказал: Ок. а теперь расскажите мне, как с "задефайненными именами" сделать то, что я могу у себя? Например есть описание распределения event-ов для таймера: Им этого не требуется. Да, с готовыми именами склеивать дефайны дефайнов намного тяжелее - согласен. Я тоже иногда клею. Пример со склейками не совсем удачен, потому что мы говорили о противопоставлении этого USART2->CR1 = USART_CR1_OVER8 | USART_CR1_TE | USART_CR1_RE; этому USART2->CR1 = B15 | B3 | B2; Вот, я чтоб даже этот пример снова скопипастить, опять полез в даташит. Вы же предлагаете вовсе избавиться от всяких USART_CR1_TE и т.д. т.к. они "не нужны". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 7 сентября Опубликовано 7 сентября · Жалоба 5 минут назад, EdgeAligned сказал: при переходе с F103 на H750 весь SPI-код придется переписывать, просто потому что у H750 совсем другой модуль SPI, работает он соверщенно иначе. Разница не только в описании регистров и битов, но разница в структуре и функционировании модуля. И как тут помогут символьные имена битов? 5 минут назад, EdgeAligned сказал: Есть! 🙂 мир ведь очень обширен. И если вы чего-то не видите, то это не значит еще, что этого нет Там я некорректно процитировал. Хотел сказать, что наличие линуха не обязательно говорит о сложности внутренней периферии МК. МК-то конечно есть разные, и весьма сложные тож. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 7 сентября Опубликовано 7 сентября · Жалоба 3 минуты назад, jcxz сказал: И всё???! Серьёзно??? Я же написал - это СОКРАЩЕННЫЙ текст, ДЕМО. НЕ буду ж я сюда всю портянку кидать. Вообще, чето напоминает пиписькомеряние. А это - неинтересно. 5 минут назад, jcxz сказал: Мой драйвер транзакций SPI-флешь ужасен и говнокоден 🙂 это хороший пример, как НЕ надо делать. Серьезно. 3 минуты назад, jcxz сказал: И как тут помогут символьные имена битов? Верно - никак. Равно как никак не поможет и ваш говнокод 🙂 без обид, но это именно так! Просто разные модули, разное функционирование, разный набор регистров и битов. Ну и как бы в плане SPI не бывает сложной периферии, бывает бестолковое её описание в документации 🙂 Потому что SPI - один из самых простейших интерфейсов, в нем идет чистый поток битов. Это ж даже не USB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 7 сентября Опубликовано 7 сентября · Жалоба 3 минуты назад, Arlleex сказал: Да, с готовыми именами склеивать дефайны дефайнов намного тяжелее - согласен. Я тоже иногда клею. Пример со склейками не совсем удачен, потому что мы говорили о противопоставлении этого USART2->CR1 = USART_CR1_OVER8 | USART_CR1_TE | USART_CR1_RE; этому USART2->CR1 = B15 | B3 | B2; У меня практически во всех драйверах есть такие аппаратные связки сигналов. Так как XMC4xxx позволяет. А если хотя-бы один регистр в функции прописывается так, как выше показал, то писать остальные через символьные имена (имхо) - не комильфо. Так как стиль должен быть единым. Я кстати раньше тоже пытался смешивать. Частично - использовал символьные имена. Но выглядит это ужасно. Такая каша. Кстати - драйвер UART на STM32 у меня написан насколько помню - с символьными именами битов. Там так нагляднее. И битов там мало и функции их - понятны по названиям. Но даже на STM32, например DMA - уже нагляднее выглядит с численными позициями битов. 3 минуты назад, Arlleex сказал: Вы же предлагаете вовсе избавиться от всяких USART_CR1_TE и т.д. т.к. они "не нужны". Когда у вас будет много вычисляемых позиций битов, то заметите как станет удобнее мой способ. На простых примерах этого не понять.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 7 сентября Опубликовано 7 сентября · Жалоба Так, мы что-то тут отошли от темы совершенно. Между прочим, ложка мёда в бочку дегтя С++ как раз в том и состоит, что благодаря constexpr позволяет весьма неплохо справляться с вычислениями адресов и позиций на этапе компиляции. В показанном мною выше примере базовый адрес модуля вычисляется в constexpr функции на основе номера модуля в шаблоне класса. И это вычисление происходит именно в компиляции, а не в рантайме. Номера каналов DMA и базовые адреса их регистров так же вычисляются в constexpr. И всё это работает без монструозной нечитаемой мешанины. 10 минут назад, jcxz сказал: о даже на STM32, например DMA - уже нагляднее выглядит с численными позициями битов. Частично. Например, для F103: template<int N, int Ch> class Dma { .... static bool IsComplete() { constexpr DMA_TypeDef *dma = GetBase(); return dma->ISR & (DMA_ISR_TCIF1 << ((Ch-1) * 4)); } Но я ничего тут не переписывал, база осталась прежней, просто дополнил сдвиг под конкретный канал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 7 сентября Опубликовано 7 сентября · Жалоба 25 минут назад, EdgeAligned сказал: Я же написал - это СОКРАЩЕННЫЙ текст, ДЕМО. НЕ буду ж я сюда всю портянку кидать. Вообще, чето напоминает пиписькомеряние. А это - неинтересно. Вообще напоминает как водила Камаза пытается научить лётчика как правильно летать. И где во феншую должно висеть ведро - у какого крыла. 25 минут назад, EdgeAligned сказал: ужасен и говнокоден 🙂 это хороший пример, как НЕ надо делать. Серьезно. Т.е. - вы это говорите даже не видя его и не зная как он работает??? Я так весь ваш код могу говнокодом назвать. И кстати - буду прав. Ибо вот это: 48 минут назад, EdgeAligned сказал: template<typename SPI, typename CS, typename DC> class ST75256 { public: static bool PowerOn(bool on) { if(SPI::IsBusy()) return false; CS::Low(); DC::Low(); SPI::Write(0x95 & ~on); WaitComplete(); CS::High(); return true; } конкретно ГОВНОКОД! 1. Операция поразрядной инверсии над bool? Ну-ну... Индусам у вас нужно поучиться! 2. Передача по SPI даже без выдержки необходимой (по даташиту) паузы между CS-low и началом передачи? 3. То же самое относительно временных задержек между DC и CS и началом передачи. 4. Блокирующие ожидания готовности а-ля ардуино-стайл? 5. Отсутствие выдержки от предыдущей закончившейся передачи по SPI до начала новой? И выкладывая такое, вы ещё пытаетесь меня учить программировать???? В одной короткой функции количество говнокода просто зашкаливает! Как тот деятель, который недавно тут где-то писал как правильно читать UART, сам даже не заглянув в мануал. 25 минут назад, EdgeAligned сказал: Ну и как бы в плане SPI не бывает сложной периферии, бывает бестолковое её описание в документации 🙂 Потому что SPI - один из самых простейших интерфейсов, в нем идет чистый поток битов. Это ж даже не USB. Мнение автора быдлокода приведённого выше конечно "ценно"... PS: Научитесь сперва хотя бы что-то примитивное грамотно писать. Прежде чем опытных дядек учить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 7 сентября Опубликовано 7 сентября · Жалоба 1 минуту назад, jcxz сказал: PS: Научитесь сперва хотя бы что-то примитивное грамотно писать. Прежде чем опытных дядек учить. Смею заметить, гражданин, что МОЙ ОПЫТ СОСТАВЛЯЕТ БОЛЕЕ 20 ЛЕТ! То есть ровно как и у вас. Мы с вами - ровня. Так что выбирайте выражения, сударь. Не нужно включать режим "бога", я, знаете ли, не мальчик, и у меня тоже есть чем похвастаться. А вы вот погрязли в своем говнокоде и НЕ ВИДИТЕ НИЧЕГО вокруг. Просто застряли. Таков будет мой вам ответ. Научитесь адекватно общаться, а не орать сразу, как потерпевший. Вообще, не ваше, сударь дело. МОЙ КОД ПРЕКРАСНО РАБОТАЕТ И ИСПЫТАН МНОГОКРАТНО это - не обсуждается. Понятно? Вот и ладно. 6 минут назад, jcxz сказал: Операция поразрядного И между bool и целочисленным? Поздравляю! Вы не знаете, что размер bool равен ОДНОМУ БАЙТУ. Это все равно, что написать 0x95 & ~0x01 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 7 сентября Опубликовано 7 сентября · Жалоба 1 минуту назад, EdgeAligned сказал: Так что выбирайте выражения, сударь. Не нужно включать режим "бога" Советую вам выбирать выражения. Это вы тут уже многократно и совершенно безосновательно назвали мой код говнокодом, даже не видев его. Я же ваш называл только конкретно и по делу. С конкретным указанием где и что. Надеюсь ясно прояснил? А ваш опыт всем прекрасно виден по вашему "коду". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 7 сентября Опубликовано 7 сентября · Жалоба 8 минут назад, jcxz сказал: вы ещё пытаетесь меня учить программировать??? ДА ИМЕННО! Учу и буду учить вас ПРОГРАММИРОВАТЬ! Да, буду учить вас. Потому что я думал, что вы хотябы разбираетесь в программировании. А оказалось, что даже размерность bool не знаете. Ну чтож, придется вас УЧИТЬ, как бы вы не сопротивлялись. Итак, начнем заняние первое. Присаживайтесь. Сударь, помолчите. Пора наконец-то вас научить программировать. А то так и будете писать говнокод. Я не шучу. Надоело это ваше шапкозакидательство. Теперь буду вас УЧИТЬ ПРОГРАММИРОВАТЬ. Ибо за 20 лет вы не научились. Тот говнокод, который ВЫ написали, это дикая жуть даже по сравнению с моим демо-кодом. Так что буду вас учить программировать по-взрослому. Не сопротивляйтесь и получайте удовольствие 5 минут назад, jcxz сказал: Советую вам выбирать выражения Мы с вами РОВНЯ. Поэтому не пытайтесь включать уровень "бога", это смешно. Лучше начинайте учиться программировать. И вообще, из-за вашего говнокода мы тут ушли от темы С++. Давайте говорить не за ваши битовые поля, а за С++. Договорились? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 7 сентября Опубликовано 7 сентября · Жалоба Ладно, черт с ним. Тут дело не в частностях реализации, дело в общей концепции построения. Вот и пакет CubeHAL от ST придерживается такой же концепции. Эти HAL и BSP не с потолка ж были взяты. Да и поставляемые пакеты CMSIS тоже не просто так поставляются. Там много людей над этими пакетами работали, и не один год используются. Значит, это направление ВЕРНОЕ. Множество людей не могут заблуждаться же. Тем более, основоположники современного программирования такую концепцию и разрабатывали. Я читал довольно много книг от авторов, стоявших у истоков современного программирования. И все они придерживались одного пути. В частности, применительно к теме здешнего разговора последних страниц, они утверждали, что текст программы должен содержать осмысленные имена, отражающие суть описываемых действий и инструментов. То есть, SPI_CR1_SPE является абсолютно корректным именем с этой точки зрения. А вот B0 - как раз не является хорошим тоном в программировании. Не важно, на чем эти имена построены, на #define или на struct, но имя должно отражать суть, а не быть набором бессвязных букв. Советую почитать хотябы книгу Эндрю Ханта "Программист-прагматик". В ней рассмотрены общие принципы построения, обсуждаются способы, как избежать "выстрела себе в ногу". Изложение конечно несколько отвлеченное, но программирование - это ведь в том числе и философское занятие. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 7 сентября Опубликовано 7 сентября · Жалоба 1 минуту назад, EdgeAligned сказал: То есть, SPI_CR1_SPE является абсолютно корректным именем с этой точки зрения. А вот B0 - как раз не является хорошим тоном в программировании. Не важно, на чем эти имена построены, на #define или на struct, но имя должно отражать суть, а не быть набором бессвязных букв. Ну, иногда всякие B0, B10 использовать действительно удобно. Например, когда биты никакой смысловой нагрузки не несут - несет лишь числовая составляющая позиции. Например, в неком протоколе передается регистр. В описании 16-битного регистра написано - у тебя 16 лампочек с 0 по 15. Т.е. нет какой-то смысловой нагрузки в самих битах, у них нет как такового названия. Важно лишь, что каждому биту N соответствует лампочка N. Вот там уместно пользоваться всеми этими B0... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 86 7 сентября Опубликовано 7 сентября · Жалоба Ну дак никто против этого ж и не стоит. Однако, если лампочки - то биты вполне можно назвать L0, L1... В общем, все-таки почитайте вышеприведенную книгу 🙂 Там конечно не обязательно со всем прям стопудово соглашаться, но базовые направления, основы, концепция - она таки да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 7 сентября Опубликовано 7 сентября · Жалоба Опять же - пример из референса на STM32F4 Шо за зверь такой этот 29 бит? Разумеется, в готовых хидерах его нет. Ну раз надо его кепт, то я его кепт, просто этим самым макросом RCC->PLLCFGR = BIT_FLD(RCC_PLLCFGR_PLLM, 8) | BIT_FLD(RCC_PLLCFGR_PLLN, 160) | BIT_FLD(RCC_PLLCFGR_PLLP, 0x0) | BIT_FLD(RCC_PLLCFGR_PLLQ, 10) | RCC_PLLCFGR_PLLSRC_HSE | B29; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться