Forth-83 多任务解析
body, table{font-family: 微软雅黑; font-size: 13.5pt}
table{border-collapse: collapse; border: solid gray; border-width: 2px 0 2px 0;}
th{border: 1px solid gray; padding: 4px; background-color: #DDD;}
td{border: 1px solid gray; padding: 4px;}
tr:nth-child(2n){background-color: #f8f8f8;}
| 变量名 | 意义 |
| TOS | 指向参数堆栈顶 |
| ENTRY | 当任务被激活时转移的入口点 |
| LINK | 指向下一个任务 |
| SP0 | 参数堆栈的起始地址 |
| RP0 | 返回堆栈的起始地址 |
| DP | 词典的顶部 |
| #OUT | 已发送的字符数 |
| #LINE | 已打印的行数 |
| OFFSET | 当前文件的块位移 |
| BASE | 当前在输入/输出转换中采用的数制 |
| HLD (- addr) | 指向在 PAD 区中刚转换完的字符 |
| FILE | 指向当前文件的 FCB |
| IN-FILE | 指向输入文件的 FCB |
| PRINTING | 打印机状态标志,其值为真时,打印机处于激活状态 |
| 词 | 堆栈 | 功能 |
| (PAUSE) | ( - ) | 停止当前任务的执行,把控制转交给下一个任务。
它把 IP 及 RP 存放到参数堆栈上,把参数堆栈指针存进用户变量 TOS 中,转移到由 LINK 所指着的代码,从而实现多任务转换。 |
| RESTART | ( - ) | 与(PAUSE)相反。取回所存放的信息,执行在上一轮暂停的任务 |
| SLEEP | ( addr - ) | addr 是任一用户区的首地址,SLEEP 使该任务永远暂停 |
| WAKE | ( addr - ) | 唤醒一个在"睡觉"的任务,使它在下一次轮到时运行 |
| STOP | ( - ) | 永远暂停当前任务 |
| PAUSE | ( - ) | 在多任务环境中 PAUSE 执行 (PAUSE) |
| : STOP ( - ) UP @ 返回当前任务的地址 SLEEP 使当前任务“睡觉” PAUSE ; 立即停止当前任务而开始执行下一个任务 |
CODE PAUSE NEXT END-CODE 在单任务运行方式下,PAUSE 立即返回什么也不做;但在多任务方式中,把(PAUSE)的代码指针域的内容填入到 PAUSE 的代码指针域中,于是一个任务执行到 PAUSE 时就暂停下来。 |
| 词 | 堆栈 | 功能 |
| #USER | (- addr) | 存放在用户区大小的变量 |
| @LINK | (- addr) | 给出下一任务的ENTRY的地址 |
| !LINK | (addr -) | 把一相对距离赋给当前任务的 LINK。使之 LINK+(LINK) 等于下一任务用户区的首地址 |
| LOCAL | (base addr - addr1) | base为下一任务用户区的首地址,addr 为本任务之某一用户变量的地址,addr1是下一任务的同一用户变量的地址。 |
| SET-TASK | (ip addr -) | 使地址为addr的任务执行由ip指着的代码 |
| : TASK: ( size - ) 建立一个新任务和做有关的初始化工作(size -) // size 表示词典空间大小 CREATE 建立新任务的首部 TOS 当前任务用户区首址 HERE 新任务的用户区从此处开始 #USER @ 取出用户区的大小 (size 当前用户区首址 新任务用户区首址 用户区大小 - ) CMOVE 把现行任务的用户变量复制给新任务,初始化新任务的用户区 (size -) @LINK 新任务的 ENTRY 的地址 (size 新任务入口地址 -) UP @ -ROT 把当前任务的用户区指针送到堆栈低暂存 (当前用户区起始地址 size 新任务入口地址 -) HERE UP ! 使 UP 指向新任务的用户区 (当前用户区起始地址 size 新任务入口地址 -) !LINK 把现行任务用户区的地址存入到新任务的 LINK 中 (当前用户区起始地址 size -) DUP HERE + 新用户区及size之和的下一地址 (当前用户区起始地址 size 新用户区和size和的下一个地址 -) DUP RP0 ! 初始化新任务的返回堆栈指针 (当前用户区起始地址 size 新用户区和size和的下一个地址 -) 100 - SP0 ! 初始化新任务的参数堆栈指针 (当前用户区起始地址 size -) SWAP UP ! 恢复 UP 指向现行任务 (size -) HERE ENTRY LOCAL !LINK 把新任务的地址存进现行任务的 LINK 中 (size -) HERE #USER @ + 新任务词典区首地址 (size 新任务词典区首地址 -) HERE DP LOCAL ! 初始化新任务词典指针 (size -) HERE SLEEP 首先使新任务处于"睡眠"状态 (size -) ALLOT ; 分配 size 个字节给新任务 (-) |
| : BACKGROUND: ( - ) 建立一个词典空间为 400 个字节的新任务,初始化该任务去执行跟着的代码 400 TASK: 建立一个以跟着的名字命令的新任务 HERE IP 指向有待编译的代码,使得新任务可以执行它 (新任务地址 当前解释指针位置 - ) @LINK 2- 新任务的地址 (新任务地址 当前解释指针位置 新任务入口地址-2 -) SET-TASK 初始化新任务,让她执行 IP 指着的代码 (新任务地址 - ) !CSP 编译程序查错初始化 ] ; 调用编译程序,编译要为新任务执行的跟着的代码 |
多任务调度:
| 词 | 堆栈 | 功能 |
| MULTI | (-) | 建立多任务调度循环 |
| SINGLE | (-) | 取消多任务调度循环 |
| : SINGLE ( - ) ['] PAUSE >BODY ['] PAUSE ! ; |
定义中的第一行返回 PAUSE 的 pfa ,它指向 NEXT 。注意:PAUSE 是 CODE 定义,CODE 词的代码指针域内的内容是其参数域地址。定义第二行恢复 PAUSE 的代码指针域为常态。这样 PAUSE 就将立即返回而不再执行(PASE) |
F83 中是用词 BACKGROUND: 定义一个新任务,它把一个任务的首部定义为一个变量,因此引用一个任务的名字就在参数堆栈上留下该任务的参数域地址,而它就是一个任务的用户区的首地址。因此,键入一任务名 SLEEP 就把 JMP NOP 的代码存入该任务的 ENTRY 中,从而使任务处于“睡眠”状态。而键入一任务名 WAKE 就把 INT 80H 的代码存入任务的 ENYTRY 中,于是在下一轮中轮到时就投入运行。在一个任务的建立过程中,同时也把它加入到多任务链中,一个任务的用户变量 LINK 本身的地址与 LINK 单元的内容之和总是指向链中的下一个任务。用这种方法把一个前台作业和多个后台作业彼此间链接起来 。
Forth-83 多任务解析的更多相关文章
- iOS开发网络篇—XML数据的解析
iOS开发网络篇—XML数据的解析 iOS开发网络篇—XML介绍 一.XML简单介绍 XML:全称是Extensible Markup Language,译作“可扩展标记语言” 跟JSON一样,也是 ...
- fdisk -l解析
fdisk -l显示信息详解 [root@www.linuxidc.com ~]# fdisk -l Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 hea ...
- RHEL7 CentOS7 检查查看精简指令
RHEL7 CentOS7 检查查看精简指令: //////////////////////////检查查看精简指令://///////////////////////////// ///////// ...
- Oracle 11g R2性能优化 tkprof
另一篇博文总结了关于SQL TRACE工具的使用方式,但是产生的trace文件格式阅读起来并不是十分友好,为了更好的分析trace文件,Oracle也自带了一个格式化工具tkprof.tkprof工具 ...
- functions 示例
示例1: ","字符串截取 CREATE OR REPLACE FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VA ...
- python多任务处理
多任务解析 什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务. 现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行 多任务.由于CPU执行代码都是顺序执行的,那么,单 ...
- C# 简易的串口监视上位机实现
实现上位机和下位机之间的通信,通常使用的是串口通信,接下来实现一个通过上位机和串口调试助手来完成串口通信测试. 首先创建一个WInfrom窗体应用工程文件,创建过程可参考https://www.cnb ...
- 设计模式课程 设计模式精讲 8-3 单例设计模式-DoubleCheck双重检查实战及原理解析
1 课程讲解 1.1 为何要使用双重检查 1.2 双重检查的缺点 1.3 指令重排序讲解 1.4 指令重排序比喻(自己理解) 1.5 如何解决指令重排序问题 2 代码演练 2.1 代码演练1(双重检查 ...
- 让DB2跑得更快——DB2内部解析与性能优化
让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!) 洪烨著 2013年10月出版 定价:7 ...
随机推荐
- linux普通帐号可以临时切换到root(添加用户到sudoers中)
一般,进入terminal之后,默认是普通账户能操作的功能,能访问的目录有限,需要临时切换到root账户 那么此时就需要配置sudoers文件,可以让普通用户通过sudo命令临时切换到root账户 首 ...
- redis哨兵集群配置
redis 集群架构图: 需要先配置redis主从,我这边是单机部署的. 采用一主一从,两个sentinel. redis host: 172.31.11.235 redis-master port: ...
- ng/cli new skip install and do not create a folder
ng new myApp --skip-install --directory ./
- linux中查找(find、locate、which、whereis、grep)命令汇总、帮助命令(man、whatis、apropos、info、help)汇总
(一)find命令详解 find:功能:文件搜索: 语法:find[搜索范围][匹配条件]: 只要匹配条件完全符合才可以被显示,使用通配符*匹配条件*则可以显示匹配条件的所有目录,问号?匹配单个字符 ...
- 单端测序(Single- ead)和双端测序(Pai ed-end和Mate-pai )的关系
Roche 454,Solexa和ABI SOLID均有单端测序和双端测序两种方式.在基因组De Novo测序过程中,Roche454的单端测序读长可以达到400p,经常用于基因组骨架的组装,而Sol ...
- 提供HTML5播放RTSP流 提供微信播放RTSP流 HTML5支持rtsp web播放rtsp,微信支持rtsp
首先H5的video不支持RTSP播放,以下是html5的video官方介绍 现在如果要在页面中使用video标签,需要考虑三种情况,支持Ogg Theora或者VP8(如果这玩意儿没出事的话)的(O ...
- canvas连线特效
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面
Ocelot 路由 请求聚合 服务发现 认证 鉴权 限流熔断 内置负载均衡器 Consul 自动服务发现 健康检查 通过Ocelot搭建API网关 服务注册 负载均衡 1. ...
- C#中添加对象到ArrayList的代码
把开发过程中比较好的一些代码段做个备份,下面代码是关于C#中添加对象到ArrayList的代码. ArrayList alcollect = new ArrayList();string str = ...
- conda命令简单使用
Anaconda是一种Python语言的免费增值开源发行版,用于进行大规模数据处理.预测分析,和科学计算,致力于简化包的管理和部署.Anaconda使用软件包管理系统Conda进行包管理. 1.查看系 ...