无锡一网激光设备有限公司--专业研发生产销售激光打标机、光纤激光打标机、CO2激光打字机、半导体激光器,提供激光加工、激光配件及激光维修服务。热线:0510-88703162

  杭州萧功激光设备公司热线:13777567846

无锡一网激光设备公司热线:15358051101
 

网站首页 激光配件 激光打标机 激光喷码机 激光机 激光加工 关于一网 激光技术
 
激光设备
最新文章
   激光打标系统的工作…2020-2-19
   激光打标机技术相关…2020-3-9
   激光打标机软件综述2020-3-9
   激光打标机软件精确…2020-3-9
   激光打标机软件实时…2020-3-9
   激光打标机软件实时…2020-3-9
   激光打标机微秒级精…2020-3-9
   激光打标机软件实例2020-2-25
   激光打标机数据输出…2020-2-25
   激光打标机软件框架…2020-2-25
   激光打码机软件系统…2020-2-25
   激光打标机软件运行…2020-2-24
客户服务
江苏地址:江苏无锡市锡山经
济技术开发区春雷路101号
TEL: 0510-88703162
手机:13777567846
浙江地址:浙江杭州市
富阳市迎宾北路205号
TEL: 0571—63163880
Email:ewlaser@aliyun.com
  行业新闻->激光打标机软件精确定时实现方案

激光打标机软件精确定时实现方案

2020-3-9 18:14:37

5.1 精确定时实现方案

 

要实现微秒级别精度的实时控制,关键就在于获取一个可靠的微秒精度的定时器,可惜 Windows 操作系统提供的系统定时器与多媒体定时器都是毫秒级的,并且还不准确。从上一节对 Window98 定时方法的分析中,发现微秒级定时方法的精度可以达到要求,因此作者提出的第一个解决方案是使用 QueryPerformanceFrequency 函数和 QueryPerformanceCounter 定时。

5.4.1 保护模式下微秒级定时

 

Windows98 可以在保护模式和 V86 模式工作,保护模式给我们带来很多优越性。在保护模式下,线程调度采用的是基于优先级的抢占式多任务调度算法,依据优先级和分配时间配额来调度线程,因此调度系统总是运行优先级最高的线程。Windows 系统中,可以多个线程并发运行。为了让用户感觉所有线程都在同时运行的逼真的假象,良好的线程调度策略显得十分重要。一个糟糕的调度策略会使操作系统变得十分缓慢,无法满足用户的需求。Windows 操作系统为了解决系统效率问题,采用了基于优先级和分配时间配额的调度策略。

Windows 系统有 32 种优先级,从 0 31,16 个实时线程优先级(16-31),实际上不是实时级别,因为它没有给出时间保证和时间期限;15 个可变线程优先级

(1-15);一个系统线程优先级(0),仅用于对系统中空闲物理页面进行清零的零页线程。每个线程都有一个基本优先级和当前优先级。在某种特定的情况下,一个用户线程的当前优先级可以被提高到高于基本优先级,但是不会高于优先级 15。要把线程的优先级提升到实时优先级,用户必须有升高线程优先级的权限。如果用户进程在实时优先级运行时间过多,它将可能阻塞关键系统功能的执行,阻塞系统线程的运行;但不会阻塞硬件中断处理。

Windows 还给每个线程一定的时间配额来访问处理器。时间配额是一个线程从进入运行状态到 Windows 检查是否有其他优先级相同的线程需要开始运行之间的时间总和。一旦时间配额被线程用完,则 Windows 中断该线程,让另一个具有相同优先权的线程运行。如果有一个具有更高优先级的线程准备执行,则 Windows 会中断当前执行线程而让优先级更高的线程运行。

Windows 是根据优先级和分配时间配额来对线程进行调度的。由于有 32 个优先级,系统维护了一个有 32 个数组项的数组,分别对应优先级 0 31。每个数组项存

放指向在相应优先级的线程就绪队列的表头。基本调度算法是系统按优先级 31 到优

先级 0 的顺序扫描数组,寻找非空队列,一旦找到便选出队列首线程,让其运行一个时间片。若时间被用完了,线程被换下 CPU,回到原来优先级的队列末尾,系统再选出排在队列头的线程。若多个线程在最高优先级处于就绪状态时,它们每个循环执行一个时间片。如果没有线程就绪,空闲线程就开始运行。

为确保精确定时的实现,必须将定时线程的优先级提到最高,达到实时优先级,

Windows 98 提供了二个系统 API[34,35]分别用来设置进程与线程的优先级:

1. 进程优先级的设置:

BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass);


hProcess:当前进程句柄,可以通过函数 GetCurrentProcess()得到; dwPriorityClass:优先级的设置,可以设置的级别如表 5-1:

5-1  进程优先级

 

级别

dwPriorityClass

描 述

实时

REALTIME_PRIORITY_CLASS

立即对事件作出响应,执行关键时间的任务

高于正常

HIGH_PRIORITY_CLASS ABOVE_NORMAL_PRIORITY_CLASS

立即对事件作出响应

在正常优先级与高优先级之间运行

正 常 低于正常

NORMAL_PRIORITY_CLASS BELOW_NORMAL_PRIORITY_CLASS

没有特殊调度需求

在正常优先级与空闲优先级之间运行

空闲

IDLE_PRIORITY_CLASS

在系统空闲时运行

 

2. 线程优先级设置:

BOOL SetThreadPriority(HANDLE hThread, int  nPriority); hThread:当前进程句柄,可以通过函数 GetCurrentThread ()得到; nPriority:优先级的设置,可以设置的级别如表 5-2:

表 5-2 线程的优先级别

 

级别

nPriority

描 述

实时高

THREAD_PRIORITY_CRITICAL THREAD_PRIORITY_HIGHEST

该线程的优先级为 31

该线程的优先级将比所属的进程的优先

 

高于正常

 

THREAD_PRIORITY_ABOVE_NORMAL

级大 2

该线程的优先级将比所属的进程的优先级大 1

正常

THREAD_PRIORITY_NORMAL

该线程的优先级将与所属的进程的优先级一样大

低于正常

THREAD_PRIORITY_BELOW_NORMAL

该线程的优先级将比所属的进程的优先级小 1

THREAD_PRIORITY_LOWEST

该线程的优先级将比所属的进程的优先级小 2

空闲

THREAD_PRIORITY_IDLE

该线程所属的进程的优先级为实时的话,该线程优先级为 16,否则为 1

由前文的分析,定时程序为达到实时性要求,必须将当前线程的优先级提到最高,即优先级为 31,其设置方法如下:

hProcess = GetCurrentProcess(); //当前进程SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS);

//设置进程优先级为实时优先级hThread = GetCurrentThread(); //当前线程


SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);

//设置线程优先级为实时优先级

当定时结束之后,将进程与线程的优先级重新设置为正常优先级,保证其它线程亦可以分配到时间片。这种方法直接对当前的线程提升优先级,而没有产生一个新的线程专门负责定时。使用实时的优先级在 win32 程序中可以达到最高的优先级, 可以抢先于其它所有应用程序运行。但是由于 windows98 的进程调度机制不是单线程独占式的,这使得即使当定时器的当前线程优先级最高,CPU 仍然会分配一定的时间片给其它进程,以保证其它高优先级线程的运行,例如一些实时的系统进程与驱动进程。一旦 CPU 被其它任务抢占,定时进程重新夺回 CPU 的时间是无法确定的,当定时进程重新获得时间片时,虽然可以很精确的计算出定时的时间,但此时已达不到微秒级定时的要求,很可能已经过了定时器所定的时间,达到毫秒级别。因此,利用 QueryPerformanceFrequency QueryPerformanceCounter 函数可以进行高精度的计时,但在 windows98 平台下无法完成微秒定时功能。

5.4.2 基于 VxD 的精确定时方法

 

由于 windows98 在保护模式下,对应用程序拥有的权限级别是第 3 级(ring3),它们享有的权限是最低的,受到了保护模式的限制,因此,提升一个定时过程的权限级别达到 0 级,从而使它的优先级达到最高,其它的进程与中断都无法抢夺其资源是解决精确定时问题的关键。

由前文所述,VxD 程序[36,37,38]都是运行在 ring0 层上,只要软件的应用程序调用一个 VxD 的定时程序,就可以实现微秒定时功能。下面介绍一个完整的 VxD 的定时程序产生方法。

1)  VtoolsD 工具包中的 Quick VxD 软件生成一个完整的 VxD 程序

Quick VxD 可视化编程环境中,Quick VxD 根据要求的各种选择快速创建一 VxD 工程文件。此文件包括:C/C++头文件,C/C++代码文件,C/C++工程文件。头文件中含有 VxD 所必须的类声明,还有 VxD 控制消息处理函数声明,Windows ring3 API 调用 VxD 的调用入口声明等;代码文件中,QuickVxD 预先生成了许多须


