juvf 17 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба ЗЫ. Я там вам ответил про варианты pin.h, возможно вы проглядели (тема растёт очень быстро). Я видел. Полистал код. На заметку взял. Спасибо!!! Всё? Расходимся! ))))))))))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба Не скажу, давно это было, не помню, где именно. Но почему-то запомнилось что int там был 16-битный. На некоторых платформах и char бывает 16-битным :laughing: Ну тогда bit-band. Есть везде, кроме L0. И кроме M7. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба На некоторых платформах и char бывает 16-битным Пример - в студию! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба void toggle() { isLow() ? setToHigh() : setToLow(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба void toggle() { isLow() ? setToHigh() : setToLow(); } Я лично не очень жалую такую форму условия со знаком "?", просто, дело вкуса, не более того. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба Я не очень жалую такую форму условия со знаком "?" такая же фигня. вообще не пользовать оператор ? до недавнего времени.... меня, когда "воспитывали", то по рукам били за несколько операторов в одной строке. И отучили. В принцепе согласен.... такие конструкции как if(isLow()) return; ухудшают читаемость кода. стал пользовать if (isLow()) setToHigh(); else setToLow(); после перешел на ?. нет портянок и нет в одной строке кучи операторов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба Пример - в студию! Семейство TMS320VC55xx в CCS. согласен.... такие конструкции как if(isLow()) return; ухудшают читаемость кода. стал пользовать ... Имхо наоборот: Портянки на несколько экранов вместо компактной записи - ухудшают читаемость. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба Портянки на несколько экранов вместо компактной записи - ухудшают читаемость. +1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Шаманъ 1 20 апреля, 2017 Опубликовано 20 апреля, 2017 (изменено) · Жалоба На радиокоте недавно спрашивали как записать 7 бит заданного байта в PD9, 5 бит в РВ4 и т.д.... Дали парочку ответов, лучший из которых выглядит так: GPIOD->BSRR = b & 0x80 ? GPIO_BSRR_BS9 : GPIO_BSRR_BR9; GPIOB->BSRR = b & 0x20 ? GPIO_BSRR_BS4 : GPIO_BSRR_BR4; Шаблонный код мог бы быть таким: GpioD<9>::write(b & 0x80); GpioB<4>::write(b & 0x20); Он понятнее и эффективнее, т.к. никаких проверок в нем нет. Господа, нужно просто делать внимательно RTFM. BSRR регистр имеет замечательное свойство: Note: If both BSx and BRx are set, BSx has priority. Поэтому задача решается очень просто без проверок: GPIOD->BSRR = GPIO_BSRR_BR9 | ((b & 0x80) << 2); GPIOB->BSRR = GPIO_BSRR_BR4 | ((b & 0x20) >> 1); Это свойство полезно и в других задачах, обсуждаемых на последней паре страниц :). Какая сущность должна всем этим заниматься? Должен ли я для каждого USARTа закопать инициализацию пинов в какой-то общей функции инициализации? Считаю, что не должен Как по мне, то если переинициализация не производится в процессе работы, то логично собрать все в одном месте. Особенно по части GPIO. Изменено 20 апреля, 2017 пользователем Шаманъ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 2 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба Поэтому задача решается очень просто без проверок: GPIOD->BSRR = GPIO_BSRR_BR9 | ((b & 0x80) << 2); GPIOB->BSRR = GPIO_BSRR_BR4 | ((b & 0x20) >> 1); А не усугубят ли битовые сдвиги производительность этой и так тормозной операции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reflector 0 20 апреля, 2017 Опубликовано 20 апреля, 2017 (изменено) · Жалоба Как по мне, то если переинициализация не производится в процессе работы, то логично собрать все в одном месте. Особенно по части GPIO. Именно так, у меня вся инициализация настолько в одном месте, что я одной строкой инициализирую сам усарт вместе с портами, а рядом может быть инициализация USB или пина светодиода. Это возможно, т.к. класс пина владеет всей нужной информацией, а функция инициализации усарта знает в каком режиме эти пины нужно инициализировать. Если я не стану в нее передавать пины, то придется для каждого усарта добавить 2 строки их инициализации и тогда уже я должен думать какие-же для них нужно выбирать режимы. И это у меня 2 строки на усарт, а когда люди начинают 4 регистра gpio инициализировать вручную или когда они делают это через HAL, то получается намного больше. Господа, нужно просто делать внимательно RTFM. BSRR регистр имеет замечательное свойство: Поэтому задача решается очень просто без проверок: GPIOD->BSRR = GPIO_BSRR_BR9 | ((b & 0x80) << 2); GPIOB->BSRR = GPIO_BSRR_BR4 | ((b & 0x20) >> 1); Это свойство полезно и в других задачах, обсуждаемых на последней паре страниц :). Правильно, метод write так и делает: static void write(bool data) { base()->BSRR = (0x10000 << pin) | (data << pin); } Изменено 20 апреля, 2017 пользователем Reflector Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба А не усугубят ли битовые сдвиги производительность этой и так тормозной операции? Битовые сдвиги у ARM бесплатные нативные. Ни у кого из МК нет операндом "шифтера". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба Господа, нужно просто делать внимательно RTFM. BSRR регистр имеет замечательное свойство: У Infineon XMC4700/4800 подобный регистр имеет ещё более замечательное свойство: при одновременной записи единички и в установку бита и в сброс бита, соответствующий бит инвертируется. Атомарно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба У Infineon XMC4700/4800 подобный регистр имеет ещё более замечательное свойство: при одновременной записи единички и в установку бита и в сброс бита, соответствующий бит инвертируется. Атомарно. Это глупое свойство, не дающее никакой пользы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 20 апреля, 2017 Опубликовано 20 апреля, 2017 · Жалоба Это глупое свойство, не дающее никакой пользы. Если Вы не понимаете назначение чего-то, это не повод называть это глупым. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться