EdgeAligned 85 1 час назад Опубликовано 1 час назад · Жалоба 6 минут назад, jcxz сказал: SPI-флешь у меня работает на разных XMC4xxx в разных проектах. Вот не скажу за XMC, но на примере STM32 сия замута далеко не везде будет работать. Например, при переходе с F103 на H750 весь SPI-код придется переписывать, просто потому что у H750 совсем другой модуль SPI, работает он соверщенно иначе. Разница не только в описании регистров и битов, но разница в структуре и функционировании модуля. Так что, "не все йогурты одинаково полезны". И везет вам, если работаете только совместимыми по периферии микроконтроллерами. Всем бы так 🙂 11 минут назад, jcxz сказал: Посложнее по периферии??? Вот уж не уверен. Есть! 🙂 мир ведь очень обширен. И если вы чего-то не видите, то это не значит еще, что этого нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 1 час назад Опубликовано 1 час назад · Жалоба 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 177 1 час назад Опубликовано 1 час назад · Жалоба 8 минут назад, jcxz сказал: Ок. а теперь расскажите мне, как с "задефайненными именами" сделать то, что я могу у себя? Например есть описание распределения event-ов для таймера: Им этого не требуется. Да, с готовыми именами склеивать дефайны дефайнов намного тяжелее - согласен. Я тоже иногда клею. Пример со склейками не совсем удачен, потому что мы говорили о противопоставлении этого USART2->CR1 = USART_CR1_OVER8 | USART_CR1_TE | USART_CR1_RE; этому USART2->CR1 = B15 | B3 | B2; Вот, я чтоб даже этот пример снова скопипастить, опять полез в даташит. Вы же предлагаете вовсе избавиться от всяких USART_CR1_TE и т.д. т.к. они "не нужны". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 1 час назад Опубликовано 1 час назад · Жалоба 5 минут назад, EdgeAligned сказал: при переходе с F103 на H750 весь SPI-код придется переписывать, просто потому что у H750 совсем другой модуль SPI, работает он соверщенно иначе. Разница не только в описании регистров и битов, но разница в структуре и функционировании модуля. И как тут помогут символьные имена битов? 5 минут назад, EdgeAligned сказал: Есть! 🙂 мир ведь очень обширен. И если вы чего-то не видите, то это не значит еще, что этого нет Там я некорректно процитировал. Хотел сказать, что наличие линуха не обязательно говорит о сложности внутренней периферии МК. МК-то конечно есть разные, и весьма сложные тож. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 85 1 час назад Опубликовано 1 час назад · Жалоба 3 минуты назад, jcxz сказал: И всё???! Серьёзно??? Я же написал - это СОКРАЩЕННЫЙ текст, ДЕМО. НЕ буду ж я сюда всю портянку кидать. Вообще, чето напоминает пиписькомеряние. А это - неинтересно. 5 минут назад, jcxz сказал: Мой драйвер транзакций SPI-флешь ужасен и говнокоден 🙂 это хороший пример, как НЕ надо делать. Серьезно. 3 минуты назад, jcxz сказал: И как тут помогут символьные имена битов? Верно - никак. Равно как никак не поможет и ваш говнокод 🙂 без обид, но это именно так! Просто разные модули, разное функционирование, разный набор регистров и битов. Ну и как бы в плане SPI не бывает сложной периферии, бывает бестолковое её описание в документации 🙂 Потому что SPI - один из самых простейших интерфейсов, в нем идет чистый поток битов. Это ж даже не USB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 1 час назад Опубликовано 1 час назад · Жалоба 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 85 1 час назад Опубликовано 1 час назад · Жалоба Так, мы что-то тут отошли от темы совершенно. Между прочим, ложка мёда в бочку дегтя С++ как раз в том и состоит, что благодаря 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 235 1 час назад Опубликовано 1 час назад · Жалоба 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 85 1 час назад Опубликовано 1 час назад · Жалоба 1 минуту назад, jcxz сказал: PS: Научитесь сперва хотя бы что-то примитивное грамотно писать. Прежде чем опытных дядек учить. Смею заметить, гражданин, что МОЙ ОПЫТ СОСТАВЛЯЕТ БОЛЕЕ 20 ЛЕТ! То есть ровно как и у вас. Мы с вами - ровня. Так что выбирайте выражения, сударь. Не нужно включать режим "бога", я, знаете ли, не мальчик, и у меня тоже есть чем похвастаться. А вы вот погрязли в своем говнокоде и НЕ ВИДИТЕ НИЧЕГО вокруг. Просто застряли. Таков будет мой вам ответ. Научитесь адекватно общаться, а не орать сразу, как потерпевший. Вообще, не ваше, сударь дело. МОЙ КОД ПРЕКРАСНО РАБОТАЕТ И ИСПЫТАН МНОГОКРАТНО это - не обсуждается. Понятно? Вот и ладно. 6 минут назад, jcxz сказал: Операция поразрядного И между bool и целочисленным? Поздравляю! Вы не знаете, что размер bool равен ОДНОМУ БАЙТУ. Это все равно, что написать 0x95 & ~0x01 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 235 1 час назад Опубликовано 1 час назад · Жалоба 1 минуту назад, EdgeAligned сказал: Так что выбирайте выражения, сударь. Не нужно включать режим "бога" Советую вам выбирать выражения. Это вы тут уже многократно и совершенно безосновательно назвали мой код говнокодом, даже не видев его. Я же ваш называл только конкретно и по делу. С конкретным указанием где и что. Надеюсь ясно прояснил? А ваш опыт всем прекрасно виден по вашему "коду". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 85 1 час назад Опубликовано 1 час назад · Жалоба 8 минут назад, jcxz сказал: вы ещё пытаетесь меня учить программировать??? ДА ИМЕННО! Учу и буду учить вас ПРОГРАММИРОВАТЬ! Да, буду учить вас. Потому что я думал, что вы хотябы разбираетесь в программировании. А оказалось, что даже размерность bool не знаете. Ну чтож, придется вас УЧИТЬ, как бы вы не сопротивлялись. Итак, начнем заняние первое. Присаживайтесь. Сударь, помолчите. Пора наконец-то вас научить программировать. А то так и будете писать говнокод. Я не шучу. Надоело это ваше шапкозакидательство. Теперь буду вас УЧИТЬ ПРОГРАММИРОВАТЬ. Ибо за 20 лет вы не научились. Тот говнокод, который ВЫ написали, это дикая жуть даже по сравнению с моим демо-кодом. Так что буду вас учить программировать по-взрослому. Не сопротивляйтесь и получайте удовольствие 5 минут назад, jcxz сказал: Советую вам выбирать выражения Мы с вами РОВНЯ. Поэтому не пытайтесь включать уровень "бога", это смешно. Лучше начинайте учиться программировать. И вообще, из-за вашего говнокода мы тут ушли от темы С++. Давайте говорить не за ваши битовые поля, а за С++. Договорились? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться