|
|
  |
Библиотеки для STM32 |
|
|
|
Apr 20 2017, 10:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(Forger @ Apr 20 2017, 15:25)  Я не очень жалую такую форму условия со знаком "?" такая же фигня. вообще не пользовать оператор ? до недавнего времени.... меня, когда "воспитывали", то по рукам били за несколько операторов в одной строке. И отучили. В принцепе согласен.... такие конструкции как if(isLow()) return; ухудшают читаемость кода. стал пользовать if (isLow()) setToHigh(); else setToLow(); после перешел на ?. нет портянок и нет в одной строке кучи операторов
|
|
|
|
|
Apr 20 2017, 10:39
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Эдди @ Apr 20 2017, 11:48)  Пример - в студию! Семейство TMS320VC55xx в CCS. Цитата(juvf @ Apr 20 2017, 12:29)  согласен.... такие конструкции как if(isLow()) return; ухудшают читаемость кода. стал пользовать ... Имхо наоборот: Портянки на несколько экранов вместо компактной записи - ухудшают читаемость.
|
|
|
|
|
Apr 20 2017, 13:39
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(Reflector @ Apr 20 2017, 10:56)  На радиокоте недавно спрашивали как записать 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.
Сообщение отредактировал Шаманъ - Apr 20 2017, 13:41
|
|
|
|
|
Apr 20 2017, 13:59
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(Шаманъ @ Apr 20 2017, 16:39)  Поэтому задача решается очень просто без проверок: Код GPIOD->BSRR = GPIO_BSRR_BR9 | ((b & 0x80) << 2); GPIOB->BSRR = GPIO_BSRR_BR4 | ((b & 0x20) >> 1); А не усугубят ли битовые сдвиги производительность этой и так тормозной операции?
|
|
|
|
|
Apr 20 2017, 14:21
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 15-07-06
Пользователь №: 18 836

|
Цитата(Шаманъ @ Apr 20 2017, 16:39)  Как по мне, то если переинициализация не производится в процессе работы, то логично собрать все в одном месте. Особенно по части GPIO. Именно так, у меня вся инициализация настолько в одном месте, что я одной строкой инициализирую сам усарт вместе с портами, а рядом может быть инициализация USB или пина светодиода. Это возможно, т.к. класс пина владеет всей нужной информацией, а функция инициализации усарта знает в каком режиме эти пины нужно инициализировать. Если я не стану в нее передавать пины, то придется для каждого усарта добавить 2 строки их инициализации и тогда уже я должен думать какие-же для них нужно выбирать режимы. И это у меня 2 строки на усарт, а когда люди начинают 4 регистра gpio инициализировать вручную или когда они делают это через HAL, то получается намного больше. Цитата(Шаманъ @ Apr 20 2017, 16:39)  Господа, нужно просто делать внимательно 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); }
Сообщение отредактировал Reflector - Apr 20 2017, 14:18
|
|
|
|
|
Apr 20 2017, 14:22
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(Эдди @ Apr 20 2017, 17:59)  А не усугубят ли битовые сдвиги производительность этой и так тормозной операции? Битовые сдвиги у ARM бесплатные нативные. Ни у кого из МК нет операндом "шифтера".
--------------------
Пролетарий умственного труда.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|