打印

疑问:highgear 大侠说8051不是向量中断?

[复制链接]
楼主: 刘前辈
手机看帖
扫描二维码
随时随地手机跟帖
41
如果咬文嚼字的说向量中断的概念,我同意highgear的观念。
向量中断是指,专门有一个表格存放了中断服务函数入口的地址,cpu中断时从这个表格中取出中断服务的地址;
51是在中断时直接跳转到了0003这样的地址,没有一个位于内存中的表格来存放isr地址。

使用特权

评论回复
42
chencheng| | 2011-10-31 23:03 | 只看该作者
所有的中断,本质上都是查询!8051查到中断请求,因为是固定入口地址(也就是中断向量,还称为中断矢量),所以就直接转去执行相应的中断服务程序。而8086查到中断请求后,因为是信箱式约定方式(将所有中断服务程序入口地址集中在一起形成一张表,表中约定的位置存放指定的入口地址),所以要查表找到入口地址,再转去执行中断服务程序。注意,“查询”不是CPU中运算器或控制器之类的部件,而是专门的中断管理部件。

使用特权

评论回复
43
highgear| | 2011-11-1 07:32 | 只看该作者
早起的虫子有鸟吃。醒得早,没事干,查了查资料,没有发现“向量中断”的中文确切定义,只有英文:

vectored interrupts An efficient method implemented in hardware for dealing with many different devices, each of which is capable of interrupting and each different type of device requiring a unique interrupt handler. The interrupt vector is an array of interrupt handler locations. When a device successfully interrupts the processor, it supplies the processor with a reference to its entry in the interrupt vector. The processor then uses this to transfer control to the appropriate interrupt handler.

上面的意思很明确,中断向量是一组中断服务地址, 当..., 设备向 cpu 提供在中断向量中的入口地址。因此, 向量中断的判据是是否存在一组的中断服务地址。
很显然,8086存在; 而8051, 严格地说,不存在。

使用特权

评论回复
44
ayb_ice| | 2011-11-1 08:38 | 只看该作者
这些东西,原本都是外国的,各种翻译本身就有争议,关键知道本质即可

使用特权

评论回复
45
highgear| | 2011-11-1 09:23 | 只看该作者
顶ayb_ice,确实,这些定义不明确的东西不值得争论,关键是知道本质。

使用特权

评论回复
46
刘前辈|  楼主 | 2011-11-1 09:55 | 只看该作者
38楼lampfre 说的太对了!
#38 lamptre 先给向量中断 定个义,定义一致 再分对错!!! 如定义不能达成一致 还有什么对错之分!!
昨天下了那本重要的世界重点大学通用教材,仔细看看中断向量定义,发现问题就出在lampfre所说:大多数人把中断向量的定义搞混了: 看这本国家重点大学教材书上的“中断向量”定义如下:——谁有不同定义,也把书内容贴出来才好参与讨论,别以任何个人观点在这争吵,因为你不是权威,你也没能写一本500页的8051微控制器教材全世界推销……





、、

使用特权

评论回复
47
刘前辈|  楼主 | 2011-11-1 10:22 | 只看该作者
本帖最后由 刘前辈 于 2011-11-1 11:12 编辑

注释一下:以8051定时器T0中断为例:T0的中断向量为000BH ;也就是说T0的中断服务例程ISR的起始地址是code 000BH 而不是000BH处的 LJMP  XXXX  代码里的XXXX !别搞混了:对51来说,中断向量的地址(ISR起始地址)是固定在中断向量表里的。

举个简单的例子,如果你的T0中断服务例程ISR小于8字节,那么ISR只要从000BH开始直接执行就行了,根本不需要 LJMP XXXX 。——这时的ISR 起始地址在哪?不是一清二楚了么?
你可以写个简短的T0中断例程ISR ,看看C51怎么做的:

        否则按照诸位所说X86 概念, 难道8051相对一个外部中断,其中断向量地址可以动态有N多个?呵呵,固定的,唯一的,一个。—— 根据 n*8+3 唯一确定的那个。

      相对X86,也是唯一一个。根据 IP=n*4 ;   CS = n*4+2  确定的那个。
INT  8  的中断向量在 0000:0020H,而不是在 IP=n*4 ;   CS = n*4+2 的内容里。——其内容里的(可读写数据)表达的地址是软件设定的,凡是软的结果,都不在中断向量概念讨论之列。——那是有N重结论的事。

