发表于:2003-09-08 08:41:00
楼主
中国人的z893要与德国人的CAN一较高低之七 98me所使用的[软猫]篇之1[白猫]
在第六贴的[软猫]篇中,
我们给大家介绍了51所使用的[软猫],
它采用中断方式,
程序又短,
功能又强,
值得猫迷爱好者好好读读!
下面该轮到介绍win所使用的软猫了,
在此之前我们有必要对win的现状加以简单回顾。
win95的推出,
是PC桌面操作系统发展史上的一个里程碑,
怎么高估它都不为过。
我是这样认为的:
翻开PC的发展史,
它之所以有这样的普及,这样的强大,
不仅是靠IBM,微软,英特尔这些超级巨人,
中间还有千千万万的计算机工作者,
默默无闻地推广和创造,
编写了数不清的应用软件,
才形成了今日的产业。
我们对这个现状必须要有一个清晰的认识,
用任何一个新系统来取代PC,
时间会证明是困难的,错误的。
我们应该把PC看成是全世界人类的共同财富,
来完善它,发展它和呵护它。
不能因为WIN里面存在着这样或者是那样的错误,
甚至是很严重的错误,
就全盘攻击它,否定它,
甚至要创造一个新的系统来将取代它,
从财力、人力、物力及时间上都是得不偿失的。
我不想为微软唱赞歌,我只是想告戒朋友,
勿伦你做什么,
都要做到一是兼容,二是开放。
所谓兼容就是要在硬件与软件上兼容PC;
所谓开放就是要让你的想法,
乐于让更多的科技开发者参入。
WIN的推出,
标志着操作系统由单任务向多任务的演变,
这是一种进步,
但是这种演变,
或许是来得太快了,
或许是微软一时疏胡,
或许是有说不出的苦衷,
在过程控制这块领域里,
WIN对实时应用软件的支持,
表现出十分有限,
才造成了今天多种总线一争天下的春秋战国时代,
谈不出是好还是坏,
时间与市场会作出回应。
多任务的核心是主轴定时器,
用来将多线程分段。
在95-98me,采用的是可屏蔽中断;
在2000-XP,采用的是非屏蔽中断,
因此在前者,
还存有兼容实时任务的可行性,
后者就困难大了。
z893就是本着前者,
开发了几个软猫,
基本上解决了PC操作系统不能直接编写控制单片机[含PLC]的软件问题。
下面先介绍98me所使用的[软猫]篇之[白猫]:
供z893_emdos指令使用,详见各贴例程。
[用Delphi语言编写
[兼容Delphi2.0、3.0、4.0、5.0、7.0]
[不兼容6.0]
var
d100a: Td100a;
d1000:array[0..254] of byte; //数据库使用 z893_em
d1100:array[0..254] of byte; //数据库保留 IR字节
d1200:array[0..254] of byte; //数据库使用 pc处理指令
d1300:array[0..254] of byte; //数据库使用 as用户指令
d1400:array[0..254] of byte; //数据库使用 读/RAM
d1500:array[0..254] of byte; //数据库使用 写/RAM
d2000:byte; //数据库使用 报警标志 01:ok FF: 错
d2001:byte; //数据库使用 读标志 00:ok FF:结束
d2002:byte; //数据库使用 写标志 00:ok FF:结束
d2003:byte; //数据库使用 设备号
d2004:dword; //数据库使用 1000 IN 读指令指针
d2005:dword; //数据库使用 1200 OUT 写指令指针
d2006:dword; //数据库使用 动态显示[高速通道1-4]
d2007:dword; //数据库使用 d=0 允许采样 1关闭
d2008:dword; //数据库使用 d=0 允许显示 1关闭
procedure a100; //emdos入口1 [可程控方式]
procedure a300; //读 [a100的子程序]
procedure a700; //写 [a100的子程序]
{$R *.DFM}
;******************** .软猫1. ********************
//子程序
procedure a100;
begin
asm
@@100:
cli //初始化
push eax
push ebx
push ecx
push edx
push ebp
push edi
mov d2000,255 //报警标志 01:ok FF: 错
lea ebp,d1300 //as用户指令
mov al,d2003
mov [ebp],al //设备码
mov al,[ebp+5] //in:长度
mov [ebp+9],al //**in:长度
mov al,[ebp+6] //out:长度
mov [ebp+10],al //**out:长度
mov al,0
mov [ebp+7],al //in:指针
mov [ebp+8],al //out:指针
mov [ebp+11],al //报警
mov [ebp+12],al //交换
mov ecx,8ffffh //看门狗2ffff=1s/500MHz
//DCD检测
@@101:
mov dx,3feh
in al,dx
and al,80h
jnz @@102 //DCD检测↓
loop @@101 //看门狗循环
jmp @@rm
@@102:
mov dx,3feh //DCD检测↑
in al,dx
and al,80h
jz @@103 //dcd ok!
loop @@102 //看门狗循环
jmp @@rm
//测检设备号
@@103:
mov dx,3fdh
in al,dx
and al,1
jnz @@104 //232口已有字符
loop @@103 //看门狗循环
jmp @@rm
@@104:
lea ebp,d1300 //as用户指令
mov dx,3f8h
in al,dx //取设备号
cmp al,[ebp]
jz @@105
loop @@101 //重新返回dcd检测
jmp @@rm
//设备号选中
@@105:
mov d2001,0 //读标志 00:启动 FF:结束
mov d2002,0 //写标志 00:启动 FF:结束
mov d2004,1 //IN 读指令指针=1
mov d2005,0 //OUT 写指令指针=0
lea ebx,d1000 //z893_em 输入指令
mov [ebx],al //设备号存
//预置参数
@@106:
lea ebx,d1200 //pc处理指令
lea ebp,d1300 //as用户指令
not al
mov [ebx],al
mov eax,[e