Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom Bar]
[Photo of the Author]
Ismael Ripoll
�@��²���G �@�E�E���~�� Valencia ��X��ޤj�Ǩ��o�դh�Ǧ�C �ثe��¾�� DISCA�A ���@�~�t�αM�a�C ��s�M�D���Y�ɨt�αƵ{�޲z�M�@�~�t�ε����C �@�E�E�|�~���� Linux ���@���l�C �ݦn���G �k�n���祧���s�� (Pyrenees)�B �Ƴ��B �H�η��@�W�����C�L�C

�P�@���pô

���e�ؿ��G
�ŻŪ� Linux �Y�ɨt�� (KURT)
�Y�ɨt�Φ�����n���S
�i���J���Ҳ�
�Y�ɨt�ε{��
���ȳq�T
����
�ѦҸ��

RT-Linux II

[Ilustration]

���e�K�n�G �o�O�ĤG�g���Q RT-Linux ���峹�A �ڷ|�յۥH���Ȫ��[�I�ӻ��� RT-Linux�C ���L�A �b�`�J�Ӹ`���e�A �ڥ�����Τ@�q��r�ѻ��@�E�E�K�~��A ��o�i���\���Y�ɧ@�~�t�Ϊ��S��A �W�� Linux KURT�C




�ŻŪ� Linux �Y�ɨt�� (KURT)

�@�E�E�K�~��A ���@�ӥH Linux ����¦���s���Y�ɨt�νϥͤF�C KURT �O�n�����Y�ɧ@�~�t�� (soft real-time system)�A ��p���A �Ƶ{�{���|�յۥh�������� (task) ����ɩһݨD���ɶ��A �Y�Ϧ�������Ȱ��槹���ɶ��W�L�ҹw�����A �]���|�y�����󪺴d�@�C KURT ���Y�ɩʥ��ȥi�H�B�� Linux �Ҧ������ε{���A �o�@�I��n�� RT-Linux �����ȬۤϡC KURT �@�~�t�Ϊ��֤ߵ{�����@�ǧ������ץ��G

  • �ﵽ�F�t�ή������ɶ��ѪR��O�C ����A �b Linux-i386 ���~�N�A �t�ή��������_�W�v�O�C�� 100 ���A �֤ߵ{���N�O�γo�Ӯɶ����q�ӱ��� CPU �M�q���ɶ����C KURT �M RT-Linux �@�ˡA �ĥάۦP�������ӳB�z�ɶ������D�C KURT ���������� (8254) �]�p�F�{���A �ϱo�t�ή��������_�A ���F�H���H��A �@�I�N���A �ӫD�T�w���ܪ��P���F�C �o��@�ӡA �d�����@�����ɶ��ѪR�סA �N�A�]���O�ڤF�C
  • �Ƶ{�{���]�w�g�ק�L�F�G �ĥηs���Ƶ{�����A SCHED_KURT�C �������~�A Linux ���֤ߵ{���w�g��@�F�@�����A �O POSIX �w�q���зǡG SCHED_FIFO�B SCHED_RR �M SCHED_OTHER�C
  • �s���t�ΩI�s��Ƥ]�w�g�[�J KURT�A �H�K��Q�γo�ӷs���Y�ɧ@�~�t�Τ�����C

�Y�ɨt�Ϊ����ȳ��O�ʺA���J���ҲաC

KURT �̨�S�⪺�K�O�Ƶ{�����C �Ƶ{�{���O�`�����A �o�ث������Ƶ{�{���A �O�B�Τ@�i�W���p�e�� (plan) ������A ���x�s�Ҧ��i�J�Ƶ{�����Ȫ��ʧ@�G �Ұʪ��ɨ�B �w�ư��檺���ȡB ���Ȫ����ɵ����C �o�i����}���ɴN�|�ئn�A ������ȭn����ɡA �Ƶ{�{�����u�@�A �N�ȳѤU�̧Ǥ@����Ū����������ƤF�C ���Ƶ{�{��Ū����������ݮɡA �Ƶ{�{���|�^��������̶}�Y�B�A �~��B�z���Ȫ�����u�@ �X�X �]�N�O�o�ˡA �~��o�رƵ{�{���A �R�W���`���Ƶ{�{�� (cyclic scheduler)�C �`���Ƶ{�{�����Ѧh���u�I�G

  • �e����@�C

  • �۷����IJv�C

  • �p�e���@���ئn����A �@�Өt�δN�i�H�ܧ֦a��@�X�� �]���@�Ǭ�s�H���ٰ��H�A �o�O�ߤ@�O�� STR �o�H�ʤ��ʥ��T���檺��k�^�C

�̥D�n���x���I�A �N�b���˥h�s�@�p�e���F�C �٦��A �C���u�n������@�����Ȫ��Ѽư��F�ץ��A �N�������حp�e���F �P�ɡA �x�s�p�e���һݪ��O����]�j����H�C

�Y�ɨt�Φ�����n���S

�]�\�h�ƤH���H���A �Y�ɨt�Ϊ��޳N�u�����Φb NASA�A �άO�ɼu�B ��ž����������̡C ���M�A �b�h�~�H�e�A �o���T�O�Ӥ��餣�����ƹ�A �M�ӡA �@�ƭ쥻�N�ɮ����ơA ��~�ӥѩ��T�t�ΩM�q�l����X���ΡA ���v�B�j�q�a�޶i�@��H����`�ͬ����A���դw�g���F���ܡC �M�ڭ̤�`�ͬ����������̪������ҾڡA �N�O�q�dzq�T (telecommunications) �M�h�C�骺���λ��A ��p���A �p�G�ڭ̷Q�n���q���A �i�H���м���@���x�s��w�и̪������ɡA �B�z���Ī��{���N�o���_�a �]�Ϊ̧�n���A �O�T�w�P�����^ �h�w�и�Ū���ɮ׸�ơA �����Y�A �M���Ʀ��ưe�X�h�����ĥd�C ���p���A �P�@�ɶ��A �ڭ̥��b�ާ@�@�M���γn��A �i��O��ѳB�z�{���A �άO���b�sĶ Linux ���֤ߵ{���F ��M�A CPU �B�z���|�H�P���`�������q�ɶ��A �ӳB�z��L�����ȡC �p�G���񭵮ġA ��b�ù��W���м���v���A �L�B�z�����q�B�z�����G�A �v���K�|�������ʪ����y�C �o�بt�ΫK�O�ҿת��u�n���Y�ɨt�Ρv �]������������_���{�H�ä��|�y�����򥨤j���a�`�A ���L�A �o�˪��t�Ϊ��T�|���C�A�Ȫ��~��^�C

RT-Linux �����ε{���A �M�@�륿�`���Y�����ε{���j�����C �� RT-Linux �Ө��A �ڭ̥i�H���M�x�� PC ���B�@ �]�ڷ|�� PC �Ӥ��O�q���A �O�]����ثe����A ���F�L�q�����~�A RT-Linux �٨S�����Ө��L�ت������[�c�W�h�^�A �p�P�L�h�� MSDOS �@��C ���@�ӧY�ɨt�Ϊ����ȥ浹 CPU �h����ɡA �o�Ӱ��椤�����ȬO�i�H�h�s�� PC �W�Ҧ�����}�����A �Ҧp�ӤJ���_�A�ȱ`���A �Ȯ��������_�A�ȱ`�����\�൥���C ���y�ܻ��A �ڭ̥i�H"�R��"�o�M�t�ΡA �p�P�����t�Ψ��򪺤����@���C ���O�A �ܤS���^�ӡA �o�ؤ�K�����A ���ܳ��w�g�Ǻ륩���p�{���A ���ۤv�q���h�]���H�Ө��A �K�㦳�۷��j���y�O�F�C

�i���J���Ҳ�

�n�Q�A�� RT-Linux�A �٦���Ư�O�h�ϥ� RT-Linux�A ���� Linux �ʺA���J�Ҳժ��[���A �O�����n���D���C Matt Welsh �w�g�g�F���㪺���A �Ӹѻ��ҲթҦ����Ӹ`�C

�Ҳը쩳�O����S

�j������ UNIX �t�Φs���w��ɡ]��}���B�O����B���_�����^�A ���O�g�ѯS�O���ɮרӳB�z���A �q�`�]���O�ߤ@����k�C �t�Φw�ˮɡA �|�ƥ��w�˦n�C�@�ضg��]�Ʃһݪ��X�ʵ{���C ���L�A ���ܦh���������y�����Чڭ̫��h�g�]���X�ʵ{���A �o�`�`�O�J�L��S�������u�@�A �]���ڭ̱o�g�X���Ƥ��֪���ơA ���X�ʵ{���M�t�γs���_�ӡC

�Ҳեi�H���O"�@�~�t�Ϊ����q�{���X"�A �i�H�b��������H�ɥ[�J�άO�����X�ӡC ���]���@��{������l�X�A ���O�x�s�b�U�Ӥ��P���ɮ׸̡A �n���ӽsĶ�A �����A �C�ӳ�@���ɮ׷|���Q���� ".o" ���ت��ɡA �M��A �Ҧ����ت��ɦA�s������@���i�����ɡC ���]�ت��ɤ��A ���@���ɮקt�� main �o�Ө�ƥi�H����A ����@�~�t�ΫK�i�H�N�o���ɮ׸��J�O���餤����A �åB�b�ݭn���ɭԡA ���L���ت��ɳs���i�Ӥ@�_����C ���M�A �֤ߥ����۵M����O�B�z�o�˪����D�C �ƹ�W�A �� Linux �}������A �]�u�������� vmlinuz ���J�O����̡A vmlinuz �t�� Linux �֤ߤ��i�ίʪ�����A �ݨt���ର��������ɡA �֤߫K�i�̻ݨD�Ӹ��J�һݪ��ҲաA �άO���񤣻ݭn���ҲաC

�� Linux �֤ߦӨ��A �ҲլO�i���i�L���S��C �o���S�⥲�o�b�sĶ�֤߮ɡA ��ܾA�����ﶵ�~�o�H�����\�C �N�کҪ��D���A �Ҧ��o��t�Ϊ��֤ߵ{���A ���O�H�ҲդƩw���w�]�ﶵ���C

�ڭ̬Ʀܩ�i�H���t�γ]�p�s���ҲաA �åѮ֤߸��J����A �Ӥ��έ��s�sĶ�t�ΡA �]���έ��s�Ұʨt�ΡC

���@�Ҳո��J�֤߮ɡA �K���F�@�~�t�Ϊ��@�����A �]���G

  • �o�ӼҲեi�H�ϥή֤ߵ{�����Ҧ�����ơA �ӥB�i�H�s���Ҧ����ܼƩM��Ƶ��c�C

  • �o�ӼҲշ|�H�B�z���̰��h�����v��Ӱ���C �N i386 ���[�c�����A �N�O�� 0 �h���� (ring level 0)�F �o��@�ӡA �o�ӼҲմN�i�H�w�� I/O�A ���U���U�˪��s���ʧ@�A �ð���@��{���ҵL�k���檺���O�C

  • �Ҳժ��{���X�M��Ƭq�A ���O�����M�g����骺�O����W�h�A �]�N�O���o�ؼҲդ��i�వ"���� (paging)" ���ʧ@�C �o�򻡨ӡA �b�Ҳհ�������A �N���i��|���ͤ������~�����D�F�C

�p�P�ڭ̩Ҩ����A �ʺA���J�Ҳդw�g���@�ǧY�ɨt�ε{�����S�I�G �ʺA���J�ҲաA �|�קK�Ѥ������~�ҳy�����ɶ�����A �ӥB�ʺA���J�ҲաA �i�H�s���Ҧ����w��귽�C

���ؼҲաS ���ΡS

�Ҳեi�H "C �y��" �Ӽg�C �o�̦��Ӥp�p�Ҳժ��Ҥl �]�n����U���Ҵ��쪺�R�O�A�̦n�O�H su�Broot �������n���t�Ρ^�G

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");
  }

�H�U�@�檺�ѼƨӽsĶ example1.c�G

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

�ﶵ -c �O�n�D gcc �b���ͥت��ɤ���N���U�ӡA ���n�A���s�����ʧ@�C �̫᪺���G�O�@�ӥت��ɡA example1.o�C

�֤ߵ{���ʤּзǿ�X��ơA �]���ڭ̤��i�H�� printf() �o�Ө�ơA �ӭn�H�֤ߵ{���Ҵ��Ѫ� printk() ��ƨӥN���C printk() �M printf() �X�G�S�����ˡA �ߤ@���t�O�O printk() �|���X�����G�A �e��֤ߵ{�������w�İ� (ring buffer) �̡C �o�ӽw�İϬO�t�ΩҦ��T���������a��A �N���}���ɩҨ��쪺�T���A ���i�H�b�o�����w�İϸ̧��C ����ɭԡA �ڭ̳��i�H�� dmseg �R�O�d�ݽw�İϪ����e�A �άO�������� /proc/kmsg �o���ɮסC

�`�N��o�ӼҲո̨èS�� main() ��ơA �ϦӦ��Ӥ��a����Ѽƪ� init_module() ��ơC cleanup_module() �O�̫�@������Ҳիe�A �ҥ����I�s����ơC insmod �O�ΨӸ��J�ҲաA �M�����Ҳժ��C

  # insmod example1.o

�{�b�A �ڭ̤w�g�w�˦n example1 �ҲդF�A �ӥB�]����F example1 �� init_module() ��ơC �n�ݵ��G�A �Х��U�C���R�O�G

  # dmesg | tail -1
  Output= 1   

�R�O lsmod �|�C�X���e�Ҧ����J�֤ߤ����ҲաG

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

�̫�O�A�ڭ̥� rmmod ������ҲաG

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

dmesg ��ܤF��� cleanup_module() �w�g����F�C

�{�b�A �ڭ̥u�t�٤����D����Ѽƶǵ��ҲդF�C �o�Ӥ�k�X�_��²��A �u�n���w�ƭȵ������ܼơA �A�ǥ� insmod ��Ѽƶǻ����ҲմN��F�C �Ҧp�G

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

�{�b�A �Ҳդj�j�p�p���Ʊ��A �Ӫ��D�������D�F�C �^ RT-Linux �F�a�I

�A���Ĥ@�ӧY�ɨt�ε{��

�����A �O���@�I�A �n�Q�� RT-Linux�A �N�o�w���dzƦn Linux ���֤ߵ{���A �H�䴩�Y�ɨt�μҲաC �o�@�����������A �Ԩ��Ĥ@�g�峹�C

RT-Linux �i�H����ؾާ@��k�G

  1. ���@�嫬���Y�ɨt�ΨӥΡA �{�����u���v�����������ܡA �Ƶ{�{���|�̾ڨƥ��]�w�n���u���v���ǡA �Ӱ���{���C

  2. ���@�� PC �ӥΡA ���I�� DOS ���ˤl�G �ɮ����_�T���A �����x���q�����B�@�C

�o�@���ڷQ���Q�צb�Ĥ@�ر��p�U�A ��˧� RT-Linux ���@�Y�ɨt�ΨӨϥΡC �դU�Y�N�n�ݨ쪺�{���d�ҡA �����èS������"�γ~"�A �ȶȬO�]�w�F�@�ӧY�ɨt�Ϊ����ȦӤw�]�@��²�檺�j��{���^�G

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);
  }

�P�˪��A�H�U�C���R�O�ӽsĶ example2.c�G

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

�J�M�O�ҲաA�{�����_�I�۵M�O��� init_module()�F�C�o�ӼҲ��Y�@�󰵪��ƴN�O�hŪ���e���ɶ��M���ɶ��x�s�b�@�ӧ����ܼƸ̡Crt_get_time()��Ʒ|�Ǧ^�q�}���_�Ҹg�L���ɶ��� RT_TICKS_PER_SEC �]�ثe�����A RT_TICKS_PER_SEC�O1.193.180�A�ѪR�׬O0.838 micro-seconds�^�C �����rt_task_init()�ɡA"task" structure�|�i���ȳ]�w�A���٨S�}�]�C �o�Ӫ����Ȫ��D�{���Ofun()�A�ĤG�ӰѼơC�U�@�ӰѼƬO���stask�n�}�l����ɡA�n�ǻ����stask����ƭȡC�n�`�N��fun()�n���Oint���A���ѼơC�U�@�ӰѼƬOtask���|�Ŷ����j�p�A�o�O�]���C�@��task�����L�ۤv��������]thread of execution�^�A�]���C��task���ݭn���ۤv�����|�Ŷ��C�̫�@�ӰѼƬO�u���v�F�N�o�ӵ{���Ҩ����A�u���@����Ȧb�t�ΤW����A�ڭ̥i�H�]�w����ҭn���ƭȡC

rt_task_make_periodic()�|������ഫ���`�������ȡC�o�ݭn��Ӯɶ��ѼơA�Ĥ@�ӬO�O�����ȲĤ@���Q�Ұʪ�����ɶ��A�ӲĤG�ӬO�s��Ұʪ����Ȥ����A�q�Ĥ@�ӥ��Ȱ_�⪺�ɶ����j�C

�o�ӧY�ɨt�Υ��ȡ]�N�O���fun()�^�O�@�ӵL�a���j��A�u�����Ʊ��G�@�O���O�ɶ����j��A�G�O�I�s rt_task_wait()�Crt_task_wait()�O�ΨӼȮɤ�����Ȱ��檺��ơA����U�@�����Ұʮɶ��]activation time�^��F����C���ۥ��ȷ|�q�򱵦brt_task_wait()�᭱���ԭz�}�l����CŪ���������A�A�`���������ȨëD�C���Ұʮɳ��|�q�Y�}�l����{���A�ӬO�ۦ�Ȱ�����A�õ��ݤU�@�����Ұʮɶ���ӡC�o�س]�p����|�����ȶȦb�Ĥ@���I�s�ɰ���@����ȳ]�w���u�@�A�]�����Ȥ��|�q�Y�}�l����C

���� example2 ���e�A �����w�˦n rt_prio_sched �ҲաA �o�O�]�� example2 �ݭn rt_task_make_periodic()�B rt_task_delete() �M rt_task_init() �o�Ǩ�ơC ��� rt_get_time() �èS���]�t�b�o�ӼҲո̭��A �o�Ө�Ʀs��b Linux ���֤ߵ{�����A �]���ä��ݭn�h���w�˪��ʧ@�C

  # modprobe rt_prio_sched
  # insmod ./example2.o

�w���� rt_prio_sched�A �O�t�Υ������ҲաC �o�ӼҲշ|�b Linux �֤߽sĶ�����إX�ӡA �M������� /var/modules/2.0.33/ �o�ӥؿ����U�C �ڭ̨ϥ� modprobe �o�өR�O�A ��]�O�o�O�Ӥ��²�檺�u��A �N���J�Ҳը����]modprobe�|�b�Ҳժ��ؿ����j�M�����J���Ҳա^�C �]�Ѩ� modprobe(1)�^�C

