Цитата(Algol @ Mar 12 2012, 11:21)

поэтому задачу блокируют бинарным семафором, а в прерывании просто разблокируют, тогда задача начнет свое выполнение сразу после выхода из прерывания. Мне кажется такой подход как то красивее...или я не прав?
такой подход лучше реализовать без прерываний.
Код
void task1(void*)
{
portTickType xLastWakeTime;
xLastWakeTime = xTaskGetTickCount ();
for(;;)
{
vTaskDelayUntil( &xLastWakeTime, 1000);
//здесь читаем АЦП
//здесь посылаем событие или сразу в компорт отправляем данные
}
}
В таком случае чтение АЦП будет опрашиваться строго через каждые 1000 тиков. Точность будет мне кажется до 1 такта ЦПУ. с момента прерывания от системного таймера до момента переключения и входа в задачу task1() будет фиксированное кол-во тактов цпу (если конечно прерывание системного таймера не будет перекрыто более приоритетным прерыванием или запретом прерывания).
Цитата
Стандартное решение. АЦП->SPI->DMA-> 2 'кольцевых' буфера. Один заполняется, второй в это время обрабатываете. Если скорость отсчётов не большая, то можно конечно и опросом, но как правило это не так.
Если частота выборок небольшая.... и чтение по спи быстрое, то vTaskDelayUntil вполне даже "красивее". Если конечно выборки частые, проц медленный, спи не быстрый...... то тут наверно применение АЦП->SPI->DMA будет оправдано. Иначе дма юзать - только если ради туториала.
Сообщение отредактировал juvf - Apr 13 2012, 10:38