您当前的位置: 核心期刊论文发表咨询网电子论文》微机UNIX直接视频图形程序设计论文

微机UNIX直接视频图形程序设计论文

来源:核心期刊论文发表咨询网 所属分类:电子论文 点击:次 时间:2013-08-29 17:57

  微机UNIX直接视频图形程序设计

  UNIX操作系统提供了X-Window图形窗口系统和OPENLOOK图形用户界面,这些系统不仅昂贵、庞大,而且不便于移植以前开发的DOS图形应用程序。本文介绍利用微机内部硬件控制,针对EGA/VGA图形适配器,进行直接视频图形程序设计。对于比较熟悉PC-AT体系结构和视频程序设计知识的程序员来说,更喜欢后者,因为能有效地利用硬件特性,加快图形处理速度。

  进行图形程序设计时,还须考虑视频接口的一个重要特性——虚拟终端功能,因为它允许控制几个独立的图形应用窗口,允许多个应用程序在同一个终端上进行切换。本文提供针对IBM标准终端对虚拟终端进行有效管理的手段。

  微机UNIX直接视频图形程序设计有两种方法,一种是利用设备驱动程序(见参考文献1),另一种是针对IBM标准终端进行编程,本文介绍后者。

  一、图形程序设计

  1.检测视频适配器

  视频显示器是由视频适配器硬件控制的,视频适配器决定了图形方式下显示图形的分辨率及可能的颜色[2]。利用系统调用ioctl中的CONS-CURRENT命令可以检测到当前的视频适配器,即:

  ioctl(0,CONS-CURRENT,NULL)

  返回-1时表示出错,即没有相应的视频适配器硬件,如果检测到VGA卡则返回值为VGA,如果检测到EGA卡则返回值为EGA,……。

  2.初始化图形系统

  初始化图形必须完成下列任务。

  (1) 获取当前的视频显示方式

  ioctl的CONS-GET命令用来判断当前适配器的显示方式,即:

  ioctl(0,CONS-GET,NULL)

  它返回显示方式的值,这些值在包含文件vtkd.h中均有定义,如:SW-VAG640x480C为VGA适配器设置成640x480分辨率彩色图形模式。

  (2) 设置图形模式

  直接将图形模式值放入ioctl中的命令项即可设置相应的图形模式,如ioctl(0,SW-VGA640x480C,NULL)

  将VGA适配器设置成640x480分辨率的彩色图形模式。

  (3) 获取图形模式下视频缓冲区物理地址

  利用ioctl的MAPCONS命令可以实现此功能,即:

  char *scrnmem;

  scrnmem=(char *)ioctl(0,MAPCONS,NULL)

  所有实现基本图素的操作都将针对scrnmem进行,scrnmem就是EGA/VGA相应的四个位平面的重叠地址,有关EGA/VGA的结构可参阅[2]。

  3.实现基本图素

  DOS操作系统下,对EGA/VGA的各种视频I/O寄存器进行操作是很方便的,可以直接使用汇编语言in和out指令进行读写。然而,UNIX操作系统下,对物理硬件的访问都是由UNIX系统核心和设备驱动程序管理的,要访问EGA/VGA的各种I/O寄存器,必须获得对其访问的特权,为了实现这种功能要求,可以使用下列ioctl系统调用方式:

  ioctl(0,VGA-IOPRIVL,1) 获取VGA的各种I/O寄存器的访问特权

  ioctl(0,EGA-IOPRIVL,1) 获取EGA的各种I/O寄存器的访问特权

  UNIX操作系统基本上是采用C语言编写的,只是在低层的系统内核方面才使用低级的汇编语言,遵循这一原则,对EGA/VGA的I/O寄存器的访问可以采用汇编语言,而实现图形系统的基本图素则采用C语言。

  如果用户的UNIX系统中已有inb()和outb()函数(嵌入在/usr/include/sys/inline.h中),则可以直接使用它们完成对各种I/O寄存器的读写,否则,必须编写下列低级汇编语言例程:

  /*向一端口输出一字节*/

  /*从一端口输入一字节 */

  void outb(int port,uchar value)

  {

  -asm push edx

  -asm mov edx,port

  -asm mov al,value

  -asm out dx,al

  -asm pop edx

  }

  uchar inb(int port)

  {

  -asm push edx

  -asm mov edx,port

  -asm in al,dx

  -asm pop edx

  }

  基本图素一般包括:设置颜色,对调色板的操作,画点、线、弧、矩形、圆、椭圆、多边形、画扇形、饼图,任意图形填充,多边形填充,保存屏幕,恢复屏幕等,这些操作均可用C语言实现,细节问题可参阅[2]。

  4.关闭图形系统

  退出图形系统之前必须恢复EGA/VGA各I/O寄存器的值,并将显示模式恢复到进入图形模式之前的模式。采用下列ioctl调用实现:

  ioctl(0,MODESWITCH | oldmode,NULL)

  oldmode是进入图形方式之前获取的方式,UNIX系统中,获取的方式和设置的方式之间的关系为:

  设置方式值=获取方式值|MODESWITCH

  二、虚拟终端的使用

  虚拟终端(Virtual Terminal,简称VT)加强了UNIX系统V/386的接口功能,它不仅允许单个用户开发一个图形应用软件,而且允许多用户、多道程序在同一个物理终端上运行,在开始一个用户的应用程序之前不必停止另一个应用程序,而且各个用户之间可以互相切换。

  虚拟终端有两种操作方式[1],一种是自动操作方式(VT-AUTO),这是默认情况,比较简单,应用程序并不了解终端用户接受或放弃当前VT的请求,这意味着被切换掉的进程的任何输入输出都可能丢失。另一种方式是进程控制方式(VT-PROCESS),该方式支持应用程序与其它正在使用VT的进程之间同步,应用程序可以负责接受或放弃使用VT。

  [1]中介绍了以进程方式控制VT的过程,并以设备驱动程序方式介绍了接受和放弃对VT控制的信号处理例程。本文给出针对IBM标准终端编制VT的程序和相应的信号处理例程。

  /* 设置虚拟终端 */

  void setvirtualterm(void)

  {

  struct vt-mode vtmode;

  signal(SIGUSR1,release-disp); //release-disp为放弃VT的信号处理例程

  signal(SIGUSR2,acquire-disp); //acquire-disp为接受VT的信号处理例程

  vtmode.mode=VT_PROCESS; //设置进程控制方式

  vtmode.relsig=SIGUSR1;

  vtmode.acqsig=SIGUSR2;

  if (ioctl(0,VT-SETMODE,&vtmode)==-1) exit(1);//出错即终止此进程

  }

  /* 放弃VT的信号处理例程 */

  void release-disp(void)

  {

  signal(SIGUSR1,release-disp);

  保存整个图形屏幕于内部缓冲区videobuf中;

  ioctl(0),MODESWITCH | oldmode,NULL);

  //oldmode为进入图形模式之前的显示方式

  ioctl(0,VT-RELDISP,VT-TRUE);

  //VT-TRUE表明同意放弃VT,如果此项为0,则表示拒绝放弃VT.

  }

  /* 接受VT的信号处理例程 */

  void acquire-disp(void)

  {

  signal(SIGUSR2,acquire-disp);

  ioctl(0,newmode,NULL);//newmode为应用程序所处的图形模式

  scrnmem=(char *)ioctl(0,MAPCONS,NULL);

  //重新获取图形缓冲区的物理地址

  从videobuf中恢复整个图形屏幕,并释放videobuf;

  ioctl(0,VT-RELDISP,VT-ACKACQ); //VT-ACKACQ表明接受VT

  }

  在微机UNIX操作系统下,针对EGA/VGA进行直接视频程序设计,独立开发一个图形程序包,不仅小巧方便,而且可以重用以前在DOS下开发的图形应用程序。笔者在SCO UNIX系统下开发了一个小的低层图形软件包,许多以前的DOS图形应用程序都可以移植到UNIX系统下来。

  另外,本文介绍的程序在使用前还应包含下列文件,即:

  #include

  #include

  #include

  #include

  #include

  #include

  分配空间时还应加上#include

  参考文献

  1 仲萃豪等.UNIX系统V/386第4版-集成软件开发指南.北京:电子工业出版社,1992.8.

  2 张福炎等.微型计算机IBM PC的原理与应用(续二)-图形显示器及其程序设计.南京:南京大学出版社,1990.7.

