Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Ismael Ripoll
�� ������: ������ ��������� �� ���������������� ������������ �������� � 1996. ��������� � ������� ������������ ������ � ������������� DISCA. ������� �������� �������� ������������ ��������� ������� (schedulrers) � ������������ �������. �������� � �������� � 1994. �����: ����������� ��������, ����, �����������������.

�������� ������

����������:
KU ������ ��������� ������� (KURT)
��� ���� ������ �������� �����?
����������� ������
��������� ��������� �������
������������ ����� ��������
����������
������

Real Time Linux II

[Ilustration]

� ���� ������, ����������� RT-Linux � ��������� ���������� ����� ���������� ������������ RT-Linux. ����� ���, ��� ���������� � ������, � ��� ������� ����� ������� ����������� ������������ ������� ��������� ������� ���������� Linux KURT.




������ ��������� ������� KU (KURT)

� ������� ����� (1998) ����, ��� ������� ����� ����� ������������ ������� ��������� �������, ������������ �� �������. KURT - ��� ������������ ������� ������� ��������� ������� (������� ��� ��������), �.�. ����������� ��������� �������� ������������� ������� ����������, �� ���� �����-���� ������ ����������� �����, ��� ���������, ��� �� �������� ��������� � ������ �������������� �� ����������. ������ ��������� ������� KURT-� ����� ������������ ����� ������������� ���� ������ �������, � ����������������� � ������� RT-Linux. � ���� ������� ��������� ��������� (�����������):

  • �������� ���������� ��������� �����. � Linux-386, ������ ���������� ����� 10 �� (100 ��� � �������), � ��� ������������ �������� ��� �������� ������� �� ���������� � ��������� �������. KURT ���������� ��� ���������� �������� ��� �� ��������, ��� � RT-Linux. �� ������������� ��� ������� (8254) ���, ����� ��� ����������� ���������� �� �������, ������ ��������� ����� ���������� �������. ����� ������� ����� ���� ���������� ���������� ����� � ������� �����������.
  • ����������� ��� ������������� ��� ����, ����� �������� ����� �������� ����������, SCHED_KURT, ����� ���, ������� ��� �������� � ������� ������� � ������� ���������� � POSIX: SCHED_FIFO, SCHED_RR � SCHED_OTHER.
  • ���� ��������� ����� ��������� ������ ��� ������� � ������������ ��������� �������.

������ ��������� ������� ��������� � ���� ����������� ����������� �������.

����� �� �������� ����������� ���� KURT-� �������� �������� ����������. ���� ������� ������� ��������� ����������� �����������. ���� ��� ������������ ���������� ������� ���������� plan (����), ������� �������� ��� ����������� ��������: ������ �������������, ������ ��� ����������, ������������ ������ � �.�.. ������� ������������ � ���� ��������������� �������. �������, �� ����� ������ �������, ������ ������������ � �������� ������� � ������� ������ ������� � ���������� �����������. ����� ��������� ����� �������, ����������� ��������� � ������ � ���������� ���������� ����� -- ������� ����������� � ���������� �����������. ���� ��� ������������ ����� ���� �����������:

  • ���� ����������� ������ ����� �����������

  • �� ����������

  • ����� ���������� �����, ����������� ���������� ������� ����� ���� ���������� ��������� (��������� ������������� ����������, ��� ������ ���� ������ ����������� 100-��������� ���������� ������ ������)

������� ��������� ������� � ��������� ������ �����. ����� ����, ������ ���, ����� �������������� ����� �� ���������� ������, ���������� ������������� ����, ����� ����� �������, ��� ��� �������� ��������� �������� ���������� ������.

��� ���� ������ �������� �����?

