Перейти к содержанию
    

vv_

Участник
  • Постов

    15
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о vv_

  • Звание
    Участник
    Участник
  1. Честно говоря как то плохо дело идет. Мне кажется я что то не правильно понимаю. на стороне клиента (плата с freertos) я сейчас пишу в сокеты сырые данные. И на сервере их обрабатываю. В случае с HTTP Proxy я совсем не понимаю что мне нужно делать. Точнее понимаю, но не знаю как это реализовать. tcp/ip это транспортный протокол, а HTTP - application layer. Т.е. в случае с HTTP мне нужно передавать данные тем же образом, что и раньше, только дополнительно обрамлять некоторой разметкой согласно HTTP 1.* стандарту? Дальше, подключается HTTP Proxy. Тут делаем то же самое, но вдобавок, мне нужно передавать еще некоторые поля для прокси сервера, чтобы он знал куда ходить и куда отправлять. Как это реализовать у себя в прошивке сейчас ума не приложу. Можете подсказать в чем я ошибаюсь, или может думаю не так? куда копать? Так же, я не понял как припаять приложенные библиотеки к проекту.
  2. Спасибо! поизучаю, отпишусь об успехе)
  3. Благодарю за ответ! Я сейчас работаю просто по tcp. Т.е. сырые данные. HTTP нет. Пришёл к мысли, что нужно найти описание протокола HTTP, т.к. HTTP Proxy и посмотреть куда пишутся данные для прокси и сами данные, который прокси передаёт на сторону целевого сервера. Нашёл описание протокола HTTP https://www.ietf.org/rfc/rfc2068.txt, пахнет тем, что действительно нужно будет реализовывать самому все. Я работаю с LWIP стеком версии 1.5.0. Это очень странно, т.к. не думаю, что я первый, кто работает под freertos с HTTP Proxy. Наверняка либа какая то есть. Сейчас свою либу писать дорого. Но если ничего не найдётся, придётся писать свою.
  4. Доброго времени! Нужно сделать поддержку прокси в проекте. ОС FreeRTOS. Сетевой стек LWIP. Я пока ума не приложу как это делается. Никогда этим не занимался. В библиотеке LWIP не нашёл такой штатной функциональности. наверно какую то другую библиотеку нужно подключать. Через обычные сокеты все работает, а вот с прокси не имел дела никогда. Если у вас был опыт или есть мысли на этот счёт, поделитесь пожалуйста. Спасибо! P.S. Появилась информация, нужно научить freeRTOS с LWIP работать с http прокси. Как это можно сделать?
  5. Возможна ли такая ситуация, если я выполняю оператор new еще до того, как запустился шедулер ( osKernelStart();)? У меня есть один участок кода, в котором статический член класса в своём конструкторе вызывается new. Но этот код выполняется еще перед тем, как зайти в main() {...}. Можно ли работать с памятью до запуска ОС?
  6. Я исключил все модули, не относящиеся к эксперименту и действительно, пример заработал. Значит что то ломало кучу. Сейчас буду восстанавливать модуль за модулем. Как выясню в чем было дело, отпишусь. Спасибо =)
  7. Спасибо за советы! Покрыл отладочными состояниями. конструкторы и деструкторы отрабатываются правильно. Предсказуемо) volatile int debug; class MemTest{ public: MemTest() : _p(0) { debug = 0; try{ debug = 1; _p = new char[10000]; debug = 2; } catch(...){ debug = 3; } HAL_GPIO_TogglePin(PAPER_LED_GPIO_Port, PAPER_LED_Pin); MemTest(){ debug = 4; if(_p != 0) delete _p; debug = 5; } private: char * _p; }; class exc{ public: exc(){ debug = 6; } ~exc(){ debug = 7; } }; void exception_debug(void const * argument){ while(true){ try{ MemTest mt; throw exc(); } catch(const exc& e){ osDelay(500); debug = 8; } catch(...){ osDelay(500); } } vTaskDelete(NULL); debug = 10; Error_Handler(); } Но в какой то "случайный" момент (около 20 итераций, каждый раз по разному), поток выполнения программы падает в: /** * @brief This function handles TIM interrupts requests. * @param htim: pointer to a TIM_HandleTypeDef structure that contains * the configuration information for TIM module. * @retval None */ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) ... /* TIM Update event */ if(__HAL_TIM_GET_FLAG(htim, TIM_FLAG_UPDATE) != RESET) { if(__HAL_TIM_GET_IT_SOURCE(htim, TIM_IT_UPDATE) !=RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_UPDATE); HAL_TIM_PeriodElapsedCallback(htim); } ... } В файле startup_stm32f427xx.s вижу, что у меня вызывается прерывание TIM6_DAC_IRQHandler и это значит "TIM6 and DAC1&2 underrun errors" DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors Стек вызовов выглядти так: рис 1 Заметил еще, что при вызове в void vPortFree( void *pv ){...} функции vTaskSuspendAll(); я постоянно попадаю в HAL_TIM_IRQHandler. Если в дебаге пошагать дальше, то можно добраться до следующего виде стека вызовов: рис 2 Интересно то, что после всего этого мы снова возвращаемся к конструктору MemTest, выделяем память, а в деструкторе MemTest при освобождении "_p" история повторяется. При всём этом, если я отслеживаю процесс не в дебаге, то диод у меня или загарается и уже не гаснет или наоборот. Но больше никогда после падения не изменяет своего состояния. А если в дебаге хожу, то после краша я дохожу до места где диод меняет своё значение. Не могу понять как это отловить и как локализовать причину. Сейчас работает только одна таска отладочная и Idle. Больше ничего. Если есть идеи, с удовольствием готов принять и проверять!)
  8. Доброго времени! Пишу проект на C++ в Keil, процессор STM32F4**, ось FreeRTOS V8.2.3, менеджер памяти heap_4. Проект сгенерирован в CubeMX. Столкнулся с ситуацией, когда при обработке исключений на C++ происходит неопределенное поведение. class MemTest{ public: MemTest(){ _p = new char[10000]; } ~MemTest(){ delete _p; } private: char * _p; }; class exc{ public: exc(){} ~exc(){} }; /* таска в которой локализую ошибку */ void exception_debug(void const * argument){ while(true){ try{ MemTest mt; throw exc(); } catch(const exc& e){ osDelay(100); } catch(...){ osDelay(500); } } vTaskDelete(NULL); } Операторы new и delete выглядят так: void *operator new(size_t size){ void *p=pvPortMalloc(size); #ifdef __EXCEPTIONS if (p==0) throw std::bad_alloc(); #endif return p; } void operator delete(void *p){ vPortFree( p ); } Сценарий выполнения выглядит следующим образом: 1. некоторое количество раз (в среднем от 1 до 25) выполняется в цикле try ... catch и мы успешно падаем в блок catch(const exc& e). 2. после последнего удачного раза отработки конструкторов - деструкторов типов MemTest и exc, на следующей итерации, когда я попадаю в деструктор MemTest, выполняю операцию delete и в этот момент у меня выполнение кода передаётся на функцию HAL_TIM_IRQHandler и дальше попадаю в функции HAL для обработки сравнений итп, что касается таймера. Вопрос такой, как определить в какую сторону копать? У меня есть предположение, что в некоторой ситуации крашится шедулер FreeRTOS. Но отловить в какой именно пока не получилось. PS1: Я отслеживаю переполнение хипа и стека. Эти хуки не вызываются, из чего можно сделать вывод, что использование памяти не выходит за границы..
  9. Добрый день!:) Работаю с ml605 и в проекте потребовалось изменять некоторые параметры (до 10ти штук) на нескольких платах (до 6ти). Подскажите пожалуйста, как подобные задачи решаются? Может есть возможность создать конфиг файл, и программа из него читает значения по требованию, или ещё каким то образом? Проект на microblaze, код на си. Спасибо!
  10. Дебаг отключил. Пока блок текста весит 175 кб. Проблема в том, что у меня используется в проекте управление через консоль. простое вычленение printf не спасёт, потому что используются библиотеки stdio и stdargs. Они сами по себе довольно жирные. Наверняка ведь есть какие то технологии хранения блока .text в разных адресных пространствах.
  11. Спасибо за советы! Все работает) Единственное, столкнулся с проблемой, что блок .text не влазит ни в один раздел полностью. Его размер около 153 кб, а максимальный размер одного раздела BRAM можно сделать до 128кб. Оптимизировать код почти на 30кб, это довольно трудоёмкая задача. Есть ли возможность разделить блок .text на 2 блока AXI BRAM или формировать 2 раздела *.text и раскидывать их по разным AXI BRAM?
  12. Какой тогда смысл от axi bram, если основной листинг программы лежит в text? Спасибо.
  13. Спасибо за ответы всем! Я немного уточню задачу. Необходимо, чтобы при включении платы, автоматически загружался MBZ и с CompactFlash грузилась прошивка. Сейчас MBZ и *.elf устанавливаю через XSDK. Так же, на данный момент, проект *.elf загружается в DDR, а нужно чтобы он грузился в BRAM. Можете одробнее описать алгоритм расширения BRAM? И у блока BRAM есть 2 выхода. Как этот блок прицепить на AXI правильно? Как раскидать сегменты типа .text, .init итп, по шинам?
  14. Добрый день! У меня в проекте есть xilinx ml605, microblaze, к нему elf ф-л и ddr, в котором хранится программа, куча и стек. Сейчас появилась задача уйти от DDR, вырезать его из MBZ и перенести elf, кучу и стек в BRAM. Программа в elf занимает 255 Кб. BRAM в MBZ доступно 128 кб. Оптимизируя и урезая программу сильно много места я не выиграю. Получается нужно увеличивать BRAM. Подскажите пожалуйста, возможно ли сделать BRAM = 512 Кб или около того? Если нет, то возможно есть какие то типовые решения данной проблемы? Если я чего то не правильно понимаю, пните в нужную сторону:) Спасибо всем!
×
×
  • Создать...