继续编程来扩充其内在功能的类成员函数,但是 VxD 程序支持 Win32 类库。 VxD 可通过处理 VxD 的控制过程中 W32_DEVICEIOCONTROL 消息以支持设备 IOCTL 接口,为实现与 VxD Win32 应用程序的通信, 需要在创建时选择加载W32_DEVICEIOCONTROL 消息函数功能。

2) 主程序加载 VxD[39]的过程

Windows 98 通过 DeviceIoControl 函数实现设备输入输出控制(IOCTL)接口, 该函数可以向指定的 VxD 发送命令和传递相应的数据。可以用 CreateFile 函数打开 VxD,用 DeviceIoControl 向此 VxD 发送命令,最后用 CloseHandle 函数关闭此VxD 即可。

下面简单介绍一下上述三个函数:

a) HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,

HANDLE hTemplateFile );

函数成功调用将返回一个指定文件的打开的句柄。参数 lpFileName 是指向一个字符串的指针,该字符串包含需生成或打开的对象名,在此我们使用的是 VxD 文件; dwDesiredAccess 是访问对象的模式,有读、写、读写或设备查询等;dwShareMode 是对象的共享模式,如果该参数为零则对象不可共享;lpSecurityAttributes 是指向安全属性结构的指针;dwCreationDisposition 指出了当文件存在或不存在时的各种操作;dwFlagsAndAttributes 指明了文件属性和标志;hTemplateFile 是一个句柄,该句柄指向一读属性的模板文件,Windows98 中的此参数必须为 NULL。

b) BOOL DeviceIoControl(HANDLE hDevice,DWORD dwIoControlCode, LPVOID lpInBuffer,DWORD nInBufferSize,LPVOID lpOutBuffer,

DWORD nOutBufferSize,LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped );

函数成功调用返回为非零值。参数 hDevice 是要执行操作的设备的句柄,由调用CreateFile 而获得;dwIoControlCode 指出了操作的控制代码;lpInBuffer 为指向一缓冲区的指针,缓冲区中是有待操作的数据;nInBufferSize lpInBuffer 缓冲区的大小, 单位是字节;lpOutBuffer 也为指向一缓冲区的指针,缓冲区中是操作的输出数据; nOutBufferSize lpOutBuffer 缓冲区的大小,单位是字节;lpBytesReturned 指向一


变量以接收存储到 lpOutBuffer 中的数据的大小,单位也是字节;lpOverlapped 是

OVERLAPPED 结构的指针。

c) BOOL CloseHandle( HANDLE hObject );

若函数调用成功则返回一个非零值。参数 hObject 是一个打开对象的句柄。

可以在调用 CreateFile 函数时指定模块名、文件名或标志某个 VxD 的登记簿项来打开一个静态的或动态可装载的 VxD[40]。若此 VxD 存在且支持设备 IOCTL 接口, CreateFile 将返回一个设备句柄,此句柄可作为 DeviceIoControl 函数调用时的参数。否则 CreateFile 将失败,并将上一个错误值设为 ERROR_NOT_SUPPORTED 或ERROR_FILE_NOT_FOUND。错误值可调用函数 GetLastError 获得。

在打开 VxD 时,必须按下列形式指定其名称:\\ . \\VxDName,其中 VxDName 可以是指定模块名、文件名或标志某个 VxD 的登记簿项的名称。我们指定扩展名.VXD,函数将在标准搜索路径(一般为 Windows 下的 system)中查找此文件,如: HANDLE hDevice hDevice=CreateFile("\\\\.\\testPCI.VxD",0,0,NULL,0,FILE_FLAG_DELETE_ON_ CLOSE, NULL);

同一个 VxD 可以打开任意多次,每次打开时,CreateFile 都会提供此 VxD 的一个唯一句柄,但内存中决不会装入两份 VxD。为保证系统能在关闭 VxD 的最后一个 VxD FILE_FLAG_DELETE_ON_CLOSE 值。

可用 DeviceIoControl VxD 发命令。在本文所用的方法中,这是 Win32 VxD 进行通信的途径,此时应指定先前打开的设备句柄,控制代码及输入输出参数。设备句柄标志了要向其发送命令的VxD,控制代码则指定了要此VxD 完成的一个操作,输入输出参数包括用于向 VxD 传入数据或接收 VxD 中传出数据的缓冲区的大小或地址。是否要用到这些参数取决于指定的 VxD 如何处理控制代码。

当用户结束某个 VxD 之后,可用 CloseHandle 函数将与其相关的设备句柄关闭。关闭某个句柄:CloseHandle(hDevice)。将 VxD 关闭并不需要将其从内存中删除, CloseHandle 在系统中没有与此VxD 相关的有效句柄时将会把此VxD 从内存中清除。

