www.open-tager.ru

открытый лазертаг форум
Текущее время: 22 ноя 2024, 10:41

Часовой пояс: UTC + 3 часа [ Летнее время ]


Реклама

Правила форума


В разделе запрещены - обсуждение оборудования не поддерживающего открытых протоколов, реклама и ссылки на готовые продукты лазертага, обсуждение политики производителей и самих производителей. Виден всем.



Начать новую тему Ответить на тему  [ Сообщений: 1076 ]  На страницу Пред.  1 ... 99, 100, 101, 102, 103, 104, 105 ... 108  След.
Автор Сообщение
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 01 фев 2017, 22:46 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 27 ноя 2011, 00:22
Сообщений: 1569
Откуда: Україна
c nRF24 всё как бы просто. Обращайте только внимание на их встроенный фифо, бывают нюансы если не вычитывать или принудительно не обнулять.
А более дешёвый вариант не пробовали вместо nRF24L01+? https://ru.aliexpress.com/item/Free-shi ... 8e8194a20e
Вроде 20-30 руб разницы не имеют, но габариты поменьше и если можно дешевле с тем же функционалом - то почему бы и нет? :)

_________________
Нет предела совершенству, но ресурсы заканчиваются быстро.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 02 фев 2017, 06:08 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Pacifist писал(а):
c nRF24 всё как бы просто. Обращайте только внимание на их встроенный фифо, бывают нюансы если не вычитывать или принудительно не обнулять.
А более дешёвый вариант не пробовали вместо nRF24L01+? https://ru.aliexpress.com/item/Free-shi ... 8e8194a20e
Вроде 20-30 руб разницы не имеют, но габариты поменьше и если можно дешевле с тем же функционалом - то почему бы и нет? :)


Согласен!
В беспроводные смарт-датчики ставить самое оно!
Спасибо за ссылку.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 02 фев 2017, 15:20 
Не в сети
Старожил

Зарегистрирован: 18 мар 2015, 13:19
Сообщений: 574
Откуда: Нижний Новгород
Pingvin писал(а):
Низкоуровневый драйвер для NRF24 готов.
Считывать из регистров и писать в регистры могу.
Теперь нужно изучать что какой регистр значит.
И подготовить второй модуль.


В офциальной документации хорошо описан автомат состояний модуля.

По своему опыту, рекомендую сразу писать нагрузочные тесты. То есть версию прошивки, которая будет интенсивно передавать-принимать чего-нибудь. Это поможет сразу обнаружить всякие нюансы, когда в модуле что-то не обнулилось. Такие подводные камни возникают не сразу, а после сотен-тысяч посланных и принятых пакетов. То есть вроде-бы всё работает как надо на столе, но идешь на игру, и радио "встаёт" :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 02 фев 2017, 19:19 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Не могу ориентироваться в проекте!

Вот в файле caustic-lasertag-system/cpp-sources/universal-device/high-level/src/dev/nrf24l01.cpp

вызов функции, к примеру
setRFChannel(m_RFChannel);


где её реализация?

В хедере описана как void setRFChannel(uint8_t number);

А где реализация то, ё-моё?!

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 02 фев 2017, 19:52 
Не в сети
Старожил

Зарегистрирован: 18 мар 2015, 13:19
Сообщений: 574
Откуда: Нижний Новгород
Pingvin писал(а):
Вот в файле caustic-lasertag-system/cpp-sources/universal-device/high-level/src/dev/nrf24l01.cpp вызов функции, к примеру setRFChannel(m_RFChannel);
А где реализация то, ё-моё?!


В этом же файле в строке 488 :) Вот тут https://github.com/DAlexis/caustic-lase ... 1.cpp#L488
Код:
void NRF24L01Manager::setRFChannel(unsigned char number)
{
    m_RFChannel = number & 0b01111111;
    writeReg(NRF_REG_RF_CH, 1, &m_RFChannel);
}


Все функции класса NRF24L01Manager определены в файле nrf24l01.cpp.

Я рекомендую настроить IDE так, чтобы работал переход к функции по Ctrl+Click, например. В Эклипсе это работает из коробки. Можно просто создать C++ проект (если не работает генерация через CMake, или у вас Windows), добавить туда все мои файлы, и пофиг, что не собирается. Он их проиндексирует и будет работать навигация по коду.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 03 фев 2017, 05:55 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
О блин - не по глазам.
Извиняюсь.

Проект я создал для Eclipse на другом компьютере, но не помню, работают ли там переходы по Ctrl+Click.

Буду изучать исходники пока нет описания протокола. ;)

А то второй модуль подключил, ща начну байтики гонять.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 03 фев 2017, 23:33 
Не в сети
Старожил

Зарегистрирован: 18 мар 2015, 13:19
Сообщений: 574
Откуда: Нижний Новгород
Pingvin писал(а):
Буду изучать исходники пока нет описания протокола. ;)

Описание потихоньку будет пополняться тут: http://ltcaustic.org/for-developers/rcsp.html


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 04 фев 2017, 06:23 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Alexies писал(а):
Pingvin писал(а):
Буду изучать исходники пока нет описания протокола. ;)

Описание потихоньку будет пополняться тут: http://ltcaustic.org/for-developers/rcsp.html

Отлично! :)

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 04 фев 2017, 23:18 
Не в сети
Старожил

Зарегистрирован: 18 мар 2015, 13:19
Сообщений: 574
Откуда: Нижний Новгород
Хотел бы поделиться историей расследования сложного бага...

С некоторого момента появился довольно неприятный баг в системе Caustic. В определенные моменты, очень редко происходит Hard Fault - прерывание, которое случается, когда что-то идет совсем не так. Например, запись по невалидному адресу, или передача управления области памяти, в которой выполнение кода запрещено. Причем Hard Fault происходит сам собой в непредсказуемом месте. Воспроизвести специально - не получается, баг может не проявляться часами. Известно только, что если создать большую нагрузку из сетевых и bluetooth-пакетов, он проявляется с бОльшей вероятностью.

После долгого анализа кода до меня дошло, что не так. Я использую в коде стандартные контейнеты STL (vector, list, map, queue, string и т.п.). Кроме того, я иногда явно использую new/delete, умные указатели и т.п. Короче говоря, использую динамическую память. Также, её используют все стандартные контейнеры STL. Делать так - хорошая практика, STL позволяет писать меньше кода, не изобретать велосипеды, совершать меньше ошибок (STL идеально отлажена) и экономить оперативную память.

Работа с динамической памятью в облегченной версии libc для микроконтроллера (эта версия называется newlib) осуществляется через функцию-драйвер _sbrk. Этот драйвер реализует пользователь (у меня вот так: https://github.com/DAlexis/caustic-lase ... lib.c#L109 ) Когда libc считает, что уже выделенного хипа мало, она просто вызывает _sbrk(количество_байт_которые_нужно_выделить). Думаю практически все, кто программирует stm32 под GCC, это знают. Структура хипа (где какие фрагменты памяти сейчас свободны или заняты) находится в ведении libc, реализовывать самому это не нужно, это и так сделано хорошо.

Пока все в порядке. Точно так же libc работает и на компьютере, _sbrk там - по-сути просто системный вызов. Причем new/delete (malloc/free) всегда потокобезопасны под Windows и под Linux. Тут начинается самое интересное: про FreeRTOS системная библиотека ничего не знает. Поэтому крайне редко, но случается ситуация, когда один поток выполняет, например, операцию new, не успевает её закончить, и управление передается другому потоку, который тоже вызывает new/delete. Обыкновенный data race, структура хипа портится, и программа идет в разнос: возникают невалидные адреса, переписывается чужая память и случается hard fault.

Очевидное решение - защитить heap мьютексами. В C++ возможно глобальное переопределение операций new и delete. Я добавил примерно следующий код:
Код:
void * operator new(std::size_t n)
{
   ScopedLock<Mutex> lck(Kernel::heapMutex);
   Kernel::heapAllocatedTotal += n;
    return malloc(n);
}
void operator delete(void * p)
{
   ScopedLock<Mutex> lck(Kernel::heapMutex);
    free(p);
}

void *operator new[](std::size_t n)
{
   ScopedLock<Mutex> lck(Kernel::heapMutex);
   Kernel::heapAllocatedTotal += n;
   return malloc(n);
}

void operator delete[](void *p) throw()
{
   ScopedLock<Mutex> lck(Kernel::heapMutex);
    free(p);
}


Здесь ScopedLock - полный аналог unique_lock на компьютере, просто RAII-холдер, а Mutex - класс-обертка для мьютекса во FreeRTOS


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Система Caustic
СообщениеДобавлено: 05 фев 2017, 08:05 
Не в сети
Аксакал форума
Аватар пользователя

Зарегистрирован: 12 авг 2011, 16:55
Сообщений: 7514
Откуда: Барнаул, Алтайский край (не путать с республикой Алтай) :-)
Первым делом проверьте приоритеты прерываний, в которых используются функции FreeRTOS вызываемые из прерываний (названия их начинаются с fromISR...)
Приоритеты этих прерываний должны быть ниже, чем приоритет прерывания шелдера (или как его там).
Максимальный допустимый приоритет таких прерываний настраивается в конфигах FreeRTOS.

Я получал по лбу этими граблями.
Причем вылет совсем непредсказуем.
Могло и сразу вылететь, могло и долго проработать.

Как все это дело отстроил - ни одного вылета (тьфу, тьфу, тьфу...)

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


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

Пока находитесь в критической секции, поток не будет прерываться планировщиком.

_________________
Ваше оружие становиться значительно эффективней, если его снять с предохранителя!


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 1076 ]  На страницу Пред.  1 ... 99, 100, 101, 102, 103, 104, 105 ... 108  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB