Easyelectronics.ru

Электроника для всех
Текущее время: 28 июл 2017, 07:43

Часовой пояс: UTC + 5 часов



    • The World's Cheapest PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 00:39 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
CheMax писал(а):
физический смысл прост, ибо это физиологический сигнал. Одним фильтром выделяется одна составляющая, другим другая. Хотя пример можно привести абстрактный: в рамках большой полосы у Вас два или более полезных сигнала разнесенных по частоте. вот вы и выделяете из общего сигнала два разных разными фильтрами.
вот именно последний пример я понимаю, один сигнал двумя фильтрами делим на два, в одном одни данные, в другом другие. но эти фильтры фильтруют непрерывно. как можно фильтровать кусочно - мне не понятно... ну да ладно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 02:16 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 119
Откуда: Таганрог
Ink писал(а):
CheMax писал(а):
физический смысл прост, ибо это физиологический сигнал. Одним фильтром выделяется одна составляющая, другим другая. Хотя пример можно привести абстрактный: в рамках большой полосы у Вас два или более полезных сигнала разнесенных по частоте. вот вы и выделяете из общего сигнала два разных разными фильтрами.
вот именно последний пример я понимаю, один сигнал двумя фильтрами делим на два, в одном одни данные, в другом другие. но эти фильтры фильтруют непрерывно. как можно фильтровать кусочно - мне не понятно... ну да ладно.


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 12:16 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
я совсем запутался.
пусть пришло 1000 сэмплов. после двух фильтров должно получиться 2000 сэмплов, так или нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 12:40 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2141
Откуда: Санкт-Петербург
Кстати, подумайте как следует насчёт возможности выполнять оба фильтра в одном потоке. Переключение контекста - относительно дорогая операция...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 15:00 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 119
Откуда: Таганрог
Ink писал(а):
я совсем запутался.
пусть пришло 1000 сэмплов. после двух фильтров должно получиться 2000 сэмплов, так или нет?


в данном случае нет, будет 1000 точек на выходе первого фильтра либо меньше (зависит от наличия дефиматора), и 10 точек со второго фильтра (ибо децимация будет).

буду дома, сброшу схемку прохождения данных. думаю понятней станет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 15:03 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 119
Откуда: Таганрог
aamonster писал(а):
Кстати, подумайте как следует насчёт возможности выполнять оба фильтра в одном потоке. Переключение контекста - относительно дорогая операция...


это обязательно будет продумано, но чуть позже. после оценки быстродействия фильтров


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 16:26 
Старожил

Зарегистрирован: 22 мар 2010, 22:54
Сообщения: 3996
ну, пока децимацию в расчет не берем. итак, было на входе 1000 точек, на выходе первого (без д.) получили тоже 1000 точек. это значит, что этот фильтр обработал ВСЕ входные точки, которые ему пришли из очереди. если бы 2й фильтр брал их из этой же очереди, первый бы не получил часть точек.

я все к тому, что очереди должно быть две. и не важно, точки там или просто указатели на буфер. а раз две - годные алгоритмы уже были даны.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 16:53 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 119
Откуда: Таганрог
Ink писал(а):
ну, пока децимацию в расчет не берем. итак, было на входе 1000 точек, на выходе первого (без д.) получили тоже 1000 точек. это значит, что этот фильтр обработал ВСЕ входные точки, которые ему пришли из очереди. если бы 2й фильтр брал их из этой же очереди, первый бы не получил часть точек.

я все к тому, что очереди должно быть две. и не важно, точки там или просто указатели на буфер. а раз две - годные алгоритмы уже были даны.


это если удалять элемент из очереди по чтению.

по поводу алгоритма: немного переосмыслил прием данных. Поток 1 кГц пишется в кольцевой буфер. Через сообщение передается указатель на последний записанный элемент в буфер. Поток с фильтрами отслеживает разницу между индексом записи и индексами чтения. Как только его удовлетворяет количество данных - запускает обработку.

по сути fifo с одним индексом записи и двумя индексами чтения. вроде должно работать)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 11 май 2017, 17:32 
Только пришел

Зарегистрирован: 03 май 2017, 17:34
Сообщения: 7
aamonster писал(а):
Кстати, подумайте как следует насчёт возможности выполнять оба фильтра в одном потоке. Переключение контекста - относительно дорогая операция...