�������� ������ ���� ������, ��� ������� ��������� ������� ������������ ������ � NASA, ��� � ������� � ������ ������������ �����. ���� ��� � ���� ������� � �������, ������ �������� ���������� ���������� -- � ���������� ���������� ��� ������ -- � ����� � ��������������� ����������� �������������� ������ � ����������� � ������������ ����� �����. ����� ������������ �������� �� ������ �������� ����� � ������� �������������������� � �������������� ����������. ��������, ���� �� �����, ����� ��� ��������� �������� �������� ����, ����������� �� ������� �����, ��������� ������ ���������� (��� ����� ������������) ������, ���������, � �������� �������� ���������� �� �������� �����. ���� � ���� � �� �� �����, ����� �� ������� ������, �� �������� � ������ �����������, ������ � ��������� ����������, ��� ������ ����������� ������� �������, ������� ������������ ����� ������� ������, ����� ��������� ��������� ������ ������. ���� ������ �����, �� ������������� �� ����� ������� �����, ����������� ����� �� ���� ��������������� � ������������ ���������� ������������. ��� ���� ������ ��������, ��� ������� ������� ��������� ������� (��������� �������� ���������� �� ����� � �������������� ������������, �� �������� �������� ��������, ��������������� ��������).

���������� RT-Linux ���� ������ ������� ���������� ��������� �������. ��� ������ RT-Linux �� ����� ��������� �������������� PC (� ������ PC, � �� ���������, ������ ��� � ���������� ������� �� ������� ���������� RT-Linux ��� ������ ����������) ��� � ������ MSDOS. �� ����� ������ ����� ��������� ������� ����� ���������� � ������ PC, ������������� ����������� ����������, �� ����� ��������� ����������, ... ������� ������� �� ����� "��������" ������� ��� ���� �� �� �������� ��� Windows. ������ ��� ����������� ������ �������������� ��� ��� �� ���, ��� ����� ������������ ����������� "��������" � ����������.

����������� ������

����� ������ � ����� ����������� ������������ RT-Linux, ���������� ����������� � ����������� ������������ �������� ��� �������. Matt Welsh ������� ����� ������, ��� �� ��������� � ������� ���, ��� ��������� � �������.

��� ��� �����?

� ����������� ���������� UNIX, ������� ������ ���� ���� ��� ������� � ���������� ����� ���������� (������, ������, ����������� � �.�.) - ��� ������ ����������� ������ � �������������� ������������� ��������� ���������. ���� ������� ����� ������� ����, �����������, ��� �������� ������� ����������, ����� ��� ������ � ������� ������, �.�. ���������� �������� �������� ���������� �������, ����� ������� ������� � ��������.

������, ��� "��������� ������������ �������" ������� ����� ���� ���������� � ��������� �� ��� �� ����� ����������. ����� ���������, ������������ �� ���������� �������� ������ ��������������, ������� ������ ���� ������������� ��������, ����� ������������� ��������� ���� ".o", ����� ��� ������� ������ ���� ���������� ������, ����� ������� ��� ������ � �������� ��������� ����������� ����. �����������, ��� ��������� ���� ���������� ������� main ����� ���� �������, � ��� ������������ ������� ������ ��������� ��� � ������ � ���������� ��� � ���������� ���������� �������, ������ ����� ����� ��� ����������. �� ���, ������� ����� ����������� ��� ��� � �����. ����� ������ ��������, � ������ ����������� ������ ����������� ���� vmlinuz. �� �������� ��������� ����������� �������� �������. �������, �� ����� ����������, �� ����� ��������� � ��������� ������ ������������, ����� ��� �����.

����������� ��� ������������ ����� ����������� �������, ��� ����� ���� ���������� �� ����� ���������� ������� �������. ������� ���� �������������, ������� ��� ��������, �������������� � ������������ �������� �������.

������� ���� ����������� ���������� ����� ������� � �������� �� ��� ������������� �� ������ ��������������, �� � ������������ �������.

� ������� �������� ������, �� ��������� � ����������� ����� ������������ �������, �������������:

  • �� ����� ������������ ��� ������� � ��� �������� ��� ���������� � ��������� �������.

  • ��� ������ ����������� �� ������������ ������ ���������� ����������. �� ����������� i386 �� ����������� � ������ ������ 0, ������������� ��� ���� �������� ����� ��� ������� � �����/������ � ���������� ����������������� ������.

  • ������ ��� ��� ��������, ��� � ��� ������ ������������ ��������������� � ���������� ������, ��� ������� ���������� ��������� "paging" ��� ��� ����������� ������� "swapping". ������������� ���������� ������������ "page fault" �� ����� ���������� ������.

��� �� ����� ������, ����������� ����������� ������ ��� ����� ����� �������������, �������� ��������� ��������� �������: �� �������� �������� ��-�� "page faults" � �� ����� ������ �� ���� ���������� �������� ����������.

