Нужно прерывание(програмное) каждые 25 микросекунд. По поисковикам полазил - ничего быстро не нашел.
Коллеги может подскажете в какую сторону смотреть чтобы побыстрее проект запустить
на Linux это нереально - вам нужна RTOS или специализированное решение типа Xenomai хотя даже он например на at91 имеет большую латентность чем 25 микросекунд
В проекте надо читать данные из FPGA(там свой проект их нужным методом обрабатывает) и их еще раз обрабатывать.
С частотой хорошо промахнулся - надо 25 миллисекунд.
Возможно некоторая латентность - данные в FPGA копятся в 2 буферах и обработка одного занимает меньше времени чем наполнение другого.
зачем вам тогда прерывания таймера ? обычная практика - устройство (FPGA в данном случае) генерирует прерывание когда данные готовы и продолжает писать в свободный буфер, хост-прцессор в обработчике считывает готовый буфер и так по кругу. Ели буферы достаточного разера то латентность прерываний ОС хост-процессора практически не имеет значения. Для прерываний от FPGA можно использовать любой свободный GPIO.
Все уже работало на другой плате AT91SAM9260. Надо преползти на эту плату с минимум переделок. Есть надежда что эта плата потянет(по ресурсам процессора) нужный объем вычислений.
Структура была такая:
- FPGA забирал данные и пихал их по очереди в два буфера и выставлял флаг готовности нужного буфера
- драйвер (файл *.ko) по таймеру смотрел на флаг готовности буфера в FPGA и переносли их в свое адресное пространство в кольцевой буфер.
- программа на С читала их(по read) и обрабатывала
Изменения должны быть минимальны. Не весь исходный код доступен.
Проект на FPGA поправят но по минимуму(только адаптируют к новой плате). Поэтому прерывания по таймеру нужны в драйвере чтобы забирать данные из FPGA.
Да это немного не хорошо, но нет времени переделывать все по уму и самое главное - возможно что и эта плата не вытянет обработку и придется подбирать что-то другое.
из семейства *sleep. Можно сделать отдельный поток в ядре который будет планировщик с заданной частотой запускать. Только тут надо учитывать что минимальная единицей измерения будет 10 миллисекунд (CONFIG_HZ=100 по умолчанию на арм) если нет поддержки