�խY�Ҧ����B�J���ܶ��Q�A �u�n�A�[ lsmod �R�O�A �N�i�H�ݨ��ӼҲճ����T�a���J�F�C

��A ��F�o�Ӷ��q�A �դU�w�g���F�@�ӧY�ɨt�ε{���b�t�ΤW�]�F�C �A���S���o�{����S�O���Ʊ��o�͡S ���p�B�z�������N�]�o����C�A �A�|�o�{ Linux �]�o�񥭱`�٭n�C�C �A�i�H�յۥh�W�[ fun() ��Ƥ��A �����j�骺������ơA �u�n���� rt_task_init() ��ƪ��ĤT�ӰѼƫK�i�H�F�C �ګ�ijŪ�̤����]�@�U ico�A �d�d�ݳB�z����Ѿl���ɶ��֤F�h�֡C �]���Y�ɨt�ε{���үӥΪ��ɶ��A �|�y���B�z�����O�t���ܺC�F���A Linux �|�H���Ҧ����{�ǡA �һݨD������ɶ��W�L�쥻�һݪ��C �p�G�p��X�Ӫ��ɶ� �X�X �N�O����Ҧ��j��һݪ��ɶ� �X�X �j�L 100 �@�� (microseconds)�A Linux �N�|"��"�b����F�C �]�� Linux �O�I���{���A �ӳo�ӧY�ɨt�Υ��ȷ|�ӺɩҦ����ɶ��C �ƹ�W�A Linux �èS�������A Linux �u�O�o����B�z�����ɶ��}�F�C

���ȳq�T

RT-Linux �u���@�إ��ȳq�T����k�G Real-Time FIFO�C �o�Ӥ�k������ UNIX �� PIPEs�A �ȥH��Ƭy�ӳq�T�A �ӨS�����󪺸�Ƶ��c�C FIFO �O�@���T�w�j�p���w�İϡA �Ψ�Ū�g��Ƥ��ΡC

�ĥ� FIFOs �i�H���Y�ɨt�ΡA ���ȶ��������q�T�ͩ�í�w�F ���@�� Linux �����ȦӨ��A �]�P�˾A�ΡC

�q���`�{�� (process) �������Ӭ��A FIFO �O�@�ӯS���r�����ɮסC �@��Ө��A �|�O /dev/rtf0�B /dev/rtf1 �����Ѧp�������C �o���ɮרä��O Linux �즳���A �ҥH�����B�~�A�ءC ��k�p�U�G

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

�p�G FIFOs ���ݨD�W�L�W�C���|���A ��L�� FIFO �N�i�H�̼˵e��Ī�a�s�@�X�ӡA �p rtf4�B rtf5 �����C �o�ǯS���ɮת��@�ΡA �N�n��handler�������@�ˡA ���O�p�G handler ���s�b�A �o�ǯS���ɮ״N�@�I���Ȥ]�S���F�C �ƹ�W�A �p�G�@�~�t�ΨS���۹����� handler�A �@�w�S����k���\�a�}�ҳo�ǯS���ɮסC

DrawObject

�B�z FIFOs ���ɮשM���`���ɮרS������ (open�B read/write�B close)�C �p�G Linux ���`���{�� (process) �n�ϥ� FIFOs�A �����A �Y�ɨt�ε{���o���إ߬۹����� FIFO�C

�q�Y�ɨt�Υ��Ȫ������Ӭ��A FIFOs �O�g�ѯS�w��ƨӨϥΪ��G

  • rt_create(unsigned int fifo, int sise)�G �إߤ@�� FIFO�A �w�İϤj�p�� size�C �q�o�Ӯɭ԰_�A �@���� FIFO �Q�R�����e�A �]�Ƴ��i�g�� /dev/rtf[fifo] �Ӧs���C

  • rt_destroy(unsigned int fifo)�G �۹����� FIFO �|�Q�R���A �B�Ҧ������O����|���s���t�C

  • rt_fifo_put(fifo, char *buf, int count)�G ���ձq�w�İ� buf ���g�J count �Ӧ줸�աC �p�G FIFO ���w�İϪŶ������A �N�Ǧ^ -1�C

  • rt_fifo_get(fifo, char *buf, count)�G �յ۱q FIFO ��Ū�X count �Ӧ줸�աC �p�G�S����������ƥi�HŪ���A �N�Ǧ^ -1�C

�U�@�ӨҤl�Ӭݬݳo�Ǩ�ƪ��ϥΤ�k�C �o�O�@�� RT-Linux�]���ġ^�o��t�Τ��A ���L�ǷL�ק諸�Ҥl�G

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);
  }