Позвольте полюбопытствовать, в чем проблема? Ведь FreeRTOS всё равно это делает не зависимо от количества поставленных задач.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 12 май 2017, 15:34 
Старожил
Аватара пользователя

Зарегистрирован: 01 ноя 2011, 23:51
Сообщения: 405
если у вас ваш массив не разделяется с меж задачами то менее накладно(с точки зрения ресурсов) использовать
Это http://www.freertos.org/RTOS-task-notification-API.html
ил это http://www.freertos.org/event-groups-API.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач
СообщениеДобавлено: 28 июн 2017, 14:25 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 119
Откуда: Таганрог
в целом задача оказалось решена, осталось только оптимизировать. Пришлось остановиться на одном семафоре и выполнение двух фильтров в одном потоке. Производительности хватило.

for kos:
группу событий (event groups) поднять не получилось, возникала ошибка при попытке выдать группу из под прерывания. Точно уже не скажу какая, но компилятор упорно говорил нет.

нотификация вещь интересная, но пока решил отложить изучение данной возможности,

всем спасибо за участие.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач [Решено]
СообщениеДобавлено: 20 июл 2017, 13:32 
Свой человек

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
А если две задачи будут писать в одну очередь. Размер сообщения посылаемый каждой задачей описать структурой. Там как раз можно разный объем буфера поставить. Из очереди будут забирать каждый своё. Как такой подход?

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач [Решено]
СообщениеДобавлено: 21 июл 2017, 03:10 
Свой человек
Аватара пользователя

Зарегистрирован: 01 авг 2016, 10:47
Сообщения: 119
Откуда: Таганрог
yazimma писал(а):
А если две задачи будут писать в одну очередь. Размер сообщения посылаемый каждой задачей описать структурой. Там как раз можно разный объем буфера поставить. Из очереди будут забирать каждый своё. Как такой подход?


Думаю имеет право быть, но несколько запутанней будет.

Реализовал нечто похожее для отправки данных в лог через SWO, так же одна очередь, принимающая указатель и размер данных. а дальше уже автомат крутит сие наружу


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Очереди и блокировка задач [Решено]
СообщениеДобавлено: 21 июл 2017, 09:24 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2253
У себя так сделана отладка через Usart. Динамически выделяем память под сообщение, в очередь кладем адрес выделенной памяти, длину сообщения. Другая задача ждет сообщения из очереди и отправляет по DMA наружу, после отправки освобождаем память.
Код:
void   UsartDebugSendString(const uint8_t *pucBuffer)
{
   _USART_DEBUG_QUEUE   DebugQueue;
   if (uxQueueSpacesAvailable(UsartDebugQueue))
   {
      DebugQueue.DataLen = strlen((const char*)pucBuffer);         //длина блока
      DebugQueue.Ptr = pvPortMalloc(DebugQueue.DataLen);            //выделяем память
      if (DebugQueue.Ptr!=NULL)                              //смогли выделить
      {
         DMA_CopyData(DebugQueue.Ptr,   pucBuffer,   true,   DebugQueue.DataLen)   // скопировали
         xQueueSend(UsartDebugQueue, &DebugQueue, 0);               //отправили в очередь
      }
   }
}

void   UsartDebugSendRTOS( void *pvParameters )
{
   _USART_DEBUG_QUEUE   DebugQueue;
   while(1)
   {
      xQueueReceive(UsartDebugQueue   ,&DebugQueue, portMAX_DELAY);
      DMA_InitStructure.DMA_BufferSize         = DebugQueue.DataLen;
      DMA_InitStructure.DMA_Memory0BaseAddr      = (uint32_t)DebugQueue.Ptr;
      DMA_Init(DMA2_Stream6, &DMA_InitStructure);
      DMA_Cmd(DMA2_Stream6, ENABLE);      //поехали
      xSemaphoreTake(UsartDebugTC, portMAX_DELAY);      //ждем конца передачи
      vPortFree(DebugQueue.Ptr);   //освобождаем блок
   }
}

void   DMA2_Stream6_IRQHandler(void)      //передача завершилась
{
   if(DMA_GetITStatus(DMA2_Stream6, DMA_IT_TCIF6))
   {
      DMA_ClearITPendingBit(DMA2_Stream6, DMA_IT_TCIF6);
      xSemaphoreGiveFromISR(UsartDebugTC   ,NULL   );
   }
}


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

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


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB