Jump to content

    

Neo_Matrix

Участник
  • Content Count

    136
  • Joined

  • Last visited

Everything posted by Neo_Matrix


  1. В первом сообщении закралась ошибка, vDeleteUart необходимо заменить на vDeleteSTR. Немного промахнулся с копи-пастом. zltigo Хорошо, как тогда его использовать? С "мейна" все работает хорошо, как хэндл использовать в "библиотечном" файле? Просто написать в начале irq.c BaseType_t vDeleteSTR; или TaskHandle_t vDeleteSTR; Както так?
  2. Такая проблема: Есть файл main.c в нем имеется задача РТОС, которая объявлена как void vDeleteSTR(void const * argument); сама функция такая void vDeleteUart(void const * argument) { //Здесь удаляем строку vTaskSuspend(NULL); // Здесь засыпаем, пока прерывание не разбудит... } Сам обработчик прерывания вынесен в отдельный файл допустим irq.c void USART3_IRQHandler(void) { xTaskResumeFromISR(vDeleteUart);// Пробовал писать так } Но чего и следовало ожидать, vDeleteUart не объявлена в irq.c, соответственно при компиляции ошибка. Как правильно сделать? extern void vDeleteSTR(void const * argument); - пробовал - не работает. Спасибо всем.
  3. К сожалению не изменилось нечего :( Кроме: * @file stm32f4xx_hal_def.h * @author MCD Application Team * @version V1.4.4 * @date 22-January-2016 * @brief This file contains HAL common defines, enumeration, macros and * structures definitions. Часть кода соответствует Вашей :) Толком с отладкой я еще не разобрался, но зависало именно в тот момент, когда отправку данных перебивал прием по прерыванию. ХАЛ конечно зло, но учить ЦМСИС желания нет, да и код какой то сложно читаемый после него. В СПЛ уже достало делать инициализацию, когда то с таймером промучился почти 2 дня. Надеюсь они ХАЛ допилят.
  4. esaulenka,gazpar Спасибо за помощь. Уже немного разобрался в отладке..... Зло было найдено, это была соседняя функция которая в этот момент слала данные в тот же USART TX. Было так: HAL_UART_Transmit (&huart3,(uint8_t *)"AT\r",3,100); т.е. прерывания не было. А так все нормально: HAL_UART_Transmit_IT(&huart3,(uint8_t *)"AT\r",3); В цикле отправка без прерывания, а прием по прерываниям работает, под РТОС почему то нет. Или это HAL виноват...
  5. Как можно заметить задача именуется vTemp. Это временное решение, созданное для вывода отладки в ЮАРТ. Этой задачи вовсе не должно было быть. Потому с семафорами я не заморачивался. Если бы я видел, где повисло уже и сам бы решал проблему. Вечером буду пробовать по добавлять отладки в код РТОСа. Дело вовсе не в ссылке, а в примере который там показан. esaulenka не нужно так агрессивно относится к заданным вопросам, не все так хорошо знакомы с РТОСом, как Вы. После всего прочитанного, мне стало ясно как отлаживать РТОСом, возможно скоро я и найду причину беды, если нет - перепишу с нуля обработчик прерывания и ф-кцию.
  6. Немного добавлю по отладке. Есть задача, которая в цикле запускает вышеуказанную функцию. Собственно вот: void vTemp(void const * argument) { for(;;) { uint16_t leng; //Длина строки до знака \n uint8_t resp; //Собственно сам ответ 0,1,2,3..... if(uart3_not_empty) //Обработчик прерывания устанавливает флаг 1\0 { leng = uart3_readline(); //вычисляем длину строки вместе с \r\n sprintf(debug_buff, "leng: %d, line: %s", len, Uart3RXBuf); //формировка данных в соседний порт для отладки(длина строки и сама строка) USART_STR(USART6, debug_buff); //просто отправка данных в соседний порт для отладки resp = process_response(uart3_fifo_line,len); // тут вызов глючной функции sprintf(debug_buff, "resp: %d \r\n", resp); //формовка TM_USART_Puts(USART6, debug_buff); //отправка для отладки } } } Как видно в начале происходит проверка на новые данные if(uart3_not_empty), и даже если условие if не выполнено, все равно все висло. uart3_not_empty инициализируется 0-лем, в прерывании флаг ставится в 1. Зависон просходил даже при условии отсутствия данных на ком порте, но только при условии, что в функции process_response вариантов if(if else) более трех. О, теперь понятно!!! Спасибо! Еще добавлю, на сайте РТОС есть такое: Known Issues with the Current Version Heap_4.c cannot be used on 8-bit devices (FreeRTOS V8.2.1) A typo in the calculation of xHeapStructSize means heap_4.c cannot be used to provide the heap when FreeRTOS is being built for an 8-bit microcontroller. Software timers and FreeRTOS-MPU The software timer API is not yet included in the official distribution of FreeRTOS/source/include/mpu_wrappers.h. Может как то связано.....
  7. gazpar Настройка прерываний следущая HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); HAL_NVIC_SetPriority(USART3_IRQn, 5, 0); esaulenka Я увеличивал стек и кучу в 2 раза, это нечего не меняло. Тут полностью согласен, но у меня размер очередей одинаков, так что должно работать. Я не могу понять где оно валится в хардфолт, отладка как то странно работает под РТОС, попробую еще с отладкой разобраться(РТОС первый раз использую).
  8. gazpar Странно, что работает: void *memchr(const void *buffer, int ch, size_t count); Эта функция возвращает указатель на первый из символов ch, входящих в массив buffer, или нулевой указатель, если символ ch не найден. Сама реализация вполне рабочая. И совершенно не важно, что там идет после if (if else), можно хоть сравнение добавить uint8_t a=1; if(a==1); все равно функция виснет. esaulenka Глубже копать уже просто некуда(ну или я не вижу). В конечном счете выяснил, что при всех вариантах heap,кроме heap_4 все работает. Даже на heap_5 работает, а он почти тот же heap_4. Остановился на heap_2. Маалоков нет. Динамические только очереди и пару задач временами убиваются/создаются.
  9. Имеется плата на stm32f407 камне. Пытаюсь написать функцию парсинга ответов от модема, но при добавлении любой строки в функцию - получаю полное зависание проца. Как отлаживать не могу понять, так как присутствует FreeRTOS. Собственно сама функция выглядит так: uint8_t modemresponse(char * data, uint16_t leng) { if(iblanks(Uart3RXBuf, leng)) { return 0; } else if(memchr(data, '+', leng) && memchr(data, ':', leng)) { return 1; } else if(strstr(data,"ERROR") != NULL) { return 2; } else { return 3; } } Если сделать как ниже, то все работает. Тоесть достаточно закоментировать любой из else if или даже else. Если закоментировать один вариант выбора и вместо него в конец функции подставить хотя бы HAL_UART_Transmit(&huart6,(uint8_t *)"Zavislo\r",8,100); или все что угодно - опять висяк. uint8_t modemresponse(char * data, uint16_t leng) { if(iblanks(Uart3RXBuf, leng)) { return 0; } else if(memchr(data, '+', leng) && memchr(data, ':', leng)) { return 1; } //else if(strstr(data,"ERROR") != NULL) //{ // return 2; //} else { return 3; } } Когда то с таким сталкивался и проблема была в размере СТОК\ХЕАП. В данном случае пробовал менять их размер и в FreeRTOS и в Стартап файле, но как узнать какой размер куда прописывать? Похоже разобрался. Поставил во FreeRTOS вместо heap4 тип heap1.
  10. Подскажите пожалуйста, как обновить версию 9,2,3 до более новой, например 10,5 или 10,3? Облазил весь сайт разработчиков, можно заказать только демку, а обновить нельзя. Ярлычёк в пуске "update" не к чему не приводит, вылетает сообщение что у меня самая новая версия программы.