реклама на сайте
подробности

 
 
> Шаблоны классов работы с пинами и портами (по маске и набору пинов) SILABS EFM32, может кому пригодится
Nixon
сообщение Mar 19 2018, 15:01
Сообщение #1


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



По мотивам STM32TPL от Anton B. Gusev aka AHTOXA сделал с учетом новых возможностей С++11/14 подобное для EFM32
Особенно интересно получился класс PortPins.

чуток поправил

Прикрепленный файл  efm32lg_gpio.zip ( 3.72 килобайт ) Кол-во скачиваний: 27


Сообщение отредактировал Nixon - Mar 20 2018, 10:00
Причина редактирования: форматирование


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Nixon
сообщение Mar 20 2018, 10:23
Сообщение #2


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



По поводу эффективности. IAR 8.22, optimization - medium
Время выполнения на константных параметрах:
PortPins::Mode - 20 + pins тактов
PortPins::Set - 2 * pins тактов
PortPins::Get - 2 + 3*pins тактов

PortMask::Mode - 19 тактов
PortMask::Set - 4 такта
PortMask::Get - 4 такта


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
juvf
сообщение Mar 20 2018, 10:55
Сообщение #3


Профессионал
*****

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



Цитата(Nixon @ Mar 20 2018, 15:23) *
PortPins::Get - 2 + 3*pins тактов
не торт. 16 пинов 50 тактов. Если в лоб вычитать ODR 1-3 такта. Но в коде писать удобней. Плата за удобство.

А сколько тактов Pin::Get()?

Go to the top of the page
 
+Quote Post
Nixon
сообщение Mar 20 2018, 11:17
Сообщение #4


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Цитата(juvf @ Mar 20 2018, 12:55) *
не торт. 16 пинов 50 тактов. Если в лоб вычитать ODR 1-3 такта. Но в коде писать удобней. Плата за удобство.

А сколько тактов Pin::Get()?

Согласен, потому и использую для широких портов PortMask. Там все побыстрее будет. Но бывает что нужно красиво использовать неширокую шину с разбросанными пинами.
Pin практически не отличим от PortPins на один пин. Можно и убрать этот класс.
По поводу вычитки напрямую - вы не забывайте что PortPins еще и правильно мапит нужный пин в нужный бит. А это тоже затраты.

Цитата(Forger @ Mar 20 2018, 13:04) *
Цифры действительно неплохие ... для поклонников ногодрыга sm.gif

Но в остальных случаях особой разницы не будет:
1) скорость настройки портов в подавляющем число проектов не важна, т.к. это делается один раз при запуске
2) может иметь значение лишь скорость чтения/записи пинов, но это делается несколькими строчками инлайн кода, годится любое решение, на классах и без
3) если делать на классах, то размер занимаемого кода (озу/флэш) для классов пинов тоже не имеет критичного значение, т.к. в камне число пинов ограничено физически, а у толстых камней и озу/флэши всегда больше.

Потому, имхо, применение той или иной обертки (не только для пинов) должно быть предельно очевидным, ознозначным и тривиальным. Т.е. читаемым должен прежде всего быть код, а не сама библиотека.
В данном случае такое обилие способов применения мне лично кажется избыточным (судя по приведенным примерам), ну, главный "недостаток" - повышенные требования к компилятору: C++11/14.

В целом, пример интересный и полезный, ну, хотя бы в образовательных целях wink.gif

1. Скорость настройки портов бывает важна - например при двунаправленных шинах. Согласен, это редкое применение, но бывает
2. Иногда после чтения (или перед записью) пинов нужно делать кучу преобразований (битовых манипуляций), тут это делается автоматически
3. Необходимый размер RAM для данной обертки 1 байт на экземпляр класса (или 0 байт для работы со статическими методами). Размер ROM действительно велик (по сравнению с требованиями к RAM), из-за сплошного inline, но для большинства камней действительно не критичен

А по поводу компилятора - а кто сейчас для ARM не делает поддержку С++11/14? Последним был IAR и то уже исправился.
В целом я с вами согласен - это чисто образовательный пример, но с практическим значением sm.gif
Хотел бы заметить что многие вещи, ранее невозможные (или приводящие к большой избыточности кода) на 11/14 делаются не в пример легче и удобнее.


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
Forger
сообщение Mar 20 2018, 11:41
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Nixon @ Mar 20 2018, 14:17) *
например при двунаправленных шинах

Да это - ногодрыг в чистом виде! Такое, имхо, лучше делать через прямое обращение к портам без всяких оберток и классов, разумеется, в ущерб читаемости.
Но такие случаи обычно связаны с очень медленными (например, 1-wire) интерфейсами, где суперскорость не имеет значения. Поэтому ни что не мешает использовать даже толстые обертки.
Лишь бы код был предельно простой, лаконичный и читаемый, а вся эта "срамота" скрыта в недрах библиотеки/обертки.

В особых случаях, если число пинов позволяет, то я бы задействовал не один двунаправленный, а два однонаправленных пина, соединенных вместе: один на выход, второй на вход.
Но признаюсь, с таким пока еще ни разу никогда не сталкивался.


Цитата
2. Иногда после чтения (или перед записью) пинов нужно делать кучу преобразований (битовых манипуляций), тут это делается автоматически

Надуманная "проблема" или я не пойму о чем речь. Приведите пример ))


Цитата
Хотел бы заметить что многие вещи, ранее невозможные (или приводящие к большой избыточности кода) на 11/14 делаются не в пример легче и удобнее.

А вот этот момент просвятите, пожалуйста, по-подробнее, разумеется, в применении к нашей области (МК) wink.gif
Если возможно, то конкретные ситуации, где это действительно оказалось полезным.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 13:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01412 секунд с 7
ELECTRONIX ©2004-2016