VxD 通过处理控制过程中 W32_DEVICEIOCONTROL 消息以支持设备 IOCTL

接口。当应用程序调用 CreateFile  函数时,系统向指定的 VxD  的控制过程发送


W32_DEVICEIOCONTROL 消息以决定此 VxD 是否能够支持设备 IOCTL 接口。当应用程序调用 DeviceIoControl 时,系统将调用由给定的设备句柄标识的 VxD 之控制过程。

3)  VxD 程序中完成定时功能

命名插卡设备为 PCI 自动生成的设备类名为 PCIDevice 应用中只须对PCIDevice OnW32DeviceIoControl OnW32DeviceIoControl 的函数原型为:

a) OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)

pDIOCParams:VxD Win32 应用程序的控制代码及输入输出参数。这些参数通过 DeviceIoControl 函数传递,在本软件中,这个参数的内容为打标点的位置信息。同时,VtoolsD 类库中提供了一个微秒级的定时器函数:

b) CONFIGRET CONFIGMG_Yield(DWORD nMicroseconds, DWORD flags); nMicroseconds:所需要定时的微秒数,这个值不能超过 60000000(60 秒) flags:定时过程的控制标志,这个参数可以是 CM_YIELD_RESUME_EXEC:允

许软中断打断定时,或者是 CM_YIELD_NO_RESUME_EXEC:禁止所有中断打断当前定时,包括所有软中断与硬中断。使用 CONFIGMG_Yield 函数并且将 flags 设置 CM_YIELD_NO_RESUME_EXEC 可以完全占有 CPU,实现高精度的定时过程。

数据输出例程完全占有CPU 会引发一些问题,操作系统无法响应其他任何中断, 系统时钟停止,用户界面也如同死机一般,用户无法通过鼠标或者键盘中断打标作业,因为 Windows 的消息系统已经停止工作了。

显然,用户无法中断打标作业是无法让人接受的,这个功能是必须的。考虑到跳转延时过长不会影响打标效果,因此提出一个折中的方案:在激光开启的时候, 提升优先级,确保打标质量,而在激光关闭跳转的时候,恢复优先级,那么在跳转的这段时间中,可以响应用户的鼠标/键盘消息。

5.4.3 打标控制系统的优缺点

 

基于 VxD 的精确定时的优点是实时性好,通过提升中断优先级,数据输出例程完全占有 CPU,保证了实时性。但是这个方案牺牲了计算机的执行效率,因为在定


时的过程中,计算机不能够做任何其它工作,包括所有的软中断与硬中断,也无法影响标准输入设备,用户界面的响应速度缓慢,显得非常不友好。

此外,打标控制系统只能以串行模式工作,即先转换好所有数据,然后再输出, 用户必须等待一段时间才能开始打标,事实上,这两个过程是可以并行工作的,但是在工业应用中,一般是大量相同的数据重复的打标,在这种情况下,串行工作模式的效率并不比并行的低。

在项目的第二阶段,使用带嵌入式处理器的控制卡[41],则上面提到的打标控制系统的缺点都可以被克服,此时,打标控制系统就能够采用流水线结构,计算机的任务变为单纯地转换数据,而数据输出任务由 DSP[42]来完成,DSP 以硬件电路实现精确定时,两个模块并行工作,因此也保证了计算机的执行效率。毕竟,让一个非实时操作系统(windows 98)来完成实时控制确实有点勉为其难,而让 DSP 来完成实时控制任务就很容易,而且可以真正做到实时。

 

本章提出了在 windows98 环境下进行精确定时的解决方案。首先,本章对的操作系统的实时性能进行了分析,得出的结论是基于消息传递机制的 windows98 系统不具备良好的实时性。接下来,详细阐述了精确定时的实现方法,包括常规定时、多媒体定时、外界时钟定时等,但精确度都有一定限制。

最后,本文给出了微秒级精确定时实现方案:保护模式下的精确定时与基于 VxD 的精确定时,保护模式下通过不断提高优先级而达到的定时效果比基于 VxD 的效果要差,因此,软件采用基于 VxD 的精确定时方法。同时,通过打标控制系统优缺点的分析,提出了利用带 DSP 的控制卡是很好的改进方案。



关键词:{$Keyword}
首 页    |   产品中心   |   行业解决方案   |   新闻中心   |   关于我们  |  联系我们   |   城市关键词   |   行业关键词