![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-10-31 14:39 |
共 47,815 主题排行 / 349,930 发帖 / 今日 0 篇 / 48,290 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » 一个dos下模拟线程(进程)切换的程序 |
| 可打印版本 1,292 / 13 |
| 第1楼 yaly | 发表于 2004-09-07 00:00 |
| 初级用户 发帖 21 积分 160 | |
|
一个dos下模拟线程(进程)切换的程序 #include <dos.h>
#include <stdio.h> #include <conio.h> #define INTERRUPT 0xfc unsigned task1; unsigned task2; int l=0; int h=0; int num=0; //void (interrupt far * oldhandler)(); void os_task1(void) { while(1) { printf("this 1\n" ;// getchar(); // sleep(1); asm int 0xfc } } void os_task2(void) { while(1) { printf("this 2\n" ;// getchar(); // sleep(1); asm int 0xfc } } void interrupt far handler() { // printf("this is interrupt" ;h++; printf("num=%d\n",h); if(l){ l=0; //pusha //pop // printf("%d\n"",num /* asm mov bx,offset task2 asm pop ax asm mov word ptr ,ax asm pop ax asm mov word ptr ,ax // asm popf */ asm mov bx,offset task1 asm mov ax,word ptr asm push ax asm mov ax,word ptr asm push ax //asm pushf asm iret } else { l=1; asm pop ax asm pop ax // asm popf asm mov bx,offset task2 asm mov ax,word ptr asm push ax asm mov ax,word ptr asm push ax // asm pushf asm iret } } main() { void interrupt far handler(); task1=FP_OFF(os_task1); task1=FP_SEG(os_task1); // task2=FP_OFF(os_task2); // task2=FP_SEG(os_task2); // os_task1(); // printf("task1=%04x task1=%04x\n",task1,task1); task2=FP_OFF(os_task2); task2=FP_SEG(os_task2); setvect(INTERRUPT,handler); // asm int 0xfc os_task1(); } 此程序参考了ucos源码,但现在有问题。切换线程的次数有限制,达到一定次数后程序的cs:ip不正确,在98下死机,在w2000下出现fcb unavailable请大家看看,找出问题,谢谢。 msn:[email protected] |
|
| 第2楼 Wengier | 发表于 2004-09-07 00:00 |
| 系统支持 发帖 10,521 积分 27,736 | |
|
“在98下死机,在w2000下出现fcb unavailable”这不是DOS程序吗?在纯DOS下呢?
|
|
| 第3楼 yaly | 发表于 2004-09-08 00:00 |
| 初级用户 发帖 21 积分 160 | |
|
是死机,这一点没错。原因今天早上找到了。明天贴出代码。msn:[email protected]
|
|
| 第4楼 yaly | 发表于 2004-09-09 00:00 |
| 初级用户 发帖 21 积分 160 | |
|
#include <dos.h>
#include <stdio.h> #include <conio.h> #define INTERRUPT 0xfc unsigned task1; unsigned task2; unsigned sp_task; int l=0; long int h=0; int num=0; void os_task1(void) { while(1) { printf("this 1\n" ;// getchar(); sleep(1); asm int 0xfc } } void os_task2(void) { while(1) { printf("this 2\n" ;// getchar(); sleep(1); asm int 0xfc } } void interrupt far handler() { h++; printf("num=%ld\n",h); if(l){ l=0; asm pushf asm mov bx,offset sp_task asm mov sp,bx asm mov bx,offset task1 asm mov ax,word ptr asm push ax asm mov ax,word ptr asm push ax asm iret } else { l=1; asm popf asm mov bx,offset task2 asm mov ax,word ptr asm push ax asm mov ax,word ptr asm push ax asm iret} } main() { void interrupt far handler();task1=FP_OFF(os_task1); task1=FP_SEG(os_task1);task2=FP_OFF(os_task2); task2=FP_SEG(os_task2); asm mov ax,offset sp_task asm mov sp,ax setvect(INTERRUPT,handler);os_task1(); } |
|
| 第5楼 cdl | 发表于 2004-09-20 00:00 |
| 中级用户 发帖 107 积分 340 | |
|
栈还是没有保护好,程序能正常跑是因为任务里没有任何变量,如果在任务里有定义临时变量,就有问题了。
|
|
| 第6楼 yaly | 发表于 2004-09-21 00:00 |
| 初级用户 发帖 21 积分 160 | |
|
是的,上学的时候没有好好学习汇编,现在感觉基础不好,尤其是对栈的理解上有问题,致使现在的程序有问题。这段时间我也在努力学习以前的知识。在有几天我会重新发表一个线程切换的例子。msn: [email protected]
|
|
| 第7楼 yaly | 发表于 2004-10-12 00:00 |
| 初级用户 发帖 21 积分 160 | |
|
现在把程序修改了,可还是不能正常工作,希望各位帮我看看。msn:[email protected] EXTRN _task1:word
extrn _l:byte extrn _task_ss:word extrn _change:far PUBLIC _OSTickISR PUBLIC _OSStartHighRdy PUBLIC _OSStartSample PUBLIC _sample public _OSSw .MODEL SMALL .CODE .186 ;================================================================; _OSSw proc far PUSHA ;Save current task's context PUSH ES POP ES POPA iret _OSSw endp ;=============================================================; _OSTickISR PROC far pusha push es mov ax,seg (_task1) mov ds,ax call _change mov bx,offset (_task1) mov ss, pop es popa iret _OSTickISR ENDP ;================================================================; _OSStartHighRdy proc NEAR MOV AX, SEG(_task1) MOV DS, AX mov bx, offset _task1 mov sp, mov ax, ds mov ss, ax popa pop es iret _OSStartHighRdy ENDP ;================================================================; _sample proc far add sp,10 mov ax, seg (_task1) mov ds, ax mov bx, offset _task1 mov sp, mov ss, ax pop es popa ; call _OSStartSample iret endp _OSStartSample proc near mov ax, seg (_task1) mov ds, ax mov bx, offset _task1 ret endpWRITE_CHAR PROC MOV AH,2h INT 21h RET WRITE_CHAR ENDP end#include <dos.h> #include <stdio.h> #include <conio.h> unsigned int task_ss; unsigned int task1; int m=0; int n=0; int l=0;void far OSSw(); void far sample(); void far OSTickISR(); void far OSStartHighRdy(); void far OSStartSample(); void far change() { // sample(); if(!l) { l=1; task1=(unsigned int )FP_OFF(&task_ss); } else { l=0; task1=(unsigned int )FP_OFF(&task_ss); } sample(); } void far os_task1() { // int m=0; // m++; while(1) { printf("this is a task1 \n" ;// getchar(); // OSStartSample(); } } void far os_task2() { // int n=0; // n++; while(1) { printf("this is a task2 \n" ;// OSStartSample(); } } void main(void) { // memset(task_ss,0x0000,sizeof(unsigned int)*1024); task_ss=(unsigned int)FP_OFF(&os_task1); task_ss=(unsigned int)FP_SEG(&os_task1); task_ss=0x0200; task1=(unsigned int )FP_OFF(&task_ss); task_ss=(unsigned int)FP_OFF(&os_task2); task_ss=(unsigned int)FP_SEG(&os_task2); task_ss=0x0200; task1=(unsigned int)FP_OFF(&task_ss); setvect(0xf0,(void interrupt (*)(void))OSSw); setvect(0x1c,(void interrupt (*)(void))OSTickISR); OSStartHighRdy(); while(1) { printf("this is a test\n" ;}} |
|
| 第8楼 cdl | 发表于 2004-10-12 00:00 |
| 中级用户 发帖 107 积分 340 | |
|
这位老兄能把现象描述一下吗?还有你的程序最好写注释。
|
|
| 第9楼 yaly | 发表于 2004-10-13 00:00 |
| 初级用户 发帖 21 积分 160 | |
|
c语言部分:1。设置dos下的1c的中断2。将os_task1的seg和off装入变量task_ss中,将os_task2的seg和off装入task_ss中3。OSStartHighRdy();启动os_task1
|
|
| 第10楼 cdl | 发表于 2004-10-13 00:00 |
| 中级用户 发帖 107 积分 340 | |
|
OSStartHighRdy()能启动os_task1吗?iret弹出的cs和ip是os_task1的入口吗?task1=(unsigned int )FP_OFF(&task_ss);中task_ss里是啥?
|
|
| 第11楼 yaly | 发表于 2004-10-13 00:00 |
| 初级用户 发帖 21 积分 160 | |
|
OSStartHighRdy()能启动os_task1吗?iret弹出的cs和ip是os_task1的入口吗?是的。task1=(unsigned int )FP_OFF(&task_ss);中task_ss里是啥?task_ss里是任意值,用作popa的出栈的值。
|
|
| 第12楼 yaly | 发表于 2004-10-13 00:00 |
| 初级用户 发帖 21 积分 160 | |
|
cdl:可以msn吗?msn:[email protected]
|
|
| 第13楼 cdl | 发表于 2004-10-13 00:00 |
| 中级用户 发帖 107 积分 340 | |
|
能把不能正常工作的现象描述一下吗
|
|
| 第14楼 yaly | 发表于 2004-10-14 00:00 |
| 初级用户 发帖 21 积分 160 | |
|
现象:1。可以通过OSStartHighRdy()运行相应的os_task1,os_task2.2。我想通过dos下0x1c的中断进行os_task1,os_task2的任务的切换,可以从os_task1切换到os_task2,但0x1c的中断就不再产生,而且键盘上的break键也不起作用了。一般情况下break键按下,程序户停止运行,但中断会不会停止。0x1c中断没有了,就不能再进行任务的切换了。以上为现象。欢迎讨论。msn:[email protected]
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |