Как получить время прерывания (временную метку) в режиме ядра Linux в реальном времени?

Связь клиент/сервер - клиент является отправителем, а сервер - получателем.

Когда сервер получает данные по интерфейсу Ethernet (UDP), запускается ядро ​​на сервере. Я использую LINUX реального времени на стороне сервера. Сервер (т. е. целевой встроенный компьютер) обрабатывает прерывания для запуска целевого встроенного компьютера (содержащего rt Linux), чтобы привлечь внимание для выполнения вновь поступивших данных.

Как я могу рассчитать время в ядре, как только произойдет прерывание, и отправить ответ обратно клиенту?


person user3458454    schedule 01.04.2014    source источник
comment
Готовы ли вы изменить исходный код ядра?   -  person Joe    schedule 01.04.2014
comment
Я планирую использовать ftrace для отладки ядра!!! Операции в реальном времени происходят в режиме ядра rt linux, поэтому я не могу написать ISR в пользовательском пространстве, чтобы справиться с этим.   -  person user3458454    schedule 01.04.2014


Ответы (1)


1) Если вы используете встроенную платформу Linux, вы можете обратиться к техническому описанию процессора: возможно, у него есть набор высокоскоростных таймеров. Например, я использую SoC на базе ARM Cortex A8, у него есть таймеры GP, которые можно разгонять до 38,4 МГц, поэтому я могу измерять время выполнения с точностью ~ 27 нс. Скорее всего, ваша ОС не предоставит такой API, поэтому вы можете читать и записывать регистры ЦП непосредственно из драйвера ядра.

2) Если вы хотите просто оценить время выполнения и ничего больше, вы можете использовать один из контактов GPIO вашей платы. Установите вывод на «старт», установите на «конец», затем посмотрите этот вывод на осциллографе, если он у вас есть.

3) Если я вас не понял, и все, что вам нужно, это временная метка реального времени (например, ЧЧ:мм:сс), вы можете обратиться к чипу RTC вашей платы. Используя драйвер чипа часов реального времени, вы можете считывать время из вашего модуля ядра. К сожалению, вы не сможете сделать это из процедуры обслуживания прерывания. Или просто вызовите do_gettimeofday и при необходимости преобразуйте timeval во что-то удобочитаемое с помощью time_to_tm :)

person Konstantin Utkin    schedule 03.04.2014
comment
когда сервер получает данные (Linux в реальном времени на встроенном компьютере) от клиента, ядро ​​(сервер) останавливает текущее выполнение и переключается на вновь поступившее. Я хочу указать временную метку, с которой ядро ​​​​выгружается, и временную метку, с которой ядро ​​​​начинает выполнение. Как получить время ядра ?? - person user3458454; 03.04.2014
comment
Я использую clock_gettime для получения метки времени, но где вызвать это в ядре, чтобы получить метку времени?? - person user3458454; 03.04.2014
comment
Боюсь, я не могу указать вам конкретную строку исходного кода для размещения временной метки: вам следует изучить исходный код драйвера чипа Ethernet, найти ISR и другие функции, которые вам нужны. Затем выведите полученные значения в консоль, либо сохраните в sysfs, либо реализуйте собственный интерфейс для доступа из пользовательского пространства или другого драйвера. - person Konstantin Utkin; 03.04.2014