[Решено - Тон теперь блокирует] Обновленное ядро, серийный вывод теперь, по -видимому, блокирует

Данстм
Ср. 06 декабря 2017 г., 17:47
Привет,

Мне интересно, видел ли кто -нибудь эту проблему. Я использовал главную филиал (ядро было загружено 23.07.17). После обновления от мастера сегодня я заметил, что мой сериал.Отпечатки теперь занимают в 100 раз дольше или около того. Они, кажется, блокируют и не буферируются.

Итак, некоторые изменения между концом июля и теперь, казалось, вызвали это. Я что -то упускаю?

Спасибо!

Mrburnette
Ср. 06 декабря 2017 18:07
Не быть грубым, но вы могли бы отличить два изображения, если вы поддерживаете старый. Или вы можете посмотреть на изменение Роджера на GitHub.

Я помню некоторые изменения в сериале, но ничего, что не будет показано из этого запроса:
https: // www.Google.com/search?Q = сериал+ ... 2duino.компонент

Луча

Данстм
Ср. 06 декабря 2017 г. 20:07
Я был отброшен тем фактом, что я использовал тон во время моего прошедшего времени. Произошло изменение тона.CPP https: // github.com/rogerclarkmelbourne/ ... эн.CPP#L189 что теперь блокируется, пока тон не завершится. Это было не так раньше.

Рад, что нашел это. Ваше здоровье!

Rogerclark
Ср. 06 декабря 2017 г., 21:19
Были внесены изменения, чтобы привлечь их к официальному API Arduino API

victor_pv
Чт, 07 декабря 2017 г. 2:24 утра
Роджер, я не пробовал тон в доске Arduino, но из примеров и самого кода кажется, что тон не должен блокировать.

Rogerclark
Чт, 07 декабря 2017 г., 3:37 утра
Мне придется посмотреть еще один взгляд, но я подумал, что было 2 режима операции, я.E блокировка и не блокировка

я,.E, если вы указываете продолжительность, она блокирует, а если вы этого не сделаете

Стивестронг
Чт, 07 декабря 2017 г. 10:29
[Rogerclark - Чт, 07 декабря 2017 г. 3:37 утра] - я,.E, если вы указываете продолжительность, она блокирует, а если вы этого не сделаете
Да, это тоже была моя интерпретация (это был мой пиар 8-) )
Я обнаружил, что это имеет тот же контекст: https: // github.com/adafruit/adafruit_ci ... /проблемы/17
Соответственно, мы могли бы в конечном итоге добавить четвертый параметр для Tone () для указания блокировки или не блокировки, чтобы сохранить обратную совместимость.

Или, мы можем проверить в начале Tone (), не играет ли предыдущий тон на одном и том же штифте, и только блокировать в этом случае.

Rogerclark
Чт, 07 декабря 2017 г. 10:48 утра
Стив

Я только что попробовал это на UNO, и это, кажется, не блокирует

Так что нам нужно изменить его на не блокировку

Стивестронг
Чт, 07 декабря 2017 г., 10:50 утра
Хорошо, но по крайней мере, блокируйте в начале, если предыдущий тон играет на одном и том же булавке с заданной продолжительностью.

Mrburnette
Чт, 07 декабря 2017 г. 13:31
С уважением ...

Это обсуждение заключается в том, почему я вообще против взлома в основных файлах без четкого технического мандата относительно изменения ... Интерпретация того, что есть, а что не делается в Ардуино.CC Code Base. Затем есть история ядра Leaflabs, которую, как я считаю, необходимо учитывать, так как на этом сайте есть гора материалов форума, которые здесь повлияют на наши усилия. Эта проблема была озвучена вчера в другом посте в другом посте.

В прошлом было время, где когда -либо член этого форума способен взломать ядро, чтобы удовлетворить их конкретные желания. У нас есть этот опыт сегодня на протяжении всего части нашего сообщества пользователей; Многие пользователи являются новичками с ардуиноидом и ардуино'ишским оборудованием. Каждый день я читаю какой -то пост, который просто не должен был быть опубликовано, потому что ответ легко получается с помощью поиска или с помощью тестового сценария.

