- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C51中断中的使用 中断优先级 interrupt 和 using
?C51中断中的使用中断优先级 interrupt 和 using标签:?c编译器工作编程作业2012-08-12 13:41?4045人阅读?评论(1)?收藏?举报8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务?处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下:?中断源 中断向量?---------------------------?上电复位 0000H?外部中断0 0003H?定时器0 溢出 000BH?外部中断1 0013H?定时器1 溢出 001BH?串行口中断 0023H?定时器2 溢出 002BH?interrupt 和 using 都是 C51 的关键字。C51 中断过程通过使用 interrupt 关键字和中断号(0 到 31)来实现。中断号指明编译器中断程序的入口地址中断序号对应着 8051中断使能寄存器IE 中的使能位,对应关系如下:?IE寄存器 C51中的 8051的?的使能位 中断号 中断源?--------------------------------?IE.0 0 外部中断0?IE.1 1 定时器0 溢出?IE.2 2 外部中断1?IE.3 3 定时器1 溢出?IE.4 4 串口中断?IE.5 5 定时器2 溢出?有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051 系列(增强型)中多达 27 个中断源。?using 关键字用来指定中断服务程序使用的寄存器组。用法是:using 后跟一个0 到3 的数,对应着 4 组工作寄存器。一旦指定工作寄存器组,默认的工作寄存器组就不会被压栈,这将节省 32 个处理周期,因为入栈和出栈都需要 2 个处理周期。这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组,否则参数传递会发生错误。因此对于using,在使用中需灵活取舍。?关于using:?您在文中说明“这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组”是不是这个意思??举个例子来说:?定义一个函数?void func(unsigned char i) {?...?if(++i==0x12) {?...?}?...?}?有如下一个中断函数?void int_0(void) interrupt 0 using 1 {?....?}?在默认状态下,func使用寄存器组0(BANK0),那么当int_0调用func时是否存在当传递参数时会造成参数传递错误??谢谢!?如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题:?1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一般使用 Register bank 0)。?2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组,在 ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。?3、如果不用 using 指定,在 ISR 的入口,C51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:MOV PSW #0?这点保证了,没使用 using 指定的高优先级中断。可以中断使用不同的寄存器组的低优先级中断。?4、使用 using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的 PUSH 和 POP 操作,可以节省RAM空间,加速 MCU 执行时间。寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比较清晰的认识,其正确性要由你自己来保证。特别在程序中有直接地址访问的时候,一定要小心谨慎!至于“什么时候要用到寄存器组切换”,一种情况是:当你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上了。在 ISR 或使用实时操作系统RTOS 中,寄存器非常有用。?寄存器组使用的原则:?1、8051 的最低32 个字节分成 4 组 8 寄存器。分别为寄存器R0 到R7。寄存器组由PSW 的低两位选择。在 ISR 中,MCU 可以切换到一个不同的寄存器组。对寄
您可能关注的文档
最近下载
- 高净值客户的财富保全与传承-1.pptx
- 工业互联网技术专业职业生涯规划书发展报告大一全国大学生职业规划大赛模板范文1500字.pdf VIP
- 吡咯替尼治疗HER2阳性晚期乳腺癌的真实世界研究.pdf
- 实验室生物安全个人防护培训考核试题.pdf
- 2024年医疗卫生行业继续教育答案-阿尔茨海默病早期筛查新进展和智能监测技术题库.docx VIP
- 高中地理人教版(2019)必修一6.1.1台风气象灾害(共18张ppt).pptx
- 北师大版小学数学三年级上册第八单元 认识小数 大单元整体教学设计学历案教案附作业设计(基于新课标教学评一致性).docx
- 传染病防治卫生监督工作规范答案-2024年全国疾控系统大学习活动.docx VIP
- YC创业课全集.docx
- 音乐教案:金蛇狂舞.pdf VIP
文档评论(0)