Ismael Ripoll �� ������: ������ ��������� �� ���������������� ������������ �������� � 1996. ��������� � ������� ������������ ������ � ������������� DISCA. ������� �������� �������� ������������ ��������� ������� (schedulrers) � ������������ �������. �������� � �������� � 1994. �����: ����������� ��������, ����, �����������������. �������� ������ ����������: KU ������ ��������� ������� (KURT) ��� ���� ������ �������� �����? ����������� ������ ��������� ��������� ������� ������������ ����� �������� ���������� ������ |
Real Time Linux II� ���� ������, ����������� RT-Linux � ��������� ���������� ����� ���������� ������������ RT-Linux. ����� ���, ��� ���������� � ������, � ��� ������� ����� ������� ����������� ������������ ������� ��������� ������� ���������� Linux KURT. ������ ��������� ������� KU (KURT)� ������� ����� (1998) ����, ��� ������� ����� ����� ������������ ������� ��������� �������, ������������ �� �������. KURT - ��� ������������ ������� ������� ��������� ������� (������� ��� ��������), �.�. ����������� ��������� �������� ������������� ������� ����������, �� ���� �����-���� ������ ����������� �����, ��� ���������, ��� �� �������� ��������� � ������ �������������� �� ����������. ������ ��������� ������� KURT-� ����� ������������ ����� ������������� ���� ������ �������, � ����������������� � ������� RT-Linux. � ���� ������� ��������� ��������� (�����������):
������ ��������� ������� ��������� � ���� ����������� ����������� �������. ����� �� �������� ����������� ���� KURT-� �������� �������� ����������. ���� ������� ������� ��������� ����������� �����������. ���� ��� ������������ ���������� ������� ���������� plan (����), ������� �������� ��� ����������� ��������: ������ �������������, ������ ��� ����������, ������������ ������ � �.�.. ������� ������������ � ���� ��������������� �������. �������, �� ����� ������ �������, ������ ������������ � �������� ������� � ������� ������ ������� � ���������� �����������. ����� ��������� ����� �������, ����������� ��������� � ������ � ���������� ���������� ����� -- ������� ����������� � ���������� �����������. ���� ��� ������������ ����� ���� �����������:
������� ��������� ������� � ��������� ������ �����. ����� ����, ������ ���, ����� �������������� ����� �� ���������� ������, ���������� ������������� ����, ����� ����� �������, ��� ��� �������� ��������� �������� ���������� ������. ��� ���� ������ �������� �����?�������� ������ ���� ������, ��� ������� ��������� ������� ������������ ������ � NASA, ��� � ������� � ������ ������������ �����. ���� ��� � ���� ������� � �������, ������ �������� ���������� ���������� -- � ���������� ���������� ��� ������ -- � ����� � ��������������� ����������� �������������� ������ � ����������� � ������������ ����� �����. ����� ������������ �������� �� ������ �������� ����� � ������� �������������������� � �������������� ����������. ��������, ���� �� �����, ����� ��� ��������� �������� �������� ����, ����������� �� ������� �����, ��������� ������ ���������� (��� ����� ������������) ������, ���������, � �������� �������� ���������� �� �������� �����. ���� � ���� � �� �� �����, ����� �� ������� ������, �� �������� � ������ �����������, ������ � ��������� ����������, ��� ������ ����������� ������� �������, ������� ������������ ����� ������� ������, ����� ��������� ��������� ������ ������. ���� ������ �����, �� ������������� �� ����� ������� �����, ����������� ����� �� ���� ��������������� � ������������ ���������� ������������. ��� ���� ������ ��������, ��� ������� ������� ��������� ������� (��������� �������� ���������� �� ����� � �������������� ������������, �� �������� �������� ��������, ��������������� ��������). ���������� RT-Linux ���� ������ ������� ���������� ��������� �������. ��� ������ RT-Linux �� ����� ��������� �������������� PC (� ������ PC, � �� ���������, ������ ��� � ���������� ������� �� ������� ���������� RT-Linux ��� ������ ����������) ��� � ������ MSDOS. �� ����� ������ ����� ��������� ������� ����� ���������� � ������ PC, ������������� ����������� ����������, �� ����� ��������� ����������, ... ������� ������� �� ����� "��������" ������� ��� ���� �� �� �������� ��� Windows. ������ ��� ����������� ������ �������������� ��� ��� �� ���, ��� ����� ������������ ����������� "��������" � ����������. ����������� ����������� ������ � ����� ����������� ������������ RT-Linux, ���������� ����������� � ����������� ������������ �������� ��� �������. Matt Welsh ������� ����� ������, ��� �� ��������� � ������� ���, ��� ��������� � �������. ��� ��� �����?� ����������� ���������� UNIX, ������� ������ ���� ���� ��� ������� � ���������� ����� ���������� (������, ������, ����������� � �.�.) - ��� ������ ����������� ������ � �������������� ������������� ��������� ���������. ���� ������� ����� ������� ����, �����������, ��� �������� ������� ����������, ����� ��� ������ � ������� ������, �.�. ���������� �������� �������� ���������� �������, ����� ������� ������� � ��������. ������, ��� "��������� ������������ �������" ������� ����� ���� ���������� � ��������� �� ��� �� ����� ����������. ����� ���������, ������������ �� ���������� �������� ������ ��������������, ������� ������ ���� ������������� ��������, ����� ������������� ��������� ���� ".o", ����� ��� ������� ������ ���� ���������� ������, ����� ������� ��� ������ � �������� ��������� ����������� ����. �����������, ��� ��������� ���� ���������� ������� main ����� ���� �������, � ��� ������������ ������� ������ ��������� ��� � ������ � ���������� ��� � ���������� ���������� �������, ������ ����� ����� ��� ����������. �� ���, ������� ����� ����������� ��� ��� � �����. ����� ������ ��������, � ������ ����������� ������ ����������� ���� vmlinuz. �� �������� ��������� ����������� �������� �������. �������, �� ����� ����������, �� ����� ��������� � ��������� ������ ������������, ����� ��� �����. ����������� ��� ������������ ����� ����������� �������, ��� ����� ���� ���������� �� ����� ���������� ������� �������. ������� ���� �������������, ������� ��� ��������, �������������� � ������������ �������� �������. ������� ���� ����������� ���������� ����� ������� � �������� �� ��� ������������� �� ������ ��������������, �� � ������������ �������. � ������� �������� ������, �� ��������� � ����������� ����� ������������ �������, �������������:
��� �� ����� ������, ����������� ����������� ������ ��� ����� ����� �������������, �������� ��������� ��������� �������: �� �������� �������� ��-�� "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:
� ���� ��� � ���� ��������� ��� ������������ 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, � �.�.. ��� ����������� ����� ��������� ��� ���������� � ��������� ������������ �������, �� ���� ������� �� ����������, ����� ���������� ����� �� ������������� ������, ���������� �������� ������ �� ����������� ������ �� �����������, ���� ������������ ������� �� ����� ��������������� ���������. FIFO ������������, ��� ���� �� ��� ���� �� �������� ������� (open, read/write, close). ��� ����, ����� ������� �������� ������� ����� ������������ ��, ������� ��������� ��������� ������� ������ ������� ��������������� FIFO. � ����� ������ ������ ��������� �������,, FIFOs ������������ ����� ������������� �������:
������� ��������� �� ������ �������, ������� ���������� ��� �������. ��� ������� ���������������� ������ �� ������������ (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 |