Кстати, если использовать list initialization, которое рекомендуется к применению, которое не разрешает преобразование целочисленных типов, если в принимающий тип не влезает итоговое значение, то GCC и Clang выдают предупреждение:
ucast.cpp:4:38: error: constant expression evaluates to 4294967292 which cannot be narrowed to type 'int' [-Wc++11-narrowing]
std::cout << "-3/3u*3 = " << int{-3/3u*3} << std::endl;
Только отдельного MCU в кнопке не хватало для полного счастья. :)
Выглядит она стильно, но нет понимания, нажал ты её или нет. У меня рядом с домом на пешеходном переходе установили похожую кнопку в светофоре. Там, похоже, подсветка запитана от 3.3В и в солнечную погоду пойди разбери, заморгала она или нет.
Хотя если ложное срабатывание, после которого надо опять заснуть, происходит один раз из тысячи, то и так сойдет :)
Да, это была редкость, которая возникла пару раз, после чего была исправлена. Но началось всё вообще с того, что QA-инженер сказал, что ему тяжело давить на кнопку и что раньше было лучше. :)
И да, и нет. :)
Изменения в CRT, которые описаны выше, делаются наивным способом — убирается суффикс b, отвечающий за побайтовую операцию записи/чтения. И меняется размер смещения адреса с 1 на 4. Ускорение в 4 раза уже есть, менять порядок работы в startup пока не нужно, если всё устраивает. :)
У этого проекта тоже была цель максимально сохранить батарейку. :)
Собственно, аналогичные манипуляции по сокращению времени старта системы были также сделаны. Просто в любом случае зачем греть воздух при инициализации памяти?) Врядли качество обнуления зависит от того пишем мы нули побайтово или целыми словами.
Да. При переходе на другой источник тактовой частоты всё равно есть некоторые задержки (ожидание готовности источника, например), но в целом это существенно помогает ускорить выполнение стартового кода.
Справедливое замечание. :)
Мы переключаем контроллер на работу от 80 МГц. В статье на это не акцентировалось внимание, но сейчас это переключение происходит до копирования/установки оперативной памяти.
Но хотелось показать, в чем корень проблемы на программном уровне, потому что у кого-то не будет возможности это сделать.
Вообще проблему решает обычный RS триггер с установкой от кнопки и сбросом после запуска МК
Да, конечно, особенно если кнопка используется только, например, для пробуждения. Но если есть необходимость помимо пробуждения отслеживать длительность нажатия, то тут уже не совсем подойдёт данное решение, к сожалению.
В CRT не реализация memcpy/memset, а процедур, которые позволяют скопировать секцию .data (memory_copy) из Flash в RAM или обнулить секцию .bss (memory_set). О реализации memcpy в стандартной поставке CrossWorks/SES ничего плохого пока сказать не могу. Для встраиваемых систем в основном встречаются подобные реализации.
Когда я увидел реализацию в CRT, то у меня тоже были вопросы, зачем это всё делать побайтно, если инструкции по времени выполнения и по конечному результату не различимы.
По своему небольшому опыту работы с mbed могу сказать, что там можно экспортировать проект во взрослую IDE (Keil uVision, IAR и т.д.) и отлаживать уже там. Здесь, на мой взгляд, суть такая же как у Arduino.
Я работал с данным приемопередатчиком и его обновленной версией Si4462. Дальность связи сильно зависит от типа модуляции, частотного диапазона и скорости передачи данных. В режиме 4GFSK, на скорости 10 кбит/с и частоте 868 МГц дальность связи была ~500 метров с 1/4 антеннами.
Насколько я понял из описания, Nordic (а этот китайский модуль сделан именно на базе микросхемы от этой компании) разработал для них свой проприетарный стек. К сожаление, я с ними не работал, поэтому ничего конкретного сказать не смогу.
Silabs старается максимально упростить задачу разработчикам, которые используют их ZigBee-микросхемы. Они сделали Application Builder, с помощью которого можно выбрать необходимые стандартные профили и callback-функции, которые будут вызываться при возникновении различных событий, например:
необходимо задать начальное состояние лампочки/установить значение счетчика? Включите callback-функцию, которая будет вызвана при инициализации. Application Builder создаст пустую функцию, где вы сможете описать необходимую логику работы.
что делать, если пришла команда на изменение яркости? Если нужно обрабатывать такую команду, то выбираете соответствующий callback и в нем уменьшаете скважность ШИМ или управляете электронным реостатом.
В статье про работу со стеком ZigBee от Silabs (Ember ZNet PRO) я разберу эти вопросы.
Ага, у нас на сайте можно почитать общие слова об отличиях. По сути были объединены преимущества технологии ZigBee (поддержка mesh-топологии, ретрансляция пакетов, самовосстановление и др.) + 6LoWPAN (использование IPv6 на сетевом уровне и UDP на транспортном).
К сожалению, я не ставил для себя цели в данной статье сделать обзор на все беспроводные технологии связи. Z-Wave, на мой взгляд, не очень интересен в том плане, что устройства из различных территориальных зон несовместимы между собой ввиду того, что используются различные разрешенные частоты (для России это 869 МГц, для Европы 868,4, 869,85 и т.д.). Но тут как говориться на вкус и цвет… Плюс это полностью закрытый протокол, права на который принадлежат компании Sigma Design. Соответственно чипы и реализацию программного стека можно достать только у них.
У Яндекс.Диска для Windows похожая возможность есть. Правда нет возможности делать снимок произвольной области, но зато есть встроенный редактор, который и Ctrl+Z поддерживает.
Кстати, если использовать list initialization, которое рекомендуется к применению, которое не разрешает преобразование целочисленных типов, если в принимающий тип не влезает итоговое значение, то GCC и Clang выдают предупреждение:
Только отдельного MCU в кнопке не хватало для полного счастья. :)
Выглядит она стильно, но нет понимания, нажал ты её или нет. У меня рядом с домом на пешеходном переходе установили похожую кнопку в светофоре. Там, похоже, подсветка запитана от 3.3В и в солнечную погоду пойди разбери, заморгала она или нет.
Для большей ясности о том, как вызываются
mem_copy
иmem_zero
:По факту им без разницы, им передаётся адрес начала и конца секции с которой надо провести манипуляцию.
Если бы это было написано на C:
Да, это была редкость, которая возникла пару раз, после чего была исправлена. Но началось всё вообще с того, что QA-инженер сказал, что ему тяжело давить на кнопку и что раньше было лучше. :)
И да, и нет. :)
Изменения в CRT, которые описаны выше, делаются наивным способом — убирается суффикс
b
, отвечающий за побайтовую операцию записи/чтения. И меняется размер смещения адреса с 1 на 4. Ускорение в 4 раза уже есть, менять порядок работы в startup пока не нужно, если всё устраивает. :)У этого проекта тоже была цель максимально сохранить батарейку. :)
Собственно, аналогичные манипуляции по сокращению времени старта системы были также сделаны. Просто в любом случае зачем греть воздух при инициализации памяти?) Врядли качество обнуления зависит от того пишем мы нули побайтово или целыми словами.
Да. При переходе на другой источник тактовой частоты всё равно есть некоторые задержки (ожидание готовности источника, например), но в целом это существенно помогает ускорить выполнение стартового кода.
Нет. :) Почему?
Справедливое замечание. :)
Мы переключаем контроллер на работу от 80 МГц. В статье на это не акцентировалось внимание, но сейчас это переключение происходит до копирования/установки оперативной памяти.
Но хотелось показать, в чем корень проблемы на программном уровне, потому что у кого-то не будет возможности это сделать.
Поправил, спасибо.
Да, конечно, особенно если кнопка используется только, например, для пробуждения. Но если есть необходимость помимо пробуждения отслеживать длительность нажатия, то тут уже не совсем подойдёт данное решение, к сожалению.
В CRT не реализация
memcpy
/memset
, а процедур, которые позволяют скопировать секцию.data
(memory_copy
) из Flash в RAM или обнулить секцию.bss
(memory_set
). О реализацииmemcpy
в стандартной поставке CrossWorks/SES ничего плохого пока сказать не могу. Для встраиваемых систем в основном встречаются подобные реализации.Когда я увидел реализацию в CRT, то у меня тоже были вопросы, зачем это всё делать побайтно, если инструкции по времени выполнения и по конечному результату не различимы.
По своему небольшому опыту работы с mbed могу сказать, что там можно экспортировать проект во взрослую IDE (Keil uVision, IAR и т.д.) и отлаживать уже там. Здесь, на мой взгляд, суть такая же как у Arduino.
Есть даже очень старая картинка на эту тему:
Я работал с данным приемопередатчиком и его обновленной версией Si4462. Дальность связи сильно зависит от типа модуляции, частотного диапазона и скорости передачи данных. В режиме 4GFSK, на скорости 10 кбит/с и частоте 868 МГц дальность связи была ~500 метров с 1/4 антеннами.
Насколько я понял из описания, Nordic (а этот китайский модуль сделан именно на базе микросхемы от этой компании) разработал для них свой проприетарный стек. К сожаление, я с ними не работал, поэтому ничего конкретного сказать не смогу.
А можно вас попросить ссылку на данные чипы? Не нашел ничего про них.
Silabs старается максимально упростить задачу разработчикам, которые используют их ZigBee-микросхемы. Они сделали Application Builder, с помощью которого можно выбрать необходимые стандартные профили и callback-функции, которые будут вызываться при возникновении различных событий, например:
В статье про работу со стеком ZigBee от Silabs (Ember ZNet PRO) я разберу эти вопросы.
Ага, у нас на сайте можно почитать общие слова об отличиях. По сути были объединены преимущества технологии ZigBee (поддержка mesh-топологии, ретрансляция пакетов, самовосстановление и др.) + 6LoWPAN (использование IPv6 на сетевом уровне и UDP на транспортном).
К сожалению, я не ставил для себя цели в данной статье сделать обзор на все беспроводные технологии связи. Z-Wave, на мой взгляд, не очень интересен в том плане, что устройства из различных территориальных зон несовместимы между собой ввиду того, что используются различные разрешенные частоты (для России это 869 МГц, для Европы 868,4, 869,85 и т.д.). Но тут как говориться на вкус и цвет… Плюс это полностью закрытый протокол, права на который принадлежат компании Sigma Design. Соответственно чипы и реализацию программного стека можно достать только у них.