По моему мышлению, не является важной проблемой, чтобы следовать за Ардуино.Методология CC точно - при условии, что вики отражает изменения и что мы предлагаем обходную работу для нашей кодовой базы, чтобы имитировать Arduino.база кода CC, когда это возможно. В связи с этим я считаю, что кремний STM32 значительно отличается, так что совершенная переписка 1 :: 1 не требуется.

Почему у продвинутой архитектуры даже есть команды блокировки? Мы старые программисты формулируем зло блокировки - почему мы целенаправленно создадим команду блокировки в ядре?

Основные имена для занятий могут отличаться от официального названия Arduino. Просто документируйте то же самое. Если кому -то это не нравится, он может взломать ядро, изменить имена классов и принимать ответственность за свои вещи. Или они могут унаследовать от основного класса и предоставить новое имя класса A. Просто нет никакого оправдания, чтобы изменить что -то, просто чтобы изменить имя ... кто знает, какие последствия будут происходить?

Добавление параметров в команды является разумным решением, но все же должно быть задокументировано в вики... Мы не можем уйти от документов. Дополнительные параметры должны быть реализованы таким образом, чтобы старое поведение было по умолчанию без указанного параметра, а новое поведение реализовано только тогда, когда указан дополнительный параметр.

У меня есть много других мнений о том, что здесь предлагается «вещи» ... Но это не время или место для расширения моих мнений.

Луча


Официальное командование тона .CC сайт: Генерирует квадратную волну указанной частоты (и 50% рабочего цикла) на выводе. Продолжительность может быть указана, в противном случае волна продолжается до тех пор, пока вызов Нотоне (). Штифт может быть подключен к пьезовидному зуммеру или другому динамику, чтобы воспроизводить тоны.

Только один тон может быть получен за раз. Если тон уже играет на другой булавке, Call to Tone () не окажет никакого эффекта. Если тон играет на одном и том же пинке, вызов установит свою частоту.

Использование функции Tone () будет мешать выводу ШИМ на контактах 3 и 11 (на досках, отличных от мега).

Невозможно генерировать тоны ниже 31 Гц. Технические детали см. Бретт Хагман’S Примечания.
Официальное описание Notone: Останавливает генерацию квадратной волны, вызванной тоном (). Не имеет никакого эффекта, если не генерируется тон.
Если вы хотите воспроизводить разные высоты на нескольких булавках, вам нужно вызовать Notone () на одном PIN.
Кленовая документация из статических лиф.com сайт: Генерирует квадратную волну указанной частоты (и 50% рабочего цикла) на выводе. Продолжительность может быть указана, в противном случае волна продолжается до тех пор, пока вызов Нотоне (). Штифт может быть подключен к пьезовидному зуммеру или другому динамику, чтобы воспроизводить тоны.

Только один тон может быть получен за раз. Если тон уже играет на другой булавке, Call to Tone () не окажет никакого эффекта. Если тон играет на одном и том же пинке, вызов установит свою частоту.

Использование функции Tone () будет мешать выводу ШИМ на контактах 3 и 11 (на досках, отличных от мега).

Примечание. Если вы хотите воспроизводить разные высоты на нескольких булавках, вам нужно вызовать Notone () на одном PIN.

Стивестронг
Чт, 07 декабря 2017 г. 14:52
Рэй, я просто думал, что произойдет, если предыдущий тон будет играть в течение определенной продолжительности, но до того, как продолжительность закончилась, устанавливается новый тон.
ИМХО, эта использование не покрывается официальным описанием команды.
Можно просто слепо следовать описанию и сломать его, играя на новом поле.
Однако это не то, что дает продолжительность как параметр.
Если я укажу продолжительность, то я ожидаю, что эта продолжительность будет сохранена, что -то впоследствии наступит.