��� �� ������� � ������������?

������ �������� �� �c������� ������ "C". ��� ������ ������������ ������ (��� ���������� ����������� �� ��������� ������ ���������� ���� ����������������� �������������, root-��):

example1.c

  #define MODULE
  #include <linux/module.h>
  #include <linux/cons.h>
  static int output=1;

  int init_module(void) {
    printk("Output= %d\n",output);
    return 0;
  } 
  void cleanup_module(void){   
    printk("Adi�s, Bye, Chao, Ovuar, \n");
  }

��� ��� ���������� �� ������������ ��������� ���������:

# gcc -I /usr/src/linux/include/linux -O2 -Wall -D__KERNEL__ -c example1.c

���� -c ������� gcc, ��� �� ������ ������������ ����� ��������� ���������� ����� � ���������� ���� ��������. ��������� - ���� example1.o.

� ������� ��� ������������ ������, ������������� �� �� ����� ������������ ������� printf()... ������ ����� ������� ���������� ���� ����������� ������ ���� ������� printk(), ��� �������� ����� ����� ��� printf(), �������� ��, ��� ��� �������� ����� � ��������� ����� �������. ��� ��������� ���, ��� ������� ���� ���� ��� ��������� �������, ���������� ��� ���������6 ������� �� ����� ��� ������� �������. � ����� ����� �� ����� ��������� ��� ���������, ��������� ������� dmseg ��� ��������������� �������� ���� /proc/kmsg.

��������, ��� ������� main() ����������� � ������ ��� �� ������� ������� init_module(), ������� �� ��������� ������� ����������. cleanup_module() - ��������� �������, ������� ������ ���� ������� ����� ��������� ������. �������� ������ ������������ �������� insmod

  # insmod example1.o

������ �� ������ ���������� ������ example1 � ��������� ��� ������� init_module(). ����� ������� ��������� �����������:

  # dmesg | tail -1
  Output= 1   

������� lsmod ������������� ������ �������, ����������� � �������:

# lsmod
Module    Pages   Used by:
example1      1          0
sb            6          1
uart401       2  [sb]    1
sound        16  [sb uart401]  0 (autoclean) 

� �������, �� ���������� rmmod ����� ��������� ������:

  # rmmod example1
  # dmesg | tail -2
  Output= 1
  Adi�s, Bye, Chao, Orvua,     

����� dmesg ���������� ���, ��� ������� cleanup_module() ���� ���������.

��� ���������� ������ ����� ��� �������� ��������� � ������. ��� ����������� ������. �� ����� ��������� �������� ���������� ����������, ��������� ��������� � insmod. ��������:

  # insmod ejemplo1.o output=4
  # dmesg | tail -3
  Output= 1
  Ad�os, Bye, Chao, Orvua,
  Output= 4                

������ �� ����� ���, ��� ��� ���� � �������, ������� �������� � RT-Linux.

���� ������ ��������� ��������� �������

��-������ �������, ��� ��� ������������� RT-Linux �� ������ ����������� ������� ������� ��� ��������� ������� ��������� ������� -- �� ��������� ��� �������� � ���������� ������.

���� ��� ���� ������������ RT-Linux:

  1. ��� ������������ ������� ��������� ������� � �������������, ���������� �� ������������� �����������.

  2. ��� �� ����������� PC, ���-�� ������� �� ��, ��� ����� ���� ������� ��� DOS: ����������� ���������� � �������� ������ �������� ��� �����������.

� ���� ��� � ���� ��������� ��� ������������ RT-Linux ��� ������� � �������������� �����������. ������, ������� �� ������ ������, �� ������ ������ "���������", �� ������ ��������� ������ ��������� ������� (������� ����)

example2.c
  #define MODULE
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/version.h>
  #include <linux/rt_sched.h>
  RT_TASK task;
	  
  void fun(int computo) {
    int loop,x,limit;
    limit = 10;
    while(1){
      for (loop=0; loop<computo; loop++)
        for (x=1; x<limit; x++);
      	
      rt_task_wait();
    }
  }
  
  int init_module(void) {

    RTIME now = rt_get_time(); 

    rt_task_init(&task,fun, 50 , 3000, 1);
    rt_task_make_periodic(&task,
          now+(RTIME)(RT_TICKS_PER_SEC*4000)/1000000,
	 (RTIME)(RT_TICKS_PER_SEC * 100)/1000000);
    return 0;
  }

  void cleanup_module(void){
    rt_task_delete(&task);
  }

