www.open-tager.ru
http://open-tager.ru/forum/

Система Caustic
http://open-tager.ru/forum/viewtopic.php?f=5&t=4128
Страница 103 из 108

Автор:  Alexies [ 05 фев 2017, 12:10 ]
Заголовок сообщения:  Re: Система Caustic

Pingvin писал(а):
Первым делом проверьте приоритеты прерываний, в которых используются функции FreeRTOS вызываемые из прерываний (названия их начинаются с fromISR...)

С этого я начал, как с самого очевидного варианта :)

Pingvin писал(а):
Цитата:
Поэтому крайне редко, но случается ситуация, когда один поток выполняет, например, операцию new, не успевает её закончить, и управление передается другому потоку, который тоже вызывает new/delete.

А на что даны критические секции?
Входите в критическую секцию, делаете new, выходите.

Критические секции FreeRTOS даны, вообще-то, немного для другого (не путать с критическимим секциями Windows!) :) Для простого предотвращения "гонки данных" есть мьютексы и семафоры. В данном случае правильнее применять мьютекс. Рекомендую на досуге разобраться в этом вопросе, потом кучу времени спасёте.

Да, можно было бы вручную оборачивать вручную каждый new/delete, а заодно все операции со стандартными контейнерами, ведь контейнеры постоянно используют new/delete :) Получился бы совсем плохой код, и всегда оставался бы шанс забыть добавить блокировку. Это - плохой стиль :)

А вот правильное решение такой проблемы я как раз и описал в предыдущем посте. Все происходит автоматически и только при операциях с хипом. Никаких лишних блокировок и изменения кода.

Автор:  Pingvin [ 05 фев 2017, 12:15 ]
Заголовок сообщения:  Re: Система Caustic

У меня широко используются и мьютексы, и очереди. ;) :)
Я не спорю, что Вы нашли оптимальное решение - ваш, код, Вам видней.

Кстати - а где в коде "отпускание" мьютекса?

Автор:  Alexies [ 06 фев 2017, 00:52 ]
Заголовок сообщения:  Re: Система Caustic

Pingvin писал(а):
Кстати - а где в коде "отпускание" мьютекса?