victor_pv
Чт, 07 декабря 2017 г. 15:55
[Стивестронг - Чт, 07 декабря 2017 г. 10:50] - Хорошо, но по крайней мере, блокируйте в начале, если предыдущий тон играет на одном и том же булавке с заданной продолжительностью.
Согласно API ARDUINO, если вы позвоните во второй раз в той же булавке во время игры, это только изменяет частоту, не блокирует.

Playtone - это другая функция, возможно, лучше всего добавить, что, если поведение отличается от этого.

От:
https: // www.Ардуино.cc/reference/en/lan ... D-IO/THEN/
Только один тон может быть получен за раз. Если тон уже играет на другой булавке, Call to Tone () не окажет никакого эффекта. Если тон играет на одном и том же пинке, вызов установит свою частоту.

Mrburnette
Чт, 07 декабря 2017 г., 17:44
... и, следовательно, опасность. Два эксперта STM32DUIN.)

Ардуно документация является объемной... Но специфики часто трудно отображать, фактически не анализируя официальные ядра (ы) ... Я не уверен, что Arduino.CC последователен в разных архитектурах.

Луча

victor_pv
Чт, 07 декабря 2017 г., 18:29
Бьюсь об заклад, не согласован, но в любом случае этот документирован, и Роджер провел поведение.
Сохранение старого стиля (неблокирующего) совместимо с Arduino, со старыми Leflabs и наилучшим образом использует MCU.

Если кто -то хочет заблокировать на длительность тона, просто нужно добавить задержку (xx); сразу после.
Если это будет цикл, воспроизводимый мелодию или что -то еще, то любой может написать новую функцию, которая принимает заметку и продолжительность в качестве параметра и вызывает как Tone (), так и задержку ().

Я согласен с вами, что мы должны расходиться с официального ядра или API, когда либо:
-Для лучшей совместимости с Libmaple
-Или для лучшего использования аппаратного обеспечения

Этот случай не соответствует ни одного условия, поэтому нет причин расходиться. Я бы тоже не добавил другой параметр в функцию тона. Это означает добавление большего количества кода внутри, а также больше циклов ЦП и пробелов.
const uint16_t pulseDelay=250; const uint16_t pulseWidth=1000; pinMode(PA1,PWM);// Timer 2 channel 2 output pin Timer2.setPrescaleFactor(72); Timer2.setCompare(2,pulseDelay);// Delay value Timer2.setOverflow(pulseWidth + pulseDelay-1);

Стивестронг
Чт, 07 декабря 2017 г., 18:41
Виктор, ваш пример точно указывает на проблему: какова была бы причина пройти продолжительность, вызывая Tone (), если вам все равно придется добавить задержку впоследствии?
Я бы согласился с вами при вызове тон без продолжительности: // counter setup in one pulse mode, as slave triggered by TI1 TIMER2_BASE->CR1 = ( TIMER_CR1_OPM ); // one pulse mode TIMER2_BASE->SMCR = ( TIMER_SMCR_TS_TI1FP1 | TIMER_SMCR_SMS_TRIGGER );

victor_pv
Чт, 07 декабря 2017 г., 19:45
Проблема в том, что Tone () часто используется для сигнализации тревоги, нажатия клавиш и т. Д.
Вы хотите, чтобы тон длился достаточно долго, чтобы пользователь мог услышать звуковой сигнал, но блокировка вашего кода в течение 200 мс каждый раз, когда пользователь поворачивает ввод энкодера или нажатие клавиши - большая трата циклов ЦП.
Таким образом, вы отправляете команду в звуковой сигнал, и вы занимаетесь своим бизнесом, не заблокируя или звоните в Notone после X MS снова.

Rogerclark
Чт, 07 декабря 2017 г., 8:08 вечера
Для чего -то такого простого, как Tone (), мы должны имитировать, что сделает плата AVR, я не блокирует.

