|
Библиотеки для STM32 |
|
|
|
 |
Ответов
(225 - 239)
|
Apr 19 2017, 09:57
|

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

|
Цитата(Reflector @ Apr 19 2017, 14:26)  Если с парой светодиодов работать именно как с пинами, то нельзя их выставить в 0 одной командой. Будет две записи в BSRR, разница лишь в том, что для второго светодиода базовый адрес уже будет загружен и вместо 3 команд на ассме получим 2. О чем вы? Как же нельзя? Задача: допустим надо 0 и 6 выствить в "0", а 1 и 7 выставить в 1. решение: GPIOA->BSRR = GPIO_BSRR_BR0 | GPIO_BSRR_BR6 | GPIO_BSRR_BS1 | GPIO_BSRR_BS7;
|
|
|
|
|
Apr 19 2017, 10:01
|

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

|
Цитата(juvf @ Apr 19 2017, 12:48)  тот же кто напишет Pin.hpp Вы не понимаете моего подхода (( Еще раз: Pin.hpp написан и отлажен один раз, после этого отложен в общую библиотеку, закинут в отдельную SVN-базу, поставлен аттрибут "только для чтения", его не нужно править от проекта к проекту. Вообще. А ваши initRedLed, ledRedOff, ledRedOn зависят от проекта, в котором используются. Теперь понятно? Цитата Есть 1Wire, програмный i2c, can..... В одном и том же коде на одном пине все это может висеть по очереди? Вы об этом? Если да, тут я бы использовал только класс Pin. Хотя впервые слышу о чем-то подобном ... Цитата я менял один бит в соответствующем регистре. Мне до лампочки сколько там битов меняется, на производительности никак не сказывается. Проверено. Экономия на спичках. Цитата например.... динамическая индикация 4-х 7-ми сегментников с точкой. в прерывании от таймера нужно 8 портов выкл/откл, плюс общие катоды (4 шт). можно конечно вашими классами это сделать, проскочить по всем пинам и дернуть у всех On() или Off(). сколько вы просидите в прерывании? Я никогда не стану такие тяжелые вещи городить в прерывании, для этого у меня есть rtos, практически в каждом проекте. Ногодрыг и другая активная деятельность производится в теле задачи, которая ждет неких событий. В данном случае его формирует прерывание. Остальной код не страдает и не тупит. Цитата И если на остальное времени не хватит... то вы "не будете втаптывать код".... попросите вагон спичек, ну чтоб не экономить. Наш разговор переходит в разряд "глухого со слепым". Предлагаю заканчивать с этим и переключиться на что-то другое ))
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 19 2017, 10:04
|
Участник

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

|
Цитата(juvf @ Apr 19 2017, 12:57)  О чем вы? Как же нельзя? Задача: допустим надо 0 и 6 выствить в "0", а 1 и 7 выставить в 1. решение: GPIOA->BSRR = GPIO_BSRR_BR0 | GPIO_BSRR_BR6 | GPIO_BSRR_BS1 | GPIO_BSRR_BS7; Это нельзя сделать, точнее у меня это не реализовано по причине невостребованности, в классе имеющем дело с отдельными пинами. Если будет острая необходимость, то в принципе можно это сделать в таком же стиле: Код led1.base()->BSRR = ((led1.pinMask | led2.pinMask) << 16) | led3.pinMask | led4.pinMask; Но один из светодиодов уезжает на другой порт и все ломается...
Сообщение отредактировал Reflector - Apr 19 2017, 10:12
|
|
|
|
|
Apr 19 2017, 11:09
|

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

|
Цитата(Forger @ Apr 19 2017, 15:01)  Мне до лампочки сколько там битов меняется, на производительности никак не сказывается. Экономия на спичках. Ни фига вы не слышите... спички спички.... вам говорият - каждая спичка на счету. Вы опять "Мне до лампочки.... на производительности никак не сказывается".... тут народ считает каждый дизасемблерную строку... вы опять - мне до лампочки, это спички... У меня крутой овернинженеринг, остальный сущности .... "Не хочу, не буду". Цитата В одном и том же коде на одном пине все это может висеть по очереди? Вы об этом? и такое было. Но хотя бы просто только 1-Wire, нужно менять направление пина. Цитата Наш разговор переходит в разряд "глухого со слепым". Предлагаю заканчивать с этим и переключиться на что-то другое )) вот с этим я согласен Цитата Если будет острая необходимость, то в принципе можно это сделать в таком же стиле: Код led1.base()->BSRR = ((led1.pinMask | led2.pinMask) << 16) | led3.pinMask | led4.pinMask; да, стиль такой же... но... лень скролить всю тему... на вскидку прокоментирую.. поправте, если я не прав... led1 - это переменная, структура или класс. pinMask - это поля этой структуры. что делает ваш код 1)led1.pinMask | led2.pinMask 2)<< 16 3) | led3.pinMask 4) | led4.pinMask 5) led1.base() 6) BSRR = чему-то там вам наверно проще/быстрее 4 раза вызвать led*.on/off(); что делает мой код 1) BSRR = чему-то там Цитата Но один из светодиодов уезжает на другой порт и все ломается... есть такое.... но не всё так печально. будет так 1)GPIOA->BSRR = чему-то там 2)GPIOB->BSRR = чему-то там всё ранво есть выгода. и при проектировании я учитываю эту особенность МК и стараюсь вешать на один порт.
|
|
|
|
|
Apr 19 2017, 11:16
|

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

|
Цитата(juvf @ Apr 19 2017, 14:09)  тут народ считает каждый дизасемблерную строку.. Ну, что ж, остается лишь посочувствовать и пожелать удачи.... Видать, других дел нет, как экономить в одном месте битик, теряя сотни байт в других местах из-за криво организованного кода. Каждый развлекается по-своему Цитата каждая спичка на счету. Уходите в asm, коли выбрали проц, в который не влазит код. Чесс слово, это уже похоже на нытьё ... тока без обид Цитата и такое было. Но хотя бы просто только 1-Wire, нужно менять направление пина. Никаких проблем: прямо в коде вызываем соотв. метод, отвечающий за направление пина. В моем случае вместо Код somePin.setAsDigitalOutput() вызываем Код somePin.setAsDigitalInput()
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 19 2017, 11:25
|

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

|
Цитата(juvf @ Apr 19 2017, 14:22)  ожидал tакой ответ.... просто объявите пин LedOpenDrain pin, меняете у него выход на вход.... и он уже не выход c ОК, а вход. Конечно работать будет. Но объект класса LedOpenDrain - есть входной пин. Как то уши режет. Я же уже сказал, что для подобной задачи есть более "базовый" класс Pin, его как раз и нужно использовать для этой задачи или пойти чуть дальше и создать от Pin класс-наследник, который будет реализовывать функционал двунаправленного пина более красиво. Тут уже все упирается в вашу фантазию. Теперь понятно?
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 19 2017, 11:40
|
Участник

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

|
Цитата(juvf @ Apr 19 2017, 14:09)  да, стиль такой же... но... лень скролить всю тему... на вскидку прокоментирую.. поправте, если я не прав... led1 - это переменная, структура или класс. pinMask - это поля этой структуры. что делает ваш код 1)led1.pinMask | led2.pinMask 2)<< 16 3) | led3.pinMask 4) | led4.pinMask 5) led1.base() 6) BSRR = чему-то там
что делает мой код 1) BSRR = чему-то там Нет, все совсем не так. Как я ранее говорил, в моем классе нет переменных, они есть у Forger. Сам классс выглядит следующим образом: Код template<uint32_t gpio, uint32_t pin_, uint32_t af_> struct PinT { static auto base() { return (GPIO_TypeDef*)gpio; } const static uint32_t af = af_; const static uint32_t pin = pin_; const static uint32_t pinMask = 1 << pin; ...... }; Так что pinMask - это обычная константа и генерируемый код будет в точности как у тебя. Цитата есть такое.... но не всё так печально. будет так 1)GPIOA->BSRR = чему-то там 2)GPIOB->BSRR = чему-то там всё ранво есть выгода. и при проектировании я учитываю эту особенность МК и стараюсь вешать на один порт. Эта выгода микроскопическая и думать над этим нужно только если уже все, флеш полностью закончился. Причем очевидно, что если пишешь достаточно компактный код и такое произошло, то скорее всего просто неверно выбран мк. На таких операциях много не сэкономишь, основная экономия лежит в области алгоритмов...
|
|
|
|
|
Apr 19 2017, 12:00
|

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