� ����� �� ����������� ������ ��������:

# gcc -I /usr/src/linux/include/linux -O2 -Wall -D__KERNEL__ -D__RT__ -c example2.c

��������� ��������� - ������, ������� ����� - ������� init_module(). ������, ��� ���������� �������, ��� ��������� ������� ����� � ��������� ��� � ��������� ����������; ������� rt_get_time() ���������� ����� RT_TICKS_PER_SEC ��������� �� ������� �������� (� ������� ������ RT_TICKS_PER_SEC - 1.193.180, ��� ���� ���������� 0.838 �����������). �������� rt_task_init() ��������� "task" ����������������, �� ��� �� �����������. ������� ��������� ������ ��� ��������� ������ - fun(), ������� �������� ������ ����������. ��������� �������� - ��� �������� ������, ������� ���������� ����� ������, ����� �� �������� �����������, ��������, ��� fun() ������� �������� ���� int . ��������� �������� - ������ ����� ������; ��� ��� ������ ������ ����� ���� ����������� ����, ������ ��������� � ����������� �����. ��������� �������� - ���������; � ����� ������, ����� � ������� ������������ ������ ���� ������, �� ����� ���������� ����� ��������.

rt_task_make_periodic() ����������� ������ � �������������. �� ���������� ��� ��������, ������ ��� ������ � ���������� �������, ����� ������ ����� �������������� � ������ ��� � ������ ��� ������ ����� ��������� �����������, ������� ���������� ������������ ����� ����� ������ ���������.

������ ��������� ������� (������� fun()), ��� ����������� ����� � ������� ����������� ������ ��� ��������: ����, ������� ������ ��������� ������ ����� � ����� ���������� ������� rt_task_wait(). rt_task_wait(), ��� �������, ������� ���������������� ���������� ������, ������� �� ��������, �� ��������� ������� ���������, �������, ����� ���������� ����������� ����� ����������� ����������, ��������� ��������������� ����� rt_task_wait(). �������� ������ ��������, ��� ������������� ������ �� ����������� � ������ ������ ����� ������ ���������, ������ �����, ������ ���� ���������������� ���������� (����� ��������� �� ������) � ���� ��������� ���������. ��� ��������� ������ ������, ������� ��������� ������������� ������ �� ����� ������� ������.

��� ����, ����� ��������� example2, ������� �� ������ ���������� ������ rt_prio_sched, ��� ��� ���� ������ ��������� � �������� rt_task_make_periodic(), rt_task_delete()rt_task_init(). ������� rt_get_time() ��� ������ ������, ��� ���������� � ������� �������, �������������, ��� ���� ����� �� ������������ �� �� ���� �������������.

  # modprobe rt_prio_sched
  # insmod ./example2.o

��� ��� rt_prio_sched - ������ �������, �� ��� ������ �� ����� ���������� ������� ������� � �������������, ��� ���������� � ���������� /var/modules/2.0.33/. �� ���������� ������� modprobe ��� ��� ��� ����� ������ ���� ��������� ������ (��� ����� ������ � ����������� �������) (��. modprobe(1)).

���� ��� ���� ������, ����� ������� lsmod �� ������, ��� ��� ������ ���� ��������� ���������.

����, � ���� �����, �������� ��� ����� ���������� ��������� ��������� �������. �� �������� ��� ������ ���������? ���� ��������� ���������, �������� �������� �������, ��� ������ �������� ���������, ��� ������. �� ������ ����������� ��������� ���������� �������� ������ ����� � ������� fun(), ������� ������ �������� � rt_task_init(). � ���������� ��������� ��������� ico, ����� ������� ��������� ������ ������������� ������� ��������, ��� ��� ����� ������������ ���������� ��������� �������, ������ �����, ��� ����� ��������� �������� �� ������� �������, ������ ����� ������, ��� ���� ��� ��������� ����� ������ ������� ��� ���������� ��� �� ����� �����. ���� ����� ���������� (�����, ��������� ��� ���������� ���� �������� �����) ������, ��� 100 �����������, ������ "��������", ��� ��� ����� ������ - ������� ������ � ������ ��������� ������� ���������� 100% �������. � ���������������� ������ �� �����, ��� ������ �� ��������� ������������� �������.

