Search
Write a publication
Pull to refresh
21
0
Владимир Петриго @vpetrigo

Пользователь

Send message

Кстати, если использовать 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В и в солнечную погоду пойди разбери, заморгала она или нет.

Для большей ясности о том, как вызываются mem_copy и mem_zero:


Reset_Handler:
/* Copy the data segment initializers from flash to SRAM */
    ldr r0, =_sidata
    ldr r1, =_sdata
    ldr r2, =_edata
    bl mem_copy
/* Zero BSS section */
    movs r0, #0
    ldr r1, =_sbss
    ldr r2, =_ebss
    bl mem_zero

По факту им без разницы, им передаётся адрес начала и конца секции с которой надо провести манипуляцию.
Если бы это было написано на C:


    // было:
    // uint8_t *data_rom_start_p = &_sidata;
    // uint8_t *data_ram_start_p = &_sdata;
    // uint8_t *data_ram_end_p = &_edata;
    // стало:
    uint32_t *data_rom_start_p = &_sidata;
    uint32_t *data_ram_start_p = &_sdata;
    uint32_t *data_ram_end_p = &_edata;
    // --- mem_copy ---
    while(data_ram_start_p < data_ram_end_p)
    {
        *data_ram_start_p++ = *data_rom_start_p++;
    }

    // было:
    // uint8_t *bss_start_p = &_sbss; 
    // uint8_t *bss_end_p = &_ebss;
    // стало:
    uint32_t *bss_start_p = &_sbss; 
    uint32_t *bss_end_p = &_ebss;
    // --- mem_zero ---
    while(bss_start_p < bss_end_p)
    {
        *bss_start_p++ = 0;
    }

Хотя если ложное срабатывание, после которого надо опять заснуть, происходит один раз из тысячи, то и так сойдет :)

Да, это была редкость, которая возникла пару раз, после чего была исправлена. Но началось всё вообще с того, что 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.

Есть даже очень старая картинка на эту тему:


Как выучить C++ за 21 день

cpp-21days

Я работал с данным приемопередатчиком и его обновленной версией 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 поддерживает.
1

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity