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

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

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

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

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

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


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

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

Pingvin писал(а):
Низкоуровневый драйвер для NRF24 готов.
Считывать из регистров и писать в регистры могу.
Теперь нужно изучать что какой регистр значит.
И подготовить второй модуль.


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

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

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

Не могу ориентироваться в проекте!

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

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


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

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

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

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

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), добавить туда все мои файлы, и пофиг, что не собирается. Он их проиндексирует и будет работать навигация по коду.

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

О блин - не по глазам.
Извиняюсь.

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

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

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

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

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

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

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

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

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

Отлично! :)

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

Хотел бы поделиться историей расследования сложного бага...

С некоторого момента появился довольно неприятный баг в системе 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

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

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

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

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

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


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

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

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