Распечатка 7.13 Задача RTAI в виде модуля ядра

Предыдущая  Содержание  Следующая V*D*V

Распечатка 7.13.

 

/* rtai-kernel.c */

 

/* Заголовочный файл модуля ядра */

#include <linux/module.h>

 

/* Используемые интерфейсы RTAI находятся в

 * этих заголовочных файлах

 */

#include <rtai.h>

#include <rtai_sched.h>

 

/* Частота тиков таймера в наносекундах */

#define TIMER_TICK500000 /* 0.5 мс */

 

/* Структура задачи для нашей задачи реального времени */

static RT_TASK hello_task;

 

/* Будет вызываться при загрузке модуля */

int init_module(void)

{

  /* ‘период’ нашей периодической задачи */

  RTIME period;

  RTIME curr; /* текущее время */

 

  /*

   * rt_task_init создаёт задачу реального времени

   * в состоянии ожидания

   */

  rt_task_init(&hello_task,   /* структура задачи */

                hello_thread, /* функция задачи */

                0,            /* аргумент для функции задачи */

                1024,         /* размер стека */

                0,            /* Приоритет.

                                 Наивысший приоритет –>0,

                                 Нижайший ->RT_LOWEST_PRIORITY

                              */

                0,            /* Задача не использует FPU */

                0             /* Обработчика сигналов нет */

              );

  /*

   * Следующие две функции таймера предназначены для вызова

   * только один раз в начале всей работы в реальном времени.

   * Таймер фактически запустил "системные часы реального

   * времени". Таймер используется планировщиком как датчик

   * времени.

   */

 

  /*

   * Таймеры могут быть настроены в периодический режим или

   * режим однократного запуска

   */

  rt_set_oneshot_mode();

 

  /*

   * Тик таймера в наносекундах конвертируется во внутренние

   * единицы времени.

   */

  period = start_rt_timer(nano2count(TICKS));

 

  /* Получаем текущее время */

  curr = rt_get_time();

 

  /* Наконец, делаем эту задачу периодической */

  rt_task_make_periodic(&hello_task, /* Указатель на структуру

                                        задачи */

                        curr + 5*period, /* время старта

                                            задачи */

                        period // период задачи

                        );

  return 0;

}

 

void cleanup_module(void)

{

  /*

   * Останавливаем таймер, ждём какое-то время и, наконец,

   * удаляем задачу

   */

  stop_rt_timer();

  rt_busy_sleep(10000000);

  rt_task_delete(&hello_task);

}

 

/* Наш основной поток реального времени */

static void hello_thread(int dummy)

{

  while(1){

    rt_printk(“Hello Real-time world\n”);

    /* Ждём следующего периода */

    rt_task_wait_period();

  }

}

 

Предыдущая  Содержание  Следующая