C编程控制PC蜂鸣器
  在《I/O映射之I/O端口》一文中,我们实现了在Linux内核驱动里实现IO端口操作8254定时计数器芯片里的寄存器来实现PC主机蜂鸣器的控制,那么在C语言里是不是一样也能用io控制函数来操作呢?当然是可以的,只不过作为应用程序,其需要使用iopl或ioperm函数先获得IO操作的权限,其函数原型如下: 1.iopl - change I/O privilege level  #include <sys/io.h> int iopl(int level);   2.ioperm - set port input/output permissions  #include <unistd.h> /* for libc5 */ #include <sys/io.h> /* for glibc */ int ioperm(unsigned long from, unsigned long num, int turn_on);   其中,iopl修改程序运行时操作io的权限级别,默认是0,最大是3;而ioperm是设置从from开始的num个io端口turn_on状态。(详细看man) 有了《I/O映射之I/O端口》一文和上面的内容学习,接下来用C来实现就很容易了,其中关于inb等函数头可使用man inb命令查阅,下面上代码吧:  #include <stdio.h> #include <unistd.h> #include <sys/io.h>  /* The clock frequency of the i8253/i8254 PIT */ #define PIT_TICK_RATE 1193182ul  void beep(unsigned int val) {         unsigned int count = 0;          if (val > 20 && val < 32767)                 count = PIT_TICK_RATE / val;          iopl(3);          if (count) {                 outb_p(0xB6, 0x43);               ...