这里中断向量肯定说的是CPU硬件动作的概念,与什么动态,可移动,可配置无关。


、、



、、

使用特权

评论回复
48
刘前辈|  楼主 | 2011-11-1 10:39 | 只看该作者
如果有人一定要说“书上也是错的……”“老外算老几……”呵呵,咱对这种人也没什么办法。 还是那句话:“我听格丽丝潘的,还是听highgear 的?”highgear 是谁?哪本教材的作者?没听说过呀……





、、

使用特权

评论回复
49
hqgboy| | 2011-11-1 12:32 | 只看该作者
路过。

使用特权

评论回复
50
折建荣2599| | 2011-11-1 13:00 | 只看该作者

使用特权

评论回复
51
折建荣2599| | 2011-11-1 13:00 | 只看该作者
能行不。这个

使用特权

评论回复
52
刘前辈|  楼主 | 2011-11-2 12:28 | 只看该作者

highgear 真逗,总是不小心就自己反对自己

本帖最后由 刘前辈 于 2011-11-2 12:34 编辑

highgear 对英文的理解力怎么总是帮了我(对手)的忙,反驳了自己?

41楼 highgear
http://en.wikipedia.org/wiki/Interrupt_vector
  An interrupt vector is the memory address of an interrupt handler, or an index into an array called an interrupt vector table ……


         哈哈,要不要我把这段英文翻译一下?看看刘前辈的英语4级比jighgear 6级,谁的理解力好一点?

不过:还是支持highear “51是中断向量直接寻址(哈!自己承认51是中断向量)X86是中断向量间接寻址”的说法。——都是中断向量,和直接、间接寻址没关系,对吧。——谁说过直接寻址就不是向量中断了?那51中断向量表里放的啥?——那是CPU 以中断类型值n 作为中断向量表索引,从中断向量表里取出来的中断向量——the memory address of an interrupt handler!这个handler 地址是按照n*8+3 计算出来的,谁给你固定?我说你那X86 定时器中断8 中断向量是固定在0020H的,行吗?知不知道CPU内部硬件计算公式CS=n*4+2 (=0020H)?

看看43楼chencheng 讲的是什么:
所有的中断,本质上都是查询!


本质上都是根据计算公式结果查询的。



、、

使用特权

评论回复
53
Ryanhsiung| | 2011-11-3 08:07 | 只看该作者
BS一下自认为了不起的研究生 小刘

使用特权

评论回复
54
刘前辈|  楼主 | 2011-11-3 11:28 | 只看该作者
花一天时间看看《微型计算机原理》就概念清楚了。推翻自己关于支持highgear“直接、间接寻址”的说法。书上讲的很清楚。

无论8051,AVR,ARM,都和X86一样,是向量中断,所有中断向量入口地址构成中断向量表。(访问方式不同而已。)—— 中断向量表(数组)里的每个元素当然就是中断向量(也叫中断类型),每个中断类型都有一个固定的类型号,这个类型号用来索引中断向量表里的元素——中断向量(ISR入口地址)。

传统8051的向量中断表(也是可定义256个中断向量):
  char  vec_table[ ]={03,0x0B,0x13,0x1B,0x23,……保留以后用户使用};

例:时钟T0中断类型号 n 是1,那么从中断向量表中获取T0中断服务程序入口地址  vec_table[1]=0x0B;

当前的新型8051内核中断已扩展到至少13个了,也就是中断向量表vec_table[]已经膨胀多了。

相对X86,其中断向量表  double … vec_table[ ]=(…………};
中断被触发时,以中断类型号作为中断向量表索引,去查询/获取中断向量。

形式都一样。



、、

使用特权

评论回复
55
刘前辈|  楼主 | 2011-11-3 11:34 | 只看该作者
3.5.2 中断矢量
    处理器在处理每一个中断时,都通过一个中断矢量号来索引句柄过程(ISR)的执行

