Как получить время прерывания (timestamp) в режиме ядра реального времени Linux?
Связь клиент / сервер - клиент является отправителем, а сервер - получателем.
Когда сервер получает данные через интерфейс Ethernet (UDP), ядро на сервере запускается. Я использую в режиме реального времени LINUX на стороне сервера. Сервер (то есть встроенная цель ПК) обрабатывает прерывания, чтобы запустить цель встроенного ПК (содержащую rt Linux), чтобы привлечь внимание к выполнению вновь поступивших данных.
Как я могу рассчитать время в ядре, как только произойдет прерывание, и отправить ответ обратно клиенту?
1 ответ
1) Если вы используете встроенную платформу Linux, вы можете обратиться к таблице данных процессора: возможно, у нее есть набор высокоскоростных таймеров. Например, я использую SoC на базе ARM Cortex A8, у него есть таймеры GP, которые можно тактировать до 38,4 МГц, поэтому я могу измерять время выполнения с точностью ~27 нс. Скорее всего, ваша ОС не будет предоставлять такой API, поэтому вы можете читать и записывать регистры ЦП непосредственно из драйвера ядра.
2) Если вы хотите просто оценить время выполнения и ничего более, вы можете использовать один из выводов GPIO вашей платы. Установите контакт в "начало", установите в "конец", затем просмотрите этот контакт с помощью осциллографа, если он у вас есть.
3) Если я не понял вас, и все, что вам нужно, это метка времени реального времени (например, ЧЧ: мм: сс), вы можете обратиться к RTC-чипу вашей платы. Используя драйвер чипа часов реального времени, вы можете считывать время из вашего модуля ядра. К сожалению, вы не сможете сделать это из процедуры обработки прерываний. Или просто вызовите do_gettimeofday и преобразуйте timeval во что-нибудь удобочитаемое через time_to_tm, если необходимо:)