【Keil】调试中查看当前中断信息

这会进了哪个中断

今天我听说了一个问题,STM开发中,在执行一段程序的时候,不知道这会是不是发生了什么中断。如何确认到中断是否执行了,又是哪个中断执行了,在调试中应该怎么办呐?

我们经常会遇到一些需要知道系统当前中断信息的情况,所有中断的Enable状态、Pending状态(已经发生但是还没有执行到中断)、Active状态(正在执行中断)、中断优先级等信息。

调试中

通过点击Peripherals(外设)选择内核外设,点击NVIC进行一览
在这里插入图片描述

非调试环境

通过NVIC和SCB两个寄存器来查看

typedef struct
{
  __IO uint32_t ISER[1];        /* Interrupt Set Enable Register */
       uint32_t RESERVED0[31];
  __IO uint32_t ICER[1];        /* Interrupt Clear Enable Register */
       uint32_t RSERVED1[31];
  __IO uint32_t ISPR[1];        /* Interrupt Set Pending Register  */
       uint32_t RESERVED2[31];
  __IO uint32_t ICPR[1];        /* Interrupt Clear Pending Register */
       uint32_t RESERVED3[31];
       uint32_t RESERVED4[64];
  __IO uint32_t IP[8];          /* Interrupt Priority Register */
}  NVIC_Type;
 
typedef struct
{
  __I  uint32_t CPUID;          /* CPUID Base Register */
  __IO uint32_t ICSR;           /* Interrupt Control and State Register */
#if (__VTOR_PRESENT == 1)
  __IO uint32_t VTOR;           /* Vector Table Offset Register */
#else
       uint32_t RESERVED0;
#endif
  __IO uint32_t AIRCR;          /* Application Interrupt and Reset Control Register      */
  __IO uint32_t SCR;            /* System Control Register */
  __IO uint32_t CCR;            /* Configuration Control Register */
       uint32_t RESERVED1;
  __IO uint32_t SHP[2];         /* System Handlers Priority Registers. [0] is RESERVED */
  __IO uint32_t SHCSR;          /* System Handler Control and State Register */
} SCB_Type;

这两个寄存器在具体的芯片参考手册上基本没有提到,因为这是内核寄存器,应该查阅的是CortexM系列权威指南,例如Cortex M3与M4权威指南。以下是权威指南里对SCB的所有寄存器的汇总信息。实际上要以手册为准,官方的库提供的并不是很准确,例如库里描述的NVIC没有IABR寄存器,实际上是有的。

SCB

在这里插入图片描述
这部分的地址映射可以看我的另一篇文章,内存映射。
跟中断相关的是SCB->ICSR寄存器。其他寄存器以后再看内核相关的资料。KEIL仿真时查看到中Enable、Pending等信息也是根据这个寄存器来的。以下是SCB->ICSR的详细信息。
在这里插入图片描述
举例:ICSR寄存器的bit 26表示systick中断是否pending,写bit 25可以清除systick中断pending,bit 22表示是否有片内外设中断在pending等。
在这里插入图片描述
通过查看SCB->SHCSR寄存器可以知道内核的一些中断是否处于active状态,例如bit 11代表了systick中断是否active
在这里插入图片描述

### 查看Keil调试模式下的标志位 在Keil调试环境中,查看标志位对于理解程序运行状态至关重要。当处于调试模式时,可以通过多种方式来观察和分析这些标志位。 #### 使用寄存器窗口查看标志位 通过打开寄存器视图可以直观地看到处理器内部的状态字节以及各个条件码标志位的情况。通常情况下,ARM Cortex-M系列微控制器具有专门用于存储CPU状态信息的特殊功能寄存器(SFR),其中就包含了各种重要的标志位。例如,在Cortex-M内核上,应用程序状态寄存器(APSR)保存着N,Z,C,V等基本运算结果标志;而执行状态寄存器(EPSR)则记录了一些额外的信息如Thumb指令集工作模式指示等[^1]。 为了访问这些寄存器并读取其值: - 进入调试界面后找到“View”菜单项中的“Registers”,这将会弹出一个新的标签页展示所有可用寄存器及其当前数值。 - 寻找与所需检查的特定事件相对应的那个或那些寄存器名称,并留意它们所代表的意义。 #### 利用表达式求值工具动态监控变量变化 除了静态地浏览已知位置的数据外,还可以利用时数据探查特性来跟踪某些关键点处的变化情况。比如想要监测某个全局变量是否被中断服务例程(ISR)改变过,则可以在适当的地方设置断点暂停下来之后输入该变量的名字作为表达式交给软件去计算显示出来。同样适用于任何其他类型的内存地址指向的内容或是更复杂的算术逻辑组合形式的结果呈现[^2]。 另外值得注意的是,在际操作过程中如果遇到难以解释的现象或者怀疑存在未定义行为的情况下,应当考虑查阅官方文档获取更多关于具体架构特性的说明资料以便做出准确判断[^3]。 ```cpp // 假设我们有一个名为flag的布尔型全局变量用来表示某类事件的发生与否, // 可以这样写一个简单的测试函数: void check_flag(void){ int old_value = flag; // 记录初始状态 __asm volatile ("BKPT"); // 插入硬编码断点触发进入debugger控制台交互环节 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值