�p�P�ĤG�ӽd�ҩҥܡA �ڭ̻ݭn rt_prio_sched �Ҳժ��A�ȡA ���O�A �o�@�����F�ϥ� FIFO�A �ڭ̥����P�ɸ��J rt_fifo_new �ҲաC

�W�v 8192Hz ���`���Y�ɨt�Υ��Ȥw�g�ئn�F�C �p�G�o���ȵo�{�����󪺸�ơA �e�� PC �o�n������}���A �N�|�q FIFO 0 ��Ū���줸�ժ���ơC �p�G�ڭ̧�@�� ".au" �榡�������ɮ׫����� /dev/rtf0�A �{�b�N�i�Hťť�ݭ����ɪ����Ħp��F�C �]�� PC ���w��A �Ȥ��\�H�@�줸�h�ո`�H���A �ҥH�����h�b�N���Ī��~��C�H�C �o��t�Ϊ��ؿ� testing/sound ���� linux.au �o���ɮסA �i�H�ΨӴ��աC

���۬O�sĶ�{���A �M�����G

   # 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

�`�N�� cat �o�Ӥu��{���O���ΨӰ��мg�ɮת��A �]�t�F�S���ɮסC �R�O cp ���P�˪��ĪG�C

�n����Y�ɨt�Ϊ��S��|��˼v�Q�ƻs�~���~��A �ڭ̥u�n�t�~�A�g�ӵ{���A �� Linux ���`���{�ǨӳB�z�ۦP���u�@�G

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();
  }

�o��{���i�H����L²�檺�{�����˨ӽsĶ�G

  # gcc -O2 example4.c -o  example4

And to execute it:

  # cat linux.au | example4

�n�g�� Linux ���{���Ӧs���w�骺��}���A�ڭ̱o���ШD�@�~�t�Ϊ���\�C �o�O�קK�{�������s���w��귽�A �̰򥻥B���n���O�@���I�C �Ҧp�A �I�s��� ioperm() �|�i�D Linux�A �ڭ̧Ʊ�h�s���Y�@�w�d�� I/O ��}���C �u�����{���O�H root �������Ӱ���ɡA �{���~���i��o��o���v�O�C �t�@�ӭȱo�`�N���O�A 8192Hz ���W�v�p��ո`���ġA �Ϩ䲣���n���C ���M���Өt�ΩI�s��� nanodelay() �i�ΡA ���o�Ө�ƶȦ��T�w���ʸU�����@�� (milliseconds) ���ѪR�סF �]���A �ڭ̥����ϥΰj��ӵ������ݪ��ɶ��A �Ϯ����|�Ȱ��@�U�U�C �o�ӵ��ݰj�饲���վ��t���h�i�H�b 100MHz �� Pentium �W����C

�{�b�A �ګ�ijŪ�̤������դ@�U example4 �M ico�C �n��ť�_�ӫ��ˡS �ﴫ���Y�ɨt�Ϊ����� Linux �Pı�p��S �Y�ɨt�άO���O�����ȥi���O�S

����

�ĤG�g�峹��J�I��b�]�p�Y�ɨt�ε{���C �峹���ҦC�|���{���d�ҡA ���D�`²��B�ʥF��ڥγ~�A ���U�Ӫ��t�C�峹�A �ڷ|���X�󦳥Ϊ����νd�ҡC �ڭ̱N�i�H�� Linux �ӱ���q���A �Ʀܩ�i�H�q���ݡA �ӨM�w�A�M�A�� Linux �����q�T����k (Linux box)!!!

�ѦҸ�ơG


����� Frank J.S. Chen ��½Ķ

�D������ Miguel A Sepulveda ���@
© Ismael Ripoll 1998
LinuxFocus 1998