二、中断向量表
  CPU 响应中断后,一个关键问题是如何得到相应的中断服务程序(ISR)的入口地址,转向中断服务程序。
    8086/8088采用的办法是将 256 种类型的中断服务程序入口地址越立一张表,称中断服务程序人口地址表或中断向量表。

    中断向量表安排在内存的前1KB,即地址为00000H~003FFH 的区间。它可以容纳 256个中断向量(或称256个中断类型),每个中断向量占用内存4个字节,其中两个低字节用存放相应中断服务程序人口地址的IP值(偏移地址),两个高字节用于存放服务程序的CS。各服务程序的段地址CS和偏移地址IP在表中按中断类型号顺序存放。如图8—29所示。


摘自《微型计算机原理》  姚永翘

  一、中断向量表    .
  中断向量表是中断类型号与该中断类型相对应的中断服务子程序入口地址之间的连接
表,它占用存储器的低地址区。表中共有256个入口(编号为o一255)、每个入口都是一双字
(4字节)指示器。指示器的较高地址字是中断处理子程序入口的代码段基地址CS,而较低
地址字则是从代码段基地址开始的偏移值IP、这两个地址组合成一个中断服务于程序的入
口地址。由于中断向量表每个入口长度为4字节,256个中断向量使用存储器低区lK字节, 从00000H到003FFH,如图6.13所示。CPU获得中断类型号后.通过简单的乘4操作就取得中断向量表里的入口,从这个入口地址开始读取4个字节,就是中断服务子程序的入口地址。


    更多的不贴了。



、、

使用特权

评论回复
56
sjl2006| | 2011-11-3 12:21 | 只看该作者
LZ好咬文嚼字啊~~~~科技界需要你这样的人才:handshake

使用特权

评论回复
57
渤海三叠浪| | 2011-11-4 08:02 | 只看该作者
刘前辈到底多大岁数啊?
不过刘前辈经常发起讨论一些技术性的问题 让论坛带来活力。

可惜我现在瞎忙没工夫看啊

使用特权

评论回复
58
highgear| | 2011-11-4 10:19 | 只看该作者
我们的刘公公又开始展示其混乱的思维能力,一堆口水,不知所云。唯一可以看出的就是我们的刘公公对80x86的中断一点不懂,还要装出懂了的样子。

我知道我们的刘公公下面又会一堆胡言乱语的口水,所以引用某位真正聪明的大侠的忠告作为自动回复模板:



我早说过刘钱贝不懂技术, 你们这些聪明人怎么想去试图说服一个连一幅画都要请人挂,还美其名曰站在巨人肩膀上的白痴呢?
;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P ;P

使用特权

评论回复
59
刘前辈|  楼主 | 2011-11-4 10:34 | 只看该作者
本帖最后由 刘前辈 于 2011-11-4 10:37 编辑
41楼 highgear
     向量中断,又称矢量中断,向量矢量具有方向性。向量中断的意思是指这类中断具有指向性,即中断可以被设置指向不同的中断服务地址。


所长讲课真拗口,讲了半天不知道讲的啥。“指向性?方向性……”

还不如让我讲:C语言中所谓向量,就是指针啦;中断向量:就是指向ISR入口地址的指针呗;——哪来那么多废话。

所以,中断向量表,是一个指针变量类型表(上面我写的char 类型是错的),表(数组)中的每一个元素都是一个指针变量的值,该指针指向该中断类型ISR入口地址。

再往前追究:一个指针变量具有2个基本特征:1、…………
再往前追究:一个数组在数据结构分支中称为线性顺序表,因此上面中断向量表,即一个数组——指针变量类型数组。——谁不知道数组名是一个常量指针?什么方向性,指向性,你就说数组中的每一个元素都是一个中断矢量(谁不知道指针的标量值是地址&),它的位置由该中断矢量的类型号作为索引(index)。  —— 表基址+索引值的“指向”关系一清二楚了吧。

再往前追究基础概念:……

所以,所长大概只能给硕士以上学历学员讲课;——基础的东西讲不了。结果学历低的听不懂,学历高的又不愿听,没有学生源了。


、、

使用特权

评论回复
60
hotpower| | 2011-11-4 10:49 | 只看该作者
还在继续?
总之围绕的是中断的入口地址。
一般有散转表格和散转入口两种。
各有优缺点。
前者好咔嚓汇编的启动代码,利于管理。
实际称呼不是重要的,在于实际应用。

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
刘前辈 + 1 称呼不是重要的,实际机制术都一样 ...
Cortex-M0 + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则