Linux - статьи


              

реализация срабатывания по таймеру


Пример 10-1. sched.c
/* * sched.c - реализация срабатывания по таймеру. * * Copyright (C) 2001 by Peter Jay Salzman */
/* * Необходимые заголовочные файлы */
/* * Обычные, для модулей ядра */ #include <linux/kernel.h> /* Все-таки мы работаем с ядром! */ #include <linux/module.h> /* Необходимо для любого модуля */ #include <linux/proc_fs.h> /* Необходимо для работы с /proc */ #include <linux/workqueue.h> /* очереди задач */ #include <linux/sched.h> /* Взаимодействие с планировщиком */ #include <linux/init.h> /* макросы __init и __exit */ #include <linux/interrupt.h> /* определение irqreturn_t */
struct proc_dir_entry *Our_Proc_File; #define PROC_ENTRY_FILENAME "sched" #define MY_WORK_QUEUE_NAME "WQsched.c"
/* * Счетчик срабатываний по таймеру */ static int TimerIntrpt = 0;
static void intrpt_routine(void *);
static int die = 0; /* 1 -- завершить работу */
/* * очередь задач, создается для того, * чтобы поместить в очередь таймера (workqueue.h) */ static struct workqueue_struct *my_workqueue;
static struct work_struct Task; static DECLARE_WORK(Task, intrpt_routine, NULL);
/* * Функция-обработчик прерывания от таймера. * Обратите внимание на аргумент типа void* * функция может получать дополнительные * аргументы посредством этого указателя. */ static void intrpt_routine(void *irrelevant) { /* * Нарастить счетчик */ TimerIntrpt++;
/* * Если признак завершения сброшен, * то опять вставить себя в очередь таймера */ if (die == 0) queue_delayed_work(my_workqueue, &Task, 100); }
/* * Запись данных в файл /proc. */ ssize_t procfile_read(char *buffer, char **buffer_location, off_t offset, int buffer_length, int *eof, void *data) { int len; /* Фактическое число записанных байт */
/* * Переменные объявлены как static, поэтому они располагаются не на стеке * функции, а в памяти модуля */ static char my_buffer[80];
static int count = 1;
/* * Все сведения выдаются за один присест, * поэтому, если смещение != 0, то значит * нам нечего больше сказать, поэтому возвращается * 0, в качестве признака конца файла. */ if (offset > 0) return 0;

Содержание  Назад  Вперед