������������ ����� ��������

� RT-Linux ���� ������ ���� ������ ������������: FIFO(������ ������ ������ ����) ��������� �������. ��� �������� ����� ������ �� ��������� ����� (pipes), ������������ ����� ������ ������ ��� ���������. FIFO ��� ����� �� ������������� ���������� ����, ������� ��������� ��������� �������� ������ � ������.

��������� FIFO �������� ���������� ����� ��� ����� �������� ��������� �������, ��� �� ��� � � �������� �������� �������.

� ����� ������ ������� ��������� FIFO �������� ������ �� ������������ ����������. ������ ��� ����������: /dev/rtf0, /dev/rtf1, � �.�. ��� ����� �� ���������� � ������� � ������ ���� ������� ��������� �����:

# for i in 0 1 2 3; do mknod /dev/rtf$i c 63 $i; done

���� ����� ����� ������ FIFO, ��� ����� ���� ������� �������������� ��� �� ���������: rtf4, rtf5, � �.�.. ��� ����������� ����� ��������� ��� ���������� � ��������� ������������ �������, �� ���� ������� �� ����������, ����� ���������� ����� �� ������������� ������, ���������� �������� ������ �� ����������� ������ �� �����������, ���� ������������ ������� �� ����� ��������������� ���������.

DrawObject

FIFO ������������, ��� ���� �� ��� ���� �� �������� ������� (open, read/write, close). ��� ����, ����� ������� �������� ������� ����� ������������ ��, ������� ��������� ��������� ������� ������ ������� ��������������� FIFO.

� ����� ������ ������ ��������� �������,, FIFOs ������������ ����� ������������� �������:

  • rt_create(unsigned int fifo, int sise): ������� FIFO � ������� ������� size. � ����� ������� � �� �����������, ����������, ��������� ����� /dev/rtf[fifo] ���������� � ����� ��������������.

  • rt_destroy(unsigned int fifo): ��������������� FIFO ������������ � ��� ������ ������������������.

  • rt_fifo_put(fifo, char *buf, int count): ������� �������� count ������ � ����� buf. ���� ����� � ������ ������������, ������������ -1.

  • rt_fifo_get(fifo, char *buf, count): ������� ��������� count ������ �� FIFO, ���� ��� �������������� ������, ���������� -1.

������� ��������� �� ������ �������, ������� ���������� ��� �������. ��� ������� ���������������� ������ �� ������������ (sound):

example3.c
  #define MODULE
  #include <linux/module.h>
  #include <linux/rt_sched.h> 
	 
  #include <linux/rtf.h>
  #include <asm/io.h>

  RT_TASK task;  

  static int filter(int x){
    static int oldx;
    int ret;
    if (x & 0x80) {
      x = 382 - x;
    }
    ret = x > oldx;
    oldx = x;
    return ret;
  }

  void fun(int dummy) {
    char data;
    char temp;
    while (1) {
      if (rtf_get(0, &data, 1) >  0) {
        data = filter(data);
        temp = inb(0x61);            
        temp &= 0xfd;
        temp |= (data & 1) <<  1;
        outb(temp,0x61);
      }
      rt_task_wait();
    }
  }

  int init_module(void){
    rtf_create(0, 4000);
    
    /* enable counter 2 */
    outb_p(inb_p(0x61)|3, 0x61);
    
    /* to ensure  that the output of the counter is 1 */
    outb_p(0xb0, 0x43);
    outb_p(3, 0x42);
    outb_p(00, 0x42);
    
    rt_task_init(&task, fun,  0 , 3000, 1);   
    rt_task_make_periodic(&task, 
                   (RTIME)rt_get_time()+(RTIME)1000LL, 
                   (RTIME)(RT_TICKS_PER_SEC / 8192LL));

    return 0;
  } 

  void cleanup_module(void){
    rt_task_delete(&task);  
    rtf_destroy(0);
  }

