koyodza (27.04.2013 21:00, просмотров: 131) ответил Vladimir Ljaschko на Например ногодрыганье квантами 500 мкс с джиттером до 5-10 мкс и наличие других процессов с тем же периодом, пусть большим джиттером (например, программный опрос счетчиков). Поясните плз Вашу альтернативу без ISR и вызова функций.
там, где тайминги важны, нужно максимально делать аппаратно. То, что не получается делать аппаратно - делается с использованием прерываний, но с минимумом работы внутри прерывания Вы не четко описали задачу, поэтому приведу свой пример: вывод звука через ЦАП или ШИМ с карточки.
Если есть DMA на ЦАП/ШИМ, то выделяется буфер (из двух частей), из буфера DMA перекидывает данные на выход. Когда заканчивается один буфер, начинается выдача из второго, а в прерывании по окончании буфера выставляется флаг (в моём случае добавляется событие TASKHANDLE AddMessage(const void* pFn, DWORD param32, __int32 delay) с нулевой задержкой), в обработчике этого события и происходит заполнение буфера распакованными данными, взятыми с карточки. Таким образом в обработчике прерывания выполняется совсем немного действий. Но все задачи в этой системе должны быть построены так, чтобы ни одна из них не выполнялась дольше, чем происходит выдача из одной части буфера.
Если DMA нет, то всё тоже самое, только вместо DMA для выдачи используется прерывание, и точно так же по окончании одного куска буфера в начало очереди ставится функция, заполняющая освободившийся буфер.
Возможно, Вы просто искусственно завысили требования ко времени выполнения некоторых действий. Ещё чаще распространено неудачное разделение задач на требующие немедленной (быстрой, с малым джиттером и т.п.) реакции и не требующие таковой. Не раз приходилось наблюдать, как в прерываниях делается практически всё, даже ожидание готовности и прочие задержки, а в фоне почти ничего, и конечно же оно еле справляется