找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 619|回复: 9
收起左侧

keil C 是如何保护中断现场的?

[复制链接]
ID:21455 发表于 2024-8-5 14:27 | 显示全部楼层 |阅读模式
50黑币
突然想到个问题,keil C 是如何保护中断现场的?哪位大佬能指点下,或者给个资料或链接。谢谢

最佳答案

查看完整内容

Keil C 是一个流行的微控制器开发软件,用于编写和调试使用汇编或 C 语言编写的代码。在处理中断时,Keil C 通过使用特定的硬件中断机制和编程技巧来保护中断现场。 中断处理通常涉及如下关键步骤: 1. **保护寄存器状态**:在中断进入时,会调用中断服务程序 (ISR),在该程序中要确保不会发生任何可能导致上下文混乱的指令执行。这通常涉及保护寄存器状态,例如基地址寄存器(例如,SP、BP、IP 等),并保存当前正在执行的指令 ...
回复

使用道具 举报

ID:982617 发表于 2024-8-5 14:27 | 显示全部楼层
Keil C 是一个流行的微控制器开发软件,用于编写和调试使用汇编或 C 语言编写的代码。在处理中断时,Keil C 通过使用特定的硬件中断机制和编程技巧来保护中断现场。
中断处理通常涉及如下关键步骤:
1. **保护寄存器状态**:在中断进入时,会调用中断服务程序 (ISR),在该程序中要确保不会发生任何可能导致上下文混乱的指令执行。这通常涉及保护寄存器状态,例如基地址寄存器(例如,SP、BP、IP 等),并保存当前正在执行的指令的地址(通常保存在状态寄存器或中断服务程序的局部变量中)。
2. **设置中断屏蔽**:在某些微控制器中,可以通过设置中断屏蔽寄存器来暂时禁用其他中断,以避免在处理一个中断时被另一个中断打断。
3. **执行中断服务程序**:中断服务程序中执行特定的中断处理任务。这可能包括读取或修改输入/输出设备状态、更新状态变量、执行事件处理、调整系统状态等。
4. **恢复寄存器状态**:在中断服务程序执行完毕后,需要将中断前保存的寄存器状态恢复,以便继续执行中断发生前的代码。这通常包括恢复堆栈指针 (SP), 链接寄存器 (BP), 指令指针 (IP) 等。
5. **退出中断**:最后,通过特定的中断退出指令(如 `RETI`)来安全地退出中断状态,回到中断发生前的代码执行流程。
在 Keil C 中进行中断处理时,开发者通常使用预定义的中断服务程序入口点(例如,`void __interrupt isr_name __attribute__((interrupt))`),并在这些函数中实现上述步骤。Keil C 编译器通常会自动或通过编程者手动管理堆栈,确保中断上下文的正确保护和恢复。
此外,在使用堆栈进行中断保护时,需要确保提供的堆栈空间足够大以容纳必要的上下文信息,并且堆栈中没有其他数据覆盖中断处理的所需信息。在编写中断服务程序时,应避免使用任何可能需要全局或静态变量的数据,以减少产生错误或不一致状态的风险。
Keil C 通过提供中断机制支持和适当的编程实践,帮助开发者有效地保护中断现场,并安全地管理中断处理过程。
回复

使用道具 举报

ID:1109793 发表于 2024-8-5 15:02 | 显示全部楼层
都用C了,还管这些干嘛?
回复

使用道具 举报

ID:624769 发表于 2024-8-5 15:56 | 显示全部楼层
简单来讲,就是在中断函数中需要用到寄存器,在进入中断函数之初进行入栈操作,在离开中断函数前进行出栈操作。对于增强型51单片机,这个保护可能不彻底,这时候需要用 _PUSH_() 函数 和 _POP_() 函数来手动补缺。
回复

使用道具 举报

ID:526108 发表于 2024-8-5 16:42 | 显示全部楼层
keil c51不需要考虑中断保护
回复

使用道具 举报

ID:57657 发表于 2024-8-5 16:59 | 显示全部楼层
你要搞清楚Keil使用什么内核,多少位的编译器,不同编译器的底层结构都不一样:
1.png
回复

使用道具 举报

ID:1034262 发表于 2024-8-5 17:41 | 显示全部楼层
你看下反汇编就知道了。
回复

使用道具 举报

ID:466250 发表于 2024-8-5 18:24 | 显示全部楼层
主要是保存acc,运算标志位以及间接寻址寄存器。如果自己要做os,
看生成的汇编,一目了然
回复

使用道具 举报

ID:1126070 发表于 2024-8-6 13:47 | 显示全部楼层
在Keil C中,保护中断现场是一个关键的过程,它确保了当中断发生时,当前程序的状态(包括寄存器的值、程序计数器等)能够被妥善保存,以便中断服务程序(ISR)执行完毕后能够恢复到中断发生前的状态,从而继续执行原来的程序。
以下是Keil C保护中断现场的主要方式和步骤:
1、自动保存寄存器
2、使用堆栈
3、Keil C的编译器和库支持
4、中断服务程序的编写
回复

使用道具 举报

ID:21455 发表于 2024-8-6 18:50 | 显示全部楼层
1、感谢大家的热心帮助。谢谢!
2、其实,我是想看到KEIL C 的保护现场机制或叫思想,看它是否有特别的构思。这个要求,估计难为大家了。
3、再次鸣谢大家!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表