��� � �� ������ �������, ��� ����� ������� �� ������rt_prio_sched, �� ��� ����, ����� ����������� FIFO, �� ������ ����� ��������� ������ rt_fifo_new.

������� ������������� ������ ��������� ������� � �������� 8192��. ��� ������ ������ ����� �� FIFO 0 �, ���� ������ ���-������, �������� �� ���� ���������������� ��. ���� �� �������� �������� ���� � ������� ".au" � /dev/rtf0 �� ������ ������� ���. ��� ������������ ��������, ��� �������� ����� �������, �.�. ����� ���������������� �� ��������� ������������ ������ ���� ��� ��� ��������� �������. � ���������� testing/sound ������������ ���������� ���� linux.au, ������� ����� �������������� ��� ������.

������������� � ��������� ���:

   # gcc -I /usr/src/linux/include/linux -O2 -Wall -D__KERNEL__ -D__RT__ -c example3.c
   # modprobe rt_fifo_new
   # modprobe rt_prio_sched
   # insmod example3.o
   # cat linux.au > /dev/rtf0

��������, ��� ������� cat ����� �������������� ��� ������ � ����� ����, ������� ����������� �����. �� ����� ����� ������������ ������� cp.

����� ��������, ��� �������������� ������������ ������� ������ �� �������� ���������������, ��� ����� ������ �������� ���������, ������� ������ �� �� ����� ��������, �� ��� ������� ������� �������:

example4.c
  #include <unistd.h>
  #include <asm/io.h>
  #include <time.h>

  static int filter(int x){
    static int oldx;
    int ret;
    if (x & 0x80)
      x = 382 - x;
    ret = x > oldx;
    oldx = x;
    return ret;
  }
  espera(int x){
    int v;
    for (v=0; v<x; v++);
  }
  void fun() {
    char data;
    char temp;

    while (1) {
      if (read(0, &data, 1) >  0) {
        data = filter(data);
        temp = inb(0x61);
        temp &= 0xfd;
        temp |= (data & 1) << 1;
        outb(temp,0x61);
      }
      espera(3000);
    }
  }

  int main(void){
    unsigned char dummy,x;
    ioperm(0x42, 0x3,1); ioperm(0x61, 0x1,1);

    dummy= inb(0x61);espera(10);
    outb(dummy|3, 0x61);

    outb(0xb0, 0x43);espera(10);

    outb(3, 0x42);espera(10);
    outb(00, 0x42);

    fun();
  }

��� ��������� ����� ���� �������������� ��� � ����� ������� ���������:

  # gcc -O2 example4.c -o  example4

� ����� ��������� ��:

  # cat linux.au | example4

����� �������� ������ � ������ ���������� �� �������� �������� �������, �� ������ ��������� ���������� � ������������ �������. ��� ������� � ����������� ���� ������, ����� �������� ������� ������� ��������� � �������� �����, ��������. ����� ioperm() ������� ������������ �������, ��� �� ����� �������� ������ � ������� ��������� ������� �����/������. ����� ���������� ����� �������� ������ ���������, ������������� � ������������ root. ��������� � ������ ������, ��� �������� ������� 8192��, ������� ������������ ��� ��������� ������������� �����. ������� ��������� ����� ���������� nanodelay(), �� � ���� ���������� ����� ���� ������������, ������������� �� ������ ������������ ��������� ����, ��� ������ ����� ��������. ���� �������� ���, ��� �� ����� ��� ����� �������� �� �������� 100 ���.

������ � ��������� �������� �������������� example4 ������ � ���������� ico, ��� ��� ������ ������? ������ �� ������ ��������� �������? ����, ������� �������� ����� ��� ����-������?

����������

������ ������ ���������������� �� ������� ���������������� ����� ��������� �������. ����������� ������� ����� ������ � �� ������� ��� ������������� �������������, � ��������� ������ � ��� ����� �������� ����������. �� ������ ��������� �� ������� ����������� ���, ��� ����� �����������, ��������� ����� �������� ��� ������ �������������� ����������!!!.

����������:

������� �� �������: ������� �������
http://www.dkd.ot.lt/hompag/linux


Web page maintained by Miguel A Sepulveda
© Ismael Ripoll 1998
LinuxFocus 1998