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

ЗЫ. Я там вам ответил про варианты pin.h, возможно вы проглядели (тема растёт очень быстро).

Я видел. Полистал код. На заметку взял. Спасибо!!!

 

 

Всё? Расходимся! )))))))))))

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


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

Не скажу, давно это было, не помню, где именно. Но почему-то запомнилось что int там был 16-битный.

На некоторых платформах и char бывает 16-битным :laughing:

 

Ну тогда bit-band. Есть везде, кроме L0.

И кроме M7.

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


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

На некоторых платформах и char бывает 16-битным

Пример - в студию!

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


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

void toggle() { isLow() ? setToHigh() : setToLow(); }

Я лично не очень жалую такую форму условия со знаком "?", просто, дело вкуса, не более того.

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


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

Я не очень жалую такую форму условия со знаком "?"

такая же фигня. вообще не пользовать оператор ? до недавнего времени.... меня, когда "воспитывали", то по рукам били за несколько операторов в одной строке. И отучили. В принцепе согласен.... такие конструкции как

if(isLow()) return;

ухудшают читаемость кода. стал пользовать

if (isLow())

setToHigh();

else

setToLow();

 

после перешел на ?. нет портянок и нет в одной строке кучи операторов

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


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

Пример - в студию!

Семейство TMS320VC55xx в CCS.

 

согласен.... такие конструкции как

if(isLow()) return;

ухудшают читаемость кода. стал пользовать

...

Имхо наоборот: Портянки на несколько экранов вместо компактной записи - ухудшают читаемость.

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


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

На радиокоте недавно спрашивали как записать 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.

Изменено пользователем Шаманъ

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


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

Поэтому задача решается очень просто без проверок:

GPIOD->BSRR =  GPIO_BSRR_BR9 | ((b & 0x80) << 2);
GPIOB->BSRR = GPIO_BSRR_BR4 | ((b & 0x20) >> 1);

А не усугубят ли битовые сдвиги производительность этой и так тормозной операции?

 

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


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

Как по мне, то если переинициализация не производится в процессе работы, то логично собрать все в одном месте. Особенно по части 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);    }

Изменено пользователем Reflector

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


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

А не усугубят ли битовые сдвиги производительность этой и так тормозной операции?

Битовые сдвиги у ARM бесплатные нативные. Ни у кого из МК нет операндом "шифтера".

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


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

Господа, нужно просто делать внимательно RTFM. BSRR регистр имеет замечательное свойство:

У Infineon XMC4700/4800 подобный регистр имеет ещё более замечательное свойство: при одновременной записи единички и в установку бита и в сброс бита, соответствующий бит инвертируется. Атомарно.

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


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

У Infineon XMC4700/4800 подобный регистр имеет ещё более замечательное свойство: при одновременной записи единички и в установку бита и в сброс бита, соответствующий бит инвертируется. Атомарно.

Это глупое свойство, не дающее никакой пользы.

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


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

Это глупое свойство, не дающее никакой пользы.

Если Вы не понимаете назначение чего-то, это не повод называть это глупым.

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


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

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

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

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

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

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

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

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

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

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