转载请注明来自:http://www.lunwencheng.com/lunwen/dzi/1607.html

各行业核心期刊快速入口

医学类核心期刊汇总
口腔核心期刊
卫生核心期刊
药学核心期刊
眼科核心期刊
儿科核心期刊
医学核心期刊
兽医核心期刊
外科核心期刊
护理核心期刊
临床核心期刊
教育类核心期刊汇总
小学教育核心期刊
中学教育核心期刊
高等教育核心期刊
职业教育核心期刊
成人教育核心期刊
人文教育核心期刊
科学教育核心期刊
教育核心期刊
教学核心期刊
教育管理核心期刊
学科类核心期刊汇总
语文核心期刊
数学核心期刊
外语核心期刊
化学核心期刊
物理核心期刊
历史核心期刊
政治核心期刊
体育核心期刊
艺术核心期刊
法律核心期刊
经济类核心期刊汇总
市场经济核心期刊
经济核心期刊
金融核心期刊
财经核心期刊
审计核心期刊
旅游核心期刊
统计核心期刊
会计核心期刊
农业类核心期刊汇总
畜牧核心期刊
农业核心期刊
林业核心期刊
工业类核心期刊汇总
机械核心期刊
冶金核心期刊
电力核心期刊
铁路核心期刊
电气核心期刊
工业核心期刊
石油核心期刊
环境类核心期刊汇总
电力核心期刊
水利核心期刊
能源核心期刊
地质核心期刊
化工核心期刊
环境核心期刊
气象核心期刊
地理核心期刊
建筑类核心期刊汇总
测绘核心期刊
测量核心期刊
建筑核心期刊
交通类核心期刊汇总
铁路核心期刊
公路核心期刊
交通核心期刊
运输核心期刊
汽车核心期刊
轨道核心期刊
科技类核心期刊汇总
电子核心期刊
科技核心期刊
计算机核心期刊
其他类核心期刊汇总
管理核心期刊
档案核心期刊
心理核心期刊
政法核心期刊
文学核心期刊