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/ |