********************中止服务代码
btfssINTCON,T0IE;判别是否为 T0中止
gotoother_int
btfssINTCON,T0IF;it’sthetimeofT0int
gotoother_int
bcfINTCON,T0IF;是T0中止,铲除中止标 志
movlw0x10;微秒的高位字节加上守时时刻256×16分频=4096=0x1000的高位 (0x10)
addwfus+1
gotoend_int
other_int;可 增加其他中止服务代码
nop;otherisrcodecanbeadded
;**********************************
end_int;康复现场
=================
假设又有新 的中止正好在这段程序中心产生
btfssINTCON,T0IF
gotoother_int
bcfINTCON,T0IF
程序岂不是要犯错跑飞了
johnfrank:
谢谢你 的重视。
我讲一下自己的了解,权做答复,不当之处,还请站友们点拨。
pic中档单片机系列没有“硬 件中止优先等级”(请答应我这样说),意义是指:当内核正在处理当时的中止服务A时,在这个期间里,其他任何中止的产生,只能使其标志位xxIF置1,不 能掠夺当时中止服务对CPU的占用权(反应在PC指针不能被新的中止改动指向),有必要比及当时中止服务处理A结束,然后,依据 gotoother_int句子的转向,顺次判别。若新产生的中止处理代码在中止服务A之后(前、后指代码在ROM中地址次序,越大越后),则进行新发 生的中止处理;若刚好新产生的中止服务代码在刚被处理结束的中止服务A代码之前,则将不予理睬,(即程序指针PC不会在中止处理代码空间中又回来到 0004H的进口),比及履行到retfie后回来主程序,然后再次进入中止进口0004H…
之所以说其无“硬件中止优先 等级”是与“软件中止优先等级”对应的,经过中止服务代码对中止标志和IE的检测的先后,可建立优先级。
当然,精确地说,这是一 种次序,而非等级,呵呵。
假如了解一下51的中止体系,信任你能更好地了解PIC的中止的等级:
将会呈现你说的状况, 当优先级更高的中止来暂时,内核将暂时中止当时中止服务,保存当时中止服务的现场,履行优先级更高的中止服务,处理完结后,康复现场,履行未处理完结的中 断服务….,最终,回来主程序。
小弟讲得有点烦琐,并不形象,或许还有疏忽和错误之处,请咱们纠正,信任 johnfrank在仔细看书之后,应该能够构成自己的正确观点。
zdtdl:小弟说两句~~
简略地说,当体系呼应一个中止时,GIE位将被主动清零以制止其他的中止,在履行中止回来指令RETFIE后体系再主动置GIE位1开 放中止。只需不在中止程序中对GIE置1,就不会产生重复进入中止的现象,靠查询办法决议呼应谁。PIC也有中止嵌套,能够构成多级嵌套,乃至本身嵌套, 不过嵌套的级数肯定不能超过硬件仓库的深度。
————————-
PIC中档 单片机的中止总结正文
一、中止活动的进程
关于PIC单片机来说,一次中止的进程大致有下列阶段:
为 了使得阐明形象和直观,本文选用一些诙谐的句子来比方阐明:
中止恳求———比方成恳求买经济适用房的恳求
中止标志 ——-一份恳求书
本中止使能xxIE—–本单位领导
PEIE————-户口工作室主任
GIE————– 银行的办理信贷的科长
1.中止恳求:房子太少,儿子要成婚了,得买房了,可资源和财力有限,不能卖商品房,只好按特殊状况处 理,写一份恳求书(中止标志位IF置1);
2.本单位领导xxIE看了之后,假如给你盖了一个戳:(即该中止使能位 IE=1),那么祝贺你,这份恳求书能够提交到更高一级的部分;假如没盖(xxIE=0),那么对不住,先放我这儿吧,等咱们研讨研讨好后再说。假如你不 高兴,要拿回恳求书撕掉,呵呵,那么IF=0;你的购房恳求之梦幻灭;
3.xxIE领导将依据户口,将这些恳求书给分类,一类是 外地迁来的户口,提交给户口工作室PEIE主任查看,PEIE主任假如给你盖了个戳(PEIE=1),那么,他将会把恳求书提交给银行的GIE科长同意, 不然便是放在这儿再研讨研讨或许你要回来撕毁;一类是本地户口,可直接提交给银行的GIE科长同意,然后你将恳求书带到GIE科长的工作室。
4.GIE 科长盖了章之后(GIE=1),然后,你就能够拿着恳求书去找房地产商要房子了(此刻PC指针=0004H),由于GIE科长有许多工作要做,所以他每盖 了一次戳之后(留意是一次不是一个,由于或许有多个中止一起产生,也便是说有其他地方的人来请GIE盖戳),就在工作室门外挂了个牌子:请勿打扰。他自己 则歇息去了,直到接到RETFIE的电话或许有人打他的手机。
5.房地产商预备给房子了,不过你最好得先把各项手续给填好,叫 5w押金,别的协议阿,合同阿,都得自己搞定,这叫“维护现场”。
6.房地产商开端上班了,所以挨个查“恳求书”是谁提交的,以 便给你组织你预订的房子。这个叫“中止查询”。
7.查到是你的后,然后打电话让你过来,带你去看房子,把钥匙给你。这个交“中止 处理”。
8.钥匙交给你之后,房子你是到手了,不过这份恳求书就失效了,房地产商将该恳求书毁掉。这个叫“铲除中止标志”。
9.好 啦,现在你能够去房地产商自己去要回曾经交的押金,身份证啊等等。这个叫“康复现场”。
10.最终,房地产商办完了,让 RETFIE小姐打个电话给GIE科长(履行RETFIE指令),GIE科长才起来,把“请勿打扰”的牌子取下,让其他的带着恳求书的人进来。当然,假如 你的工作还没搞定,GIE科长的联系户打了他的手机(你在就事时-处理中止时,若有GIE被置1),他也会开门取下“请勿打扰”的牌子,让联系户进来,给 他盖好章。这下就对不住了,人家有联系,所以你的工作要立刻停下来,先等联系户办完他的工作之后,再给你办你的工作。这个叫“中止嵌套”,要留意GIE科 长有8个联系户(硬件仓库的深度为8级)哦。
二、需求留意的问题:
1.中 断现场的维护(能够参阅曾经的帖子,在xieyubing版主的点拨下,有恰当的比如);
2.初度上电复位、电源下跌复位和其他状况 下的复位,均使得大局中止位GIE和其他中止使能位xxIE=0;
3.中止标志位的状况与该中止源是否被屏蔽无关,与大局中止使能位 GIE也无关。
4.当敞开某一中止源时,该中止源便是经过中止标志趣CPU恳求中止的,不管什么原因,只需标志位IF置1(能够用软件强行置 1),均会产生中止恳求。
5.当中止标志位为1,假如该中止被屏蔽或许被制止了,只需不铲除标志位,那么该中止恳求会被埋伏下来,一 旦屏蔽免除,当即产生中止呼应。反之,假如在屏蔽/制止条件免除之前铲除了该标志位,那么则无中止恳求。
6.当CPU呼应任一中止 时,大局中止使能位GIE会主动清零;当中止回来时,它有主动置1。假如在中止处理期间,用软件将现已清零的GIE位又从头置位,这个时分若再呈现中止请 求,就能够构成了中止嵌套。即:在处理某一中止期间又呼应了其他中止恳求,就构成了中止嵌套,此刻,前一中止处理进程会被暂停而进入新的中止处理,当新中 断处理结束后,才会持续处理前一个被放置的中止。此办法能够构成多级嵌套,但不能超过硬件仓库的深度8级,防止形成仓库溢出而不能正常回来。
7.如 果一起产生多个中止恳求,则中止处理的次序取决于中止程序中的查看中止源的次序。
8.若要防止中止恳求被丢掉:则要留意下面两种情 况:假如同一中止源的中止产生距离时刻大于该中止服务的处理时刻,则或许呈现中止事情被疏忽(体现在中止服务的进程中,标志位被接连产生来两次置位),例 如:中止事情产生的时刻距离为30ms,中止服务处理加上跳转判别的时刻为50ms,则状况将会如下所示:
[中止次数 ———-1][中止次数———-2][中止次数———-3][中止次数———-4]
[处 理次数————————1][处理次数————————2][处理次数 ————————4]
假如在中止处理一开端就铲除IF,那么如上图所示,中止事情3、4在处理次数2的进程 中产生来两次,那么即便IF铲除产生在中止次数3产生之前,也将丢掉第三次中止。
别的,即便中止呈现的时刻距离大于中止服务的 时刻距离,假如铲除中止标志位的指令组织在中止服务子程序的尾部,就有或许形成丢掉该中止恳求(即两次中止标志置位的事情只对应一条铲除指令和一次中止处 理。
9.在进行查表操作时有必要制止CPU呼应中止,以防止中止回来时跳转到不期望的地址上去。
三、 一个疑问
一个疑问:一些书上说到:假如对寄存器INTCON进行“读-改-写”操作的时分,要事先将GIE 清0,再对INTCON进行操作,然后将GIE康复为1
即BCFINTCON,GIE
BSFINTCON,XX
BSFINTCON,GIE
所说到的理由是:当CPU正在履行一条对INTCON寄存器进行“读-改-写”操作的指令时,假如刚好产生了中止恳求,则中止服务程序会被履行 两次。这是由于当中止恳求产生后INTCON寄存器的GIE寄存器会被硬件主动清零(屏蔽一切中止),并且程序转入中止例程进口(0004h)。当GIE 被清零后,这时假如CPU正在履行一条对INTCON“读-改-写”的指令时,则GIE位还会被写会操作从头置1,这样就会形成CPU两次进入中止服务程 序。
该段解说不流畅难明,依据中止产生进程的时序(PICmicro中档单片机系列参阅手册的第8-2页):在第n个指令周期 里,CPU检测到IF标志位为1,则在n+1个周期内将主动使得GIE=0,该周期内既不取指也不履行指令,然后在n+2个指令周期里,0004h指针装 入PC指针,该周期也不运转其他指令,只完结0004H->(PC)的取指进程,第n+3个指令周期里,CPU履行0004h地址的指令码,并一起 取0005h的指令码。
明显,作者说到的“当GIE被清零后,这时假如CPU正在履行一条对INTCON“读-改-写”的指令时,则 GIE位还会被写会操作从头置1,这样就会形成CPU两次进入中止服务程序。”的解说存在下面的问题:GIE被硬件主动清零时的那个周期,是一个空运转周 期,CPU并不履行指令,下一个周期也是空运转周期,不过是完结将0004h地址中的代码取指操作。然后就开端了0004h地址的代码的履行操作和 0005h地址代码的取指进程。那么GIE在被硬件主动清零后要想置会1,只要两种办法:RETFIE指令使GIE主动置1;经过软件指令对GIE人为置 1。明显,假如对GIE人为置1的指令履行在对该标志位清零前,那么会呈现前文所述的中止嵌套(设该中止为A),假如没有其他中止产生且履行次序先于中止 A且对中止A的标志清零的话,那么中止A的嵌套是一个死循环。就不是履行两次的问题了—-由于同一个中止嵌套时,GIE在主动清零被软件置一永久都发 生在铲除IF之前,那么IF一向得不到铲除,而GIE又简直一向都是1。
作者所说的状况似乎是这样的:读改写INTCON指令 按如下进程分化:读INTCON的时分,GIE先是为1的,此刻产生了中止,GIE被硬件清零,开端履行中止服务程序,然后再IF标志没有铲除之前,履行 INTCON的其他位的修正和写回操作,也将中止产生前的GIE读为1的信息写回GIE,这样,CPU被逼产生了第2次中止。明显,这样是将 BSFINTCON,XX指令分化得四分五裂—原本一个指令周期能够完结的指令被跨了多个指令周期;并且一个指令周期的指令被CPU在不同地址 处分化履行读改写进程。
假如不是这样的话,那么作者的解说就自相对立:“当CPU正在履行一条对INTCON寄存器的‘读-改-写’操 作的指令时,假如刚好产生了中止恳求”与“当GIE被清零后,这是假如CPU正在履行一条对INTCON‘读-改-写’的指令时”彼此对立。
总 之,我对这儿的了解存在一些疑问,请斑竹及各位长辈点拨。