|
Цитата(Forger @ Apr 19 2017, 16:32)  Типа, съехал с темы ... Чтож, оно и к лучшему ))) c какой темы? я уже всё сказал. сам же говоришь Цитата Наш разговор переходит в разряд "глухого со слепым". Предлагаю заканчивать с этим и переключиться на что-то другое )) зачем мне асм? я вижу в твоем коде сплошной оверинжененринг. я это уже говорил. то, что можно сделать бистро и просто - у тебя разрослось в классы и шаблоны... в сущности... ты считаешь - что это хорошо- твоё право. я тоже пользую ООП в МК. но использование ООП - не значит отказ от 0b00001000. Ты, в ущерб производительности и компактности пишешь классы, Да пожалуйста, пиши. Но ты при этом говоришь "Чо экономить на спичках, хватит ныть и идите в асм". Что-то мне про ООП доказываешь. что тут доказывать - там где надо я сделаю и классы, и шаблоны и паттрены. Но в некоторых случаях делаю прямую запись в регистры, в некоторых в какие-то булевые операции в которых удобно литералы b использовать. Пока что в твоём подходе использовать ООП всюду, отвергая литералы, - я не вижу смысла и удобства. У тебя в майне 3 строчки - у меня в майне 3 строчки. У тебя всё в майне понятно и прозрачно, у меня в майне всё понятно и прозрачно. Я перенесу на другую платформу - поправлю дефайны, майн не буду трогать. ты перенесешь на др платформу - так же будешь писать новый Pin.hpp, майн не изменишь. Если платформа та же... ноги другие.. ты в дефайнах исправишь пин и порт, я в дефайне изменю пин и порт. О чем спор? В удобстве стиля? не вижу преимуществ. а вот в производительности - тут можно поспорить. Но для тебя это экономия на спичках... так что дальше можно не дискутировать  Цитата(Reflector @ Apr 19 2017, 16:40)  Эта выгода микроскопическая и думать над этим нужно только если уже все, флеш полностью закончился. не всегда так. в обработчиках прерывания это очень актуально, таже динамическая индикация....
|
|
|
|
|
Apr 19 2017, 12:28
|
Участник

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

|
Цитата(juvf @ Apr 19 2017, 15:00)  не всегда так. в обработчиках прерывания это очень актуально, таже динамическая индикация.... Ну что ж, еще раз  Есть два класса: PinX и GpioX. Первый имеет дело с одним пином, второй с портом в целом, но пишет/читает только в область ограниченную маской. Теперь подумай сколько ног используется при динамической индикации и какой класс больше для этих целей подходит
Сообщение отредактировал Reflector - Apr 19 2017, 12:28
|
|
|
|
|
Apr 19 2017, 12:40
|

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

|
Цитата(juvf @ Apr 19 2017, 15:00)  В удобстве стиля? не вижу преимуществ. Я раньше писал код для работы с пинами (да и не только) по практически точно такому же принципу, что и вы, но ушел на нынешнее решение. Поэтому я отлично вижу преимущества, скорее всего, потому, что я пробовал и так и сяк... Короче. Я поделился своим опытом, показал примеры. Буду рад, если кому-то пригодится
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 19 2017, 13:02
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Reflector @ Apr 19 2017, 11:45)  В общем так, проинитил я 5 пинов, получил 144 байта, против 188 у меня. Проинитил 10 пинов, получил 252 vs 216, уже в мою пользу. Интересно, как это так? У тебя же вроде тоже нет общего базового класса. Цитата(Reflector @ Apr 19 2017, 11:45)  Но при этом твой код изначально не работает на F1, также там используется bitBand, значит он не работает и на F0, но главное это его размер в дебаге... У меня он вырос в 2.4 раза, у тебя в 110  Ты принципиально не пользуешься отладкой? А посмотреть на уровень выше?  Там есть pin.h, который включает нужный pin_xxx.h, в зависимости от типа контроллера. Для F1 другой вариант, для F0 третий. Цитата(SasaVitebsk @ Apr 19 2017, 11:16)  И что? Ещё раз повторяю. Совершенно бессмысленно. Приведу пример. Только что делал модификацию прибора. Изменилось количество каналов, полностью переразведена плата, на первой версии стояла отдельный МК который управлял клавой, светодиодами пищалкой и подключен был по I2C. В новой версии применили 595/165 SPI и отдельный таймер на пищалку. Это всё замечательно, но как это относится к классу управления ножкой микроконтроллера? Цитата(SasaVitebsk @ Apr 19 2017, 11:16)  Чем поможет конструкция "PA5::On()"? Ну вот, например. Есть класс-АЦП на SPI. Он оформлен в виде шаблона, принимающего параметр - ножку CS. (Ссылка на SPI передаётся в конструктор). Очень удобно. Я пишу в файле описания железа: Код using AdcCsPin = Pin<'A', 2, 'L'>; using AdcSpi = SPI<3, DIV_2>; using AdcType = Ad7714<AdcCsPin>; И потом использую. Разве не удобно? Цитата(SasaVitebsk @ Apr 19 2017, 11:16)  То есть нужен ещё слой, чтобы PA5::On превратился в удобоваримое powerled(red) или adc_cs_on. Я сейчас не о стилистике написания, поймите. Пусть стилистика будет ваша. Но применять по тексту основной программы обезличенные данные аппаратных ресурсов - тоже, что писать reg = 5. Это также недопустимо! Ни одной константы по тексту программы. Итак над этой хренью появляется ещё один файл абстракций. Итого 2. А у меня он 1. Сразу аппаратура в абстракцию. Никакого ещё одного слоя, как вы видите из примера выше. Вместо вашего макроса adc_cs_on у меня в коде класса Adc будет CS:On(); Цитата(SasaVitebsk @ Apr 19 2017, 11:16)  Ну хорошо рассмотрим переносимость данного класса и его применимость в другом проекте. Ну и какая она? Громко заявлена, что она pin_stm32F4xx.h. То есть сразу же радуемся, что при использовании этой чудо хрени в stm32f0 мы в пролёте. Более того, при использовании её в f1 там придётся переписать половину. Но и это ещё не всё. Я утверждаю, что эта хрень не заработает даже на всех камнях F4. Почему? Поищите сами. Или наступите на грабли. При переносе на lpc это полностью переписать. И код использующий данный класс - тоже будет полностью переписан. Вот у меня теперь вопрос. В ЧЁМ ВЫИГРЫШ БРАТ?!!! Я уже ответил выше, но повторюсь. У меня включается файл pin.h, который в свою очередь включает нужный файл в зависимости от типа контроллера. Я дал ссылку на конкретную реализацию, чтобы люди не заблудились в репозитории. Но получил обратный эффект. Что касаемо переносимости между контроллерами, то она тоже имеется (хотя и не полная). Для всех контроллеров, которые я использовал, я писал свой вариант pin.h. А, и про это: Цитата(SasaVitebsk @ Apr 19 2017, 11:16)  Я утверждаю, что эта хрень не заработает даже на всех камнях F4. Почему? Поищите сами. Насчёт хрени - я вас чем-то обидел? Откуда такие бурные эмоции? А насчёт "не заработает даже на всех камнях F4" - буду благодарен за информацию о косяке.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 19 2017, 13:08
|
Участник

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

|
Цитата(AHTOXA @ Apr 19 2017, 15:46)  Интересно, как это так? У тебя же вроде тоже нет общего базового класса. Нет, у меня всего один класс и отдельно от него функция инициализации. Цитата А посмотреть на уровень выше?  Там есть pin.h, который включает нужный pin_xxx.h, в зависимости от типа контроллера. Для F1 другой вариант, для F0 третий. Это хорошо, но с дебагом все равно нужно что-то делать
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|