Единственное, что стоит обсудить, это то, разрешаем ли мы разные тона на разных булавках.
На AVR они могут играть только на 1 PIN -коде.


Но мы должны получить основы одинаково, и, следовательно, должны изменить их на работу, как это делает AVR, и просто получить 1 Pint Operation.

Гилхад
Солнце 10 декабря 2017 г. 3:16 утра
[Стивестронг - Чт, 07 декабря 2017 г. 18:41] - Мне было бы очень интересно посмотреть, сколько пользователей используют эту функцию тона, пропустив продолжительность, и какое поведение они ожидают от этого.

Вот какой -то Snipet из одной из моих старых программ Arduino - он звучит в начале, играя в некоторое легкое шоу на индикаторах. Pretty Straighforward - установите звук, чтобы сыграть некоторое время, пока я демонстрирую, что свет работает, а устройство "загружается". (Show (x) Показывает x как двоичное число на светодиодах).

Тон (булавка, частота, продолжительность) не блокируется, иначе он будет выглядеть ужасно.

ИМХО это типичное использование тона, так как в противном случае было бы невозможно легко сделать такие эффекты (что является Arduino все). Таким образом, это легко, и его также легко сделать, добавив задержку () после этого.
#include uint16_t pulseDelay = 3000; uint16_t pulseWidth = 100; void setup() { pinMode(PA1, PWM); // setup PA1 (Timer2 channel 2) to PWM (one pulse mode) pinMode(PA0, INPUT); // setup PA0 (Timer 2 channel 1) as input (capture input mode) Timer2.pause(); // stop the timers before configuring them timer_oc_set_mode(TIMER2, 2, TIMER_OC_MODE_PWM_2, TIMER_OC_PE); Timer2.setPrescaleFactor(72); // 1 microsecond resolution Timer2.setOverflow(pulseWidth + pulseDelay-1); Timer2.setCompare(TIMER_CH2, pulseDelay); // counter setup in one pulse mode, as slave triggered by External input for Timer 2 TIMER2_BASE->CR1 = ( TIMER_CR1_OPM ); // one pulse mode TIMER2_BASE->SMCR = ( TIMER_SMCR_TS_ETRF | TIMER_SMCR_SMS_TRIGGER ); TIMER2_BASE->CCER = ( TIMER_CCER_CC1E | TIMER_CCER_CC2E ); // enable channels 1 and 2 Timer2.refresh(); // start timer 2 Timer2.resume(); // let timer 2 run } void updateDelay(uint16_t dly) { Timer2.setOverflow(pulseWidth + dly-1); Timer2.setCompare(TIMER_CH2, dly); Timer2.refresh(); // start timer 2 } char buf[16]; char *bPos; void loop() { if (Serial.available()) { bPos=buf; while(Serial.available()) { *bPos++ = Serial.read(); } *bPos++='\0'; updateDelay(atoi(buf)); } }

Rogerclark
Солнце 10 декабря 2017 г. 5:26 утра
Да.

Мы установили, что запрос на притяжение изменило функциональность, и это было неверно.

Теперь нам нужно решить эту проблему, однако в данный момент это не единственная проблема, поэтому я исследую одну проблему за раз

Rogerclark
Солнце 10 декабря 2017 г. 5:38 утра
Похоже, частичное исправление - удалить линию 108, добавленную в этот PR

https: // github.com/rogerclarkmelbourne/ ... 5C4E8#L109

Мне нужно будет подключить пьезоугольный динамик к доске и проверить, будет ли это изменение полным исправлением или есть побочные эффекты

Rogerclark
Солнце 10 декабря 2017 г. 6:10
Я удалил линию, которая блокирует, и провел некоторые тесты на время, по сравнению с Arduino Uno, и время моей программы тестирования теперь кажутся идентичными на Uno и Maple Mini.

Пожалуйста, обновите свою локальную копию с последней версией и дайте мне знать, если это решает проблему

Помогите с портированием...

Беспроводная загрузка?