关闭

关闭

关闭

封号提示

内容

首页 [宝典]keil 51 使用C语言的中断向量

[宝典]keil 51 使用C语言的中断向量.doc

[宝典]keil 51 使用C语言的中断向量

我只是很难过_
2018-12-25 0人钱柜777手机版登陆 0 0 0 暂无简介 举报

简介:本文档为《[宝典]keil 51 使用C语言的中断向量doc》,可适用于市场营销领域

宝典keil使用C语言的中断向量keil使用C语言的中断向量中断源的矢量位置中断源Keil中断编号矢量地址最高优先级x外部中断x定时器溢出xB外部中断x定时器溢出xB串口x定时器溢出xBDMAxB硬件断点xJTAGxB软件断点x监视定时器xC语言在单片机上的扩展(interrupt、using关键字的用法)(::)转载标签:interruptusingc语言itC语言在单片机上的扩展(interrupt、using关键字的用法)直接访问寄存器和端口定义sfrPxsfrPxsfrADCONxDEsbitEAxF操作ADCON=xP=xFFiostatus=PEA=在使用了interrupt关键字之后会自动生成中断向量在ISR中不能与其他"后台循环代码"(thebackgroundloopcode)共享局部变量因为连接器会复用在RAM中这些变量的位置所以它们会有不同的意义这取决于当前使用的不同的函数复用变量对RAM有限的来将很重要。所以这些函数希望按照一定的顺序执行而不被中断。timerint()interruptusing{unsignedchartempunsignedchartempexecutableCstatements}"interrupt"声明表示向量生成在(*n)这里n就是interrupt参数后的那个数字这里,在H的代码区域生成LJMPtimerint这样一条指令"using"tellsthecompilertoswitchregisterbanksonentrytoaninterruptroutineThis"context"switchisthefastestwayofprovidingafreshregisterbankforaninterruptroutine'slocaldataandistobepreferredtostackingregistersforverytimecriticalroutinesNotethatinterruptsofthesameprioritycansharearegisterbank,sincethereisnoriskthattheywillinterrupteachother'using'告诉编译器在进入中断处理器去切换寄存器的bank。这个"contet"切换是为中断处理程序的局部变量提供一个新鲜的寄存器bank最快的方式。对时序要求严格的程序是首选的stack寄存器(保存寄存器到stack)方式。注意:同样优先级别的中断可以共享寄存器bank因为他们每次将中断没有危险IfaUSINGisaddedtothetimerinterruptfunctionprototype,thepushingofregistersisreplacedbyasimpleMOVtoPSWtoswitchregisterbanksUnfortunately,whiletheinterruptentryisspeededup,thedirectregisteraddressingusedonentrytosysinterpfailsThisisbecauseChasnotyetbeentoldthattheregisterbankhasbeenchangedIfnoworkingregistersareusedandnootherfunctioniscalled,theoptimizereliminiatestehcodetoswitchregisterbanks如果在timer的中断函数原型中使用USING,寄存器的pushing将被MOVtoPSW切换寄存器bank所替换。不幸的是当一个中断入口被加速时。用在入口的直接寄存器寻址将失败。这是因为C没有告诉寄存器bank已经改变。如果不工作的寄存器将被使用如果没有其他函数被调用优化器Logically,withaninterruptroutine,parameterscannotbepassedtoitorreturnedWhentheinterruptoccurs,compilerinsertedcodeisrunwhichpushestheaccumulator,B,DPTRandthePSW(programstatusword)ontothestackFinally,onexitingtheinterruptroutine,theitemspreviouslystoredonthestackarerestoredandtheclosing"}"causesaRETItobeusedratherthananormalRET逻辑上一个中断服务程序不能传递参数进去也不可返回值。当中断发生时编译器插入的代码被运行它将累加器BDPTR和PSW(程序状态字)入栈。最后在退出中断程序时预先存储在栈中被恢复。最后的"}"结束符号将插入RETI到中断程序的最后为了用Keil‘C’语言创建一个中断服务程序(ISR)利用interrupt关键词和正确的中断号声明一个staticvoid函数。Keil‘C’编译器自动生成中断向量以及中断程序的进口、出口代码。Interrupt函数属性标志着该函数为ISR。可用using属性指定ISR使用哪一个寄存器区这是可选的。有效的寄存器区范围为到。中断源的矢量位置中断源Keil中断编号矢量地址最高优先级x外部中断x定时器溢出xB外部中断x定时器溢出xB串口x定时器溢出xBDMAxB硬件断点xJTAGxB软件断点x监视定时器x函数在调用前定义与在调用后定义产生的代码是有很大差别的(特别是在优化级别大于级时)。(本人也不太清楚为什么大概因为在调用前定义则调用函数已经知道被调用函数对寄存器的使用情况则可对函数本身进行优化而在调用后进行定义则函数不知被调用函数对寄存器的使用情况它默认被调用函数对寄存器(ACC、B、DPH、DPL、PSW、R、R、R、R、R、R、,R、R)都已经改变因此不在这些寄存器中存入有效的数据)函数调用函数时除在堆栈中存入返回地址之外不在堆栈中保存其它任何寄存器(ACC、B、DPH、DPL、PSW、R、R、R、R、R、R、,R、R)的内容。(除非被调用函数使用了using特性)中断函数是一个例外它会计算自身及它所调用的函数对寄存器(ACC、B、DPH、DPL、PSW、R、R、R、R、R、R、,R、R)的改变并保存相应它认为被改变了的寄存器。使用C写程序时尽量少使用usingn(n=,,,)特性。(这个特性在本人使用的过程中存在一些问题不知算不算是一个小bug)默认keilc中的函数使用的是寄存器组当中断函数使用usingn时n=,,或许是对的但n=时程序就已经存在了bug(只有中断函数及其所调用的函数并没有改变RR的值时这个bug不会表现出来))一个结论是在中断函数中如果使用了usingn则中断不再保存RR的值。由此可以推论出一个高优先级的中断函数及一个低优先级的中断函数同时使用了usingn(n=,,,)当n相同时这个存在的bug是多么的隐蔽。(这恰是使人想象不到的)使用不同寄存器组的函数(特殊情况外)不能相互调用using"关键字告诉编译器切换registerbank如果中断程序不重要using关键字能忽略。如果一个函数被从中断程序调用而此中断强制使用using当编译一个被调用的函数时编译器必须告诉它)在函数前必须用伪指令#pragmaNOAREGS在进入函数#pragmaRESTORE或者#pragmasAREGS这样就不会使用"绝对地址定位")#pragmaREGISTERBANK(n)用这个指定告诉当前使用的bank用NOAREGS指令移除MOVR,AR中断服务例程timerint()interruptUSING{unsignedchartempunsignedchartemp}被调用的函数#pragmaSAVERembercurrentregisterbank#pragmaREGISTERBANK()TelCbaseaddressofcurrentregisterbankvoidfunc(charx){Calledfrominterruptroutinewith"using"}#pragmaRESTOREPutbacktooriginalregisterbank如果中断服务例程使用了USING被中断服务例程调用的函数一定要REGISTERBANK(n)一个被ISR调用的函数也可能被后台程序调用为了函数"reentrant"(可重入)系列MCU的基本结构包括:个IO口(组bit端口)两个位定时计数器全双工串行通信个中断源(个外部中断、个定时计数器中断、个串口输入输出中断)两级中断优先级字节内置RAM独立的K字节可寻址数据和代码区。中断发生后MCU转到个中断入口处之一然后执行相应的中断服务处理程序。中断程序的入口地址被编译器放在中断向量中中断向量位于程序代码段的最低地址处注意这里的串口输入输出中断共用一个中断向量。的中断向量表如下:中断源中断向量上电复位H外部中断H定时器溢出BH外部中断H定时器溢出BH串行口中断H定时器溢出BHinterrupt和using都是C的关键字。C中断过程通过使用interrupt关键字和中断号(到)来实现。中断号指明编译器中断程序的入口地址中断序号对应着中断使能寄存器IE中的使能位对应关系如下:IE寄存器C中的的的使能位中断号中断源IE外部中断IE定时器溢出IE外部中断IE定时器溢出IE串口中断IE定时器溢出有了这一声明编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到编译器会把它们压栈在中断程序结束时将他们出栈。C支持所有个标准中断从到和在系列(增强型)中多达个中断源。using关键字用来指定中断服务程序使用的寄存器组。用法是:using后跟一个到的数对应着组工作寄存器。一旦指定工作寄存器组默认的工作寄存器组就不会被压栈这将节省个处理周期因为入栈和出栈都需要个处理周期。这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组否则参数传递会发生错误。因此对于using在使用中需灵活取舍。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续钱柜777手机版登陆或者下载,敬请购买!

评分:

/9

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部

举报
资料

博聚网