В деструкторе объекта ScopedLock. Он полностью эквивалентен std::unique_lock ( http://www.cplusplus.com/reference/mutex/unique_lock/ ).

Зачем это надо? Это называется RAII ( https://ru.wikipedia.org/wiki/%D0%9F%D0 ... 0%B8%D1%8F ) - простой паттерн, позволяющий избегать ошибок при владении какими-либо ресурсами.
Пусть у нас есть класс Mutex с методами lock() и unlock(). Мы, конечно, можем писать код так:
Код:
myMutex.lock()
<некоторые операции>
myMutex.unlock()

Пока все выглядит неплохо. Но представим, что код немного сложнее:
Код:
void myFunc()
{
    myMutex.lock()
    <операции>
    if (<условие1>)
    {
        <операции>
        myMutex.unlock()
        return;
    }
    <что-то ещё>
    if (<условие2>)
    {
        <операции>
        myMutex.unlock()
        return;
    }
    <что-то ещё>
    if (<условие3>)
    {
        <операции>
        myMutex.unlock()
        return;
    }
    <операции>
    myMutex.unlock()
    return;
}

Это некоторая функция с несколькими точками выхода. Перед каждым return нужно не забыть отпустить мьютекс. Кроме того, если речь идет не об микроконтроллере, то код может генерировать исключения, и функция завершится в непредсказуемом месте. Может оказаться, что до unlock() не дойдет. Мы получим мьютекс, который никто не отпустил. Есть и другие аналогичные ситуации. На худой конец, можно просто забыть написать unlock(). Чтобы такого не было, создается специальный объект-обертка ScopedLock. Этот объект забирает мьютекс в конструкторе и отдает автоматически в деструкторе (ну или можно принудительно отдать раньше деструктора). Таким образом гарантируется, что когда закончится время жизни ScopedLock, мьютекс будет отпущен.

В C++ использовать мьютексы напрямую не нужно практически никогда, всегда следует прибегать к RAII-обертке.

Автор:  Pingvin [ 06 фев 2017, 10:12 ]
Заголовок сообщения:  Re: Система Caustic

Понятно!

Автор:  Pingvin [ 08 фев 2017, 08:44 ]
Заголовок сообщения:  Re: Система Caustic

Приветствую!
На данным момент интересует, как настраиваются радиомодули, с какими параметрами?
Я так понял, все устройства равны в сети?
И бандана с тагом общаются по "общей сети"?
У всех устройств один адрес - какой?

Верно ли понимаю, что автодтверждение отключено?
Какой канал используется?
Скорость обмена?
И т.д...

Цитата:
0x02 EN_RXADDR

Выбирает активные каналы приёмника.


То есть активных каналов может быть несколько?
И модуль будет следить за всеми одновременно?

P.S. Может ветку заведём по радиомодулям отдельную?
Чтобы тут не флудить.

Автор:  Alexies [ 08 фев 2017, 12:32 ]
Заголовок сообщения:  Re: Система Caustic

Pingvin писал(а):
Может ветку заведём по радиомодулям отдельную?
Чтобы тут не флудить.

Окей, я завел: viewtopic.php?f=5&t=4959

Вопросы ниже имеют все-таки отношение к использованию NRF в Caustic, поэтому пока отвечу здесь:
Pingvin писал(а):
На данным момент интересует, как настраиваются радиомодули, с какими параметрами?
Я так понял, все устройства равны в сети?
И бандана с тагом общаются по "общей сети"?
У всех устройств один адрес - какой?
Верно ли понимаю, что автодтверждение отключено?
Какой канал используется?
То есть активных каналов может быть несколько?
И модуль будет следить за всеми одновременно?
Скорость обмена?
И т.д...

В моем коде вся инициализация сделана в функции void NRF24L01Manager::init() : https://github.com/DAlexis/caustic-lase ... 1.cpp#L176 . Все вещи, про которые пишу ниже, настраиваются из этой функции.

Все устройства в общей сети по одному хардварному адресу. Я не меняю тот, что стоит по-умолчанию, e7 e7 e7 e7 e7, и использую свою адресацию поверх этой. Бандана с тагом тоже в общей сети.

В модуле NRF24 предусмотрено 5 "каналов приема" с разными nrf-адресами. Но nrf-адреса могут отличаться только последним байтом, и все они все равно на одной частоте. Просто при приеме пакета радиомодуль скажет, какому каналу пакет принадлежит. Функция бесполезная, когда есть своя адресация поверх nrf.

Автоподтверждение средствами NRF24 отключено. Эту функцию я реализую сам, потому что встроенная в NRF слишком примитивна.

Канал, по-моему, везде стоит номер 1. Это последний параметр функции NRF24L01Manager::init(). Помнится, Вы находили документ, из которого вытекает, что в России можно использовать мощные радиомодули nrf, если канал 101-125. Так что в дальнейшем канал изменю на какой-нибудь разрешенный.

Скорость обмена - у меня стоит 1М. Нужно будет понизить до 250к - это умеют новые модули. Мой код пока не поддерживает такой режим, как руки дойдут - добавлю. Скорости 250к хватит на всё, зато дальность заметно возрастет.

Автор:  Pingvin [ 08 фев 2017, 13:00 ]
Заголовок сообщения:  Re: Система Caustic

Спасибо за оперативный ответ!
Буду пробовать.
Про нормативы тут http://aterlux.ru/index.php?page=article&art=nrf24l01p
Цитата:
Использование радиоэлектронных средств в России регулируется Правилами регистрации радиоэлектронных средств и высокочастотных устройств. Раздел «Изъятия из перечня радиоэлектронных средств и высокочастотных устройств, подлежащих регистрации» определяет перечень радиочастотного оборудования, не подлежащего регистрации. В частности, пункт 24 разрешает использование частот 2400-2483,5 Мгц в устройствах малого радиуса действия, используемых «в сетях беспроводной передачи данных в полосе радиочастот 2400 - 2483,5 МГц, с максимальной эквивалентной изотропно излучаемой мощностью передатчика не более 100 мВт при использовании прямого расширения спектра и других отличных от псевдослучайной перестройки рабочей частоты видов модуляции ... при максимальной спектральной плотности эквивалентной изотропно излучаемой мощности 2 мВт/МГц».

Т.е. допускается использование передатчиков nRF24L01 на каналах 0...83 (2400...2483 МГц) без усилителей мощности сигнала.

Условия использования частот в диапазоне от 2500Мгц изложены в п.13:

«Пользовательское (оконечное) оборудование передающее, включающее в себя приемное устройство, работающее в полосах радиочастот 2300 - 2400 МГц, 2500 - 2690 МГц, 3400 - 3450 МГц и 3500 - 3550 МГц, с допустимой мощностью излучения передатчика не более 1 Вт, в том числе встроенное либо входящее в состав других устройств»

Т.е. допускается использование модулей nRF24L01 на каналах 100...125 (2500...2525 МГц) с усилителем мощности.

Как видно, документ не описывает использование частот в диапазоне 2484 – 2499 МГц. Т.е. использовать каналы 84...99 (2484...2499 МГц) передатчиков nRF24L01 не допускается.


По FIFO ещё есть вопросы, но сначала сам поищу информацию, попробую разобраться.

Автор:  Pacifist [ 08 фев 2017, 13:37 ]
Заголовок сообщения:  Re: Система Caustic

Alexies писал(а):
...В модуле NRF24 предусмотрено 5 "каналов приема" с разными nrf-адресами. Но nrf-адреса могут отличаться только последним байтом, и все они все равно на одной частоте. Просто при приеме пакета радиомодуль скажет, какому каналу пакет принадлежит. Функция бесполезная, когда есть своя адресация поверх nrf..

Немного не так. Есть 6 каналов приёмника. Причём 1-й и 2-й могут иметь уникальный адрес, а вот остальные с 3-го по 6-й привязаны к адресу 2-го канала.
Функция не такая уж и бесполезная. Если допустим есть устройство, которое работает ТОЛЬКО с основной платой ружья (допустим повязка или жилет), то можно задать ему свой уникальный адрес на 2-м канале и кроме платы своего ружья его не услышит никто. А на первом канале уже организовывать сеть с ретрансляцией пакетов для управления ружьями, сбора статистики и т.д.
Я не призываю так делать, это просто пример для чего может быть полезен второй канал.

Автор:  Pingvin [ 08 фев 2017, 16:10 ]
Заголовок сообщения:  Re: Система Caustic

Pacifist писал(а):
Alexies писал(а):
...В модуле NRF24 предусмотрено 5 "каналов приема" с разными nrf-адресами. Но nrf-адреса могут отличаться только последним байтом, и все они все равно на одной частоте. Просто при приеме пакета радиомодуль скажет, какому каналу пакет принадлежит. Функция бесполезная, когда есть своя адресация поверх nrf..

Немного не так. Есть 6 каналов приёмника. Причём 1-й и 2-й могут иметь уникальный адрес, а вот остальные с 3-го по 6-й привязаны к адресу 2-го канала.
Функция не такая уж и бесполезная. Если допустим есть устройство, которое работает ТОЛЬКО с основной платой ружья (допустим повязка или жилет), то можно задать ему свой уникальный адрес на 2-м канале и кроме платы своего ружья его не услышит никто. А на первом канале уже организовывать сеть с ретрансляцией пакетов для управления ружьями, сбора статистики и т.д.
Я не призываю так делать, это просто пример для чего может быть полезен второй канал.


Именно это и хотел узнать - возможность находится одновременно в двух или более "независимых" сетях.

Автор:  Alexies [ 08 фев 2017, 16:22 ]
Заголовок сообщения:  Re: Система Caustic

Pingvin писал(а):
По FIFO ещё есть вопросы, но сначала сам поищу информацию, попробую разобраться.

Там ничего особенного, просто очередь на 3 пакета.

Pacifist писал(а):
Немного не так. Есть 6 каналов приёмника. Причём 1-й и 2-й могут иметь уникальный адрес, а вот остальные с 3-го по 6-й привязаны к адресу 2-го канала.

Да, все верно, 6 каналов, я ошибся)

Pingvin писал(а):
Pacifist писал(а):
Если допустим есть устройство, которое работает ТОЛЬКО с основной платой ружья (допустим повязка или жилет), то можно задать ему свой уникальный адрес на 2-м канале и кроме платы своего ружья его не услышит никто. А на первом канале уже организовывать сеть с ретрансляцией пакетов для управления ружьями, сбора статистики и т.д.
Я не призываю так делать, это просто пример для чего может быть полезен второй канал.

А я бы так и сделал.

Разгрузить физический канал все равно не выйдет, частота одна на всех. Плюс, на HW-адреса есть некие ограничения, связанные с особенностями приемного тракта.

Страница 103 из 108 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/