-
Постов
1 611 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Весь контент juvf
-
есть вопрос - есть ответ. например передача параметра. параметр меняется от p0 - до p100, частота линейно должна меняться от f1 до f2. только не нужно спрашивать - "А это для чего"? или"А почему аппаратно не заюзать выход таймера?". Или выдаем байт последовательно, как уарт, только биты кодирутся не 0 и 1, а частотой f0 и f1.
-
программный вывод миандра на порт. в прерывании по таймеру дёргать переключать пин.
-
Ни кто не предлагает заменить BSRR на инверсию. Предлагают дополнить BSRR ещё и инверсией. не понятно - что теряем. Задача - перманентно выставлять РА1 и сбрасывать в одной задаче, и переключать РА5 в другой задаче. Если добавить регистр апаратного тогл, какую полезность теряем?
-
а это разве не проверка? 1)читаем GPIOx->IDR (только правильнее будет ODR) 2)инвертируем ~GPIOx->IDR 3)& 0x81 4)| 0x00810000 5)записываем BSRR хотя согласен, для более одного пина, ваш вариант лучше, чем явные ? и if с аппаратным тогл, как в XMC4700/4800 1)GPIOx->BSRR = 0x0081'0081;//одна операция!!!
-
Если у бабки были бы яйца... Только я в своем примере указал GPIO_ToggleBits() от стм, а они пользуют ODR, а не BSRR. а так согласен, запись в BSRR не создаст колизии, и тем не мение, осутствие аппаратного тогла требует лишней проверки выхода. я не имел в виду одним пином.
-
на вскидку один я уже писал в этой теме. на РА0 у вас CS, на РА5 у вас светодиод внешний вачдог. каждый пин дергается в отдельном потоке. Если использовать неатомарный тогл (GPIO_ToggleBits() ) для вачдога из SPL от STM, без критСекций/запрета прерываний/мьютексов на порта РА, то будет косяк. Да даже без ОС: в главном while вы работаете с РB1, в прерывании PB2 - вот ещё случай.
-
я понял... просмотрел, уже отписал. тут я согласен а вот тут не понятно.... вы говорите, что если вам надо переключить бит, вы - установлю или сброшу его в состояние, противоположное предыдущему. Что в библиотеке и сделано. т.е. программно его инвертируете. Но аппаратное атомарное инвертирование - это для вас глупое свойство, не дающее никакой пользы. По мойму сами себе противоречите. Польза в том, что инвертирование вывода будет за 1 машинный такт, атомарное, вот и всё!
-
Это глупое свойство, не дающее никакой пользы. где тут пара? jcxz говорит, что в Infineon XMC4700/4800 для инверсии вывода, одного вывода, нужно в BSRR регистр записать одновременно SetBit и ResetBit. При этом, вне зависимости от состояния вывода, он инвертируется. Эта операция атомарная и можно из разных потоков, даже из прерываний безопасно это делать. например для вывода РА0 это выглядит так GPIOA->BSRR = GPIO_BSRR_BS0 | GPIO_BSRR_BR 2ViKo а про Комплементарные сигналы - тут я соглашусь, можно без тогла 2 вывода одновременно дёрнуть.
-
Вы заблуждаетесь, они с вами не согласны. ))) Иногда требуется не просто установить в 1 или в 0, а переключить. Для чего - это отдельная тема. В некоторых процессорах, если не ошибаюсь, есть отдельный регистр для toggle. В стм32 его нет. Плохо. Но st такой функционал добавили в SPL. /** * @brief Toggles the specified GPIO pins.. * @param GPIOx: where x can be (A..K) to select the GPIO peripheral for STM32F405xx/407xx and STM32F415xx/417xx devices * x can be (A..I) to select the GPIO peripheral for STM32F42xxx/43xxx devices. * x can be (A, B, C, D and H) to select the GPIO peripheral for STM32F401xx devices. * @param GPIO_Pin: Specifies the pins to be toggled. * @retval None */ void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); похоже вы не понимаете о чем речь идет. при чем тут один вывод и другой одновременно? тут всего один вывод требуется инвертировать.
-
Не ради спора... а чтоб расширить кругозор... искать ваши объяления/определения... классы/шаблоны..... поясните, если не сложно... или покажите сырцы GpioB<> пусть b = 0xff; GpioB<4>::write(b & 0x20); b & 0x20 даёт 0x20. что дальше? write() принимает bool. т.е. при передачи аргумента есть неявное преобразование uint8_t(0x20) в bool (0х01)? да и ещё и передача аргумента... т.е. копя data создается внутри write().
-
такая же фигня. вообще не пользовать оператор ? до недавнего времени.... меня, когда "воспитывали", то по рукам били за несколько операторов в одной строке. И отучили. В принцепе согласен.... такие конструкции как if(isLow()) return; ухудшают читаемость кода. стал пользовать if (isLow()) setToHigh(); else setToLow(); после перешел на ?. нет портянок и нет в одной строке кучи операторов
-
void toggle() { isLow() ? setToHigh() : setToLow(); }
-
Я видел. Полистал код. На заметку взял. Спасибо!!! Всё? Расходимся! )))))))))))
-
есть проект, где светодиод мигает, показывая живучесть системы. не было cpl, использовал с дополнительным флагом сет/ресет. А так бы было бы удобно cpl. ps ещё програмный меандр выдавать.... можно найти применение cpl-ю
-
Навскидку... void toggle() { port->BSRR = (port->ODR & pinMask) == 0 ? pinMask : pinMask << 16; } !!! Извини.... но блин.... это всего лишь ногой дёрнуть!!! ))))))))))))
-
Даже коментировать тут нечего.... Полемика. Ну я же говорю, бинарно мыслите... при чем тут уарт? я вам сказал что макросы ВЕЗДЕ лучше классов/шаблонов? я бы не так сделал. была подобная задача.
-
просто ужос!!!! такие элементарные вещи... вроде разживал все... выделил жирным шрифтом, что при изменении РАЗНЫХ ПИНОВ РАЗНЫХ!!! ну не видите вы сами... я же вам привел пример... РА15 и РА5 пошагам.... пусть cs будет РА1, а led будет PA4. воспользуемся литералом b. для кратности пусть порт будет 8 бит. изночально в ODR 0b0000'0000 вы в одном поторке выитали ODR, он равен нулю. второй поток прервал первый. второй поток вычитал ODR и добавил туда cs, стало 0b0000'0010. теперь записал это в ODR. Сs стал "1". Вернулись в первый поток... 0b0000'0000 добавили бит светодиода, получили 0b0001'0000 - записали в ODR - всё!!! CS сбросился! Упс!!! раз вы пишете на RTOS, должны знать про неатомарные операции БИНГО!!!!
-
бррррр... а при чем тут модер? )))) от куда вброс про многопоточность? вот от куда тогел потоко не защищённый. Осторожно, тут мины!! )) я вам про фому - вы мне про ерёму ))))
-
я вам не говорю, что явно не надо задавать. я вам говорю, что int - всегда знаковый. и объяснил вам от куда у вас были грабли с чаром. и что компиляторы одинакого компилят.
-
пишете мне Читайте внимательней, а сами невнимательны ;). Я писал давайте перефразирую вы в одном потоке дергаете cs? который есть PA13, а в другом потомке маргаете диодом который сидит на PA5.
-
По стандарту char/int/long - без указания знаковости считаются знаковые. Во всех компиляторах. Нет других компиляторов. По крайней мере я не встерчал. если встретите - маякните, поизучаю. что касательно этих граблей.... можно дать ключ компилятору, считать char без явного указания unsigned/signed как беззнаковый. у int/short/long это не поменять, только у char. я char использую всегда как занковый, как стандартный дефолтный. ибо если собрать на другой платформе без ключа - то упс!!! Но, в идэ, например в IAR в гуях есть галочка "char как беззнаковый". При создании нового проекта, эта галочка установлена, т.е. иар в тихушку просовывает этот ключ компиялтору меняя у чара знак. Я тоже на это наступал.... решил проблему отказом от char взамен на uint8_t в качестве байтовой переменной. или же всегда указываю у чара явно знаковость. а если мне нужно хранить текст, например char *p = "hello world"; - тут без разницы - есть знак или нет, тут можно упустить знак. Для чара это тру!!! из-за таких тихих подстав от IDE у некоторых складывается впечатление, что char по дефолту беззнаковый. Спасибо большое!!!! А есть для f1 и вообще... огласите полный список? )))) может и для авр кто написал такие классы? ))
-
ну вот у меня новая задача. stm32l052. от чего я эту тему и открыл. Нужно быстро код написать.... цепляю #include "stm32l052xx.h" написал макрос, т.е. написал определение #define csOn() (GPIOA->BSRR = (1<<4)) использую csOn(); если нет stm32l052xx.h - можно заглянуть в даташит (а в него всё равно глядеть) и написать #define csOn() (*(uint32_t*)0x1234'5678 = (1<<4)) не камельфо, но всёже... один раз определил и забыл. Но, есть замечательный тру с++ с ооп. чо как лох буду макросы. Нада же легкочитаемый код.... можно через Pin<>. Где его взять? вместе с stm32l052xx.h он не поставляется. писать свой? отлаживать? скаченный с гитхаба для Ф4 серии. а если вообще решили на msp430? Я говорю - это 100500 строк кода. Причем, в этом pin используется всё тотже stm32l052xx.h.
-
где определение шаблона Pin<>? ещё 100500 строк!!! ну вы не видите, что ваш тогл, при "одновременном" переключении разных бит, в одном порте из разных потоков не будет работать? Т.е. вы не оспариваете что у вас мина в коде, вам предлагают её разминировать, на что ответ - это придирки. ))) Профессиональный подход, чистый код, легкочитаемый и переносимый .... ну ну .. ))) 225 постов.... не увидел где была ссылка или упоминание на стандарт, в котором int беззнаковый. Не могли бы вы меня ткнуть носом, плииз.... приходится унижаться, чтоб получить знания, ДОЖИЛИ!!! И о каком стандарте вы говорите, в котором всё иначе? может мы на разных языках пишем? Я думал мы тут делимся опытом, а не писками меримся. Просто отказ подкрепить свои слова пруфлинком выглядит как пустые слова... у меня длиньше, но я не покажу
-
АНТОХА... не путайте мухи с котлетами.... вы сравниваете определение vs использование. Вот использование vs использование при использовании с дефайнами даже объявление не нужно, т.е. нет строки using CS = Pin<'A', 4>; давайте сравним опеределение vs определение 2Forger пруфлинк? Стандарт строго оговаривает, что int - знаковый. пруф? Стандарт оговаривает 4 байта в формате IEEE754 wtf? Это bool чтоли? я высказывался за свой вкус про всякие SIGNED32, U32.... тут даже не вкус. почему мне не нравиться: если скописастить кусок кода из другово проекта, то не соберётся, нужно тащить до кучи мои типы данных. Это напрегает. в коде могут быть заимствования из 3-х 4-х проектов. получается для каждого стиля до кучи нужно тащить типы данных. В одном проекте можно увидеть весь зоопарк определений. во вторых.... Forger я понял, что для вас литералы - это магические цыфры.... 0x10 или 0b1010110- это что-то плохое, что мешает чтению кода. есть стандартный uint32_t. А использование своих типов взамен стандартных - вы считаете это тру стиль? в третих.... ну даже если там глаз режет uint32_t. вам милее U32. Дело вкуса. Но, у вас в тайпдефе мина. например typedef signed int SIGNED32; вы пишете какойнибудь код.... допусим расчет CRC на ARM. Один раз написал и забыл. Но встала задача посчитать CRC на Atmega. там int не 32. Вы/коллега/ученик перенёс на АВР ваш код... и упс!!! почему бы не определить так? typedef int32_t SIGNED32; естественно.... так же как и в шаблонах/классах чего? я затронул только переключение бита. инит нужен. его можно и функцией, и макросом, можно классом...можно сразу хором весь порт GPIOA проинитить.... это как вам угодно. Я просто хочу сказать, что не нужно думать бинарно.... у вас либо 0, либо 1. Либо С++ с ООП в полный рост безоговорочно.... с оверинженерингом, либо если один макрос или литерал воткнут - то это непрофессионализм. Использование стандартного литерала х и b - это фу фу фу, магическая цифра.... зато SIGNED32 (при чем с миной) - это круть!!!!
-
А я не против библиотек. я использую и спл, и хал, и калокуб и прямой доступ и классы/шаблоны. Там где удобно использовать 0x82 - я использую. Там где удобно использовать 0b0101010 - я использую. Просто я пояснил, что иногда использование прямого доступа, а также литералов x и b удобнее и даже эффективнее, чем самописные библиотеки/шаблоны. Просто есть религиозные люди, которые сало не едят 0b0101010 - не приемлют ... и начинают учить правильно жить по их вкусу. спасибо большое.... только там куски... какие то... был бы совсем респект, если бы свои pin.рhh в полный рост в студию... и с примером... тогда точно кому-то пригодится, и вы будете рады ;) наверно можно гипотетический пример придумать такой... но #define csOn() (GPIOA->BSRR = (1<<4)) написал за несколько секунд. отлаживать не надо, в использовании csOn(); Теперь какой можно написать класс... гораздо быстрее, который будет столь же эффективней и при этом будет ГОРАЗДО читаемый?