diff --git a/docs/.vuepress/public/images/arm_exception_table.png b/docs/.vuepress/public/images/arm_exception_table.png new file mode 100644 index 0000000..7da1a82 Binary files /dev/null and b/docs/.vuepress/public/images/arm_exception_table.png differ diff --git a/docs/.vuepress/public/images/arm_int_type.png b/docs/.vuepress/public/images/arm_int_type.png new file mode 100644 index 0000000..d407dfe Binary files /dev/null and b/docs/.vuepress/public/images/arm_int_type.png differ diff --git a/docs/.vuepress/public/images/arm_nvic_controller.jpg b/docs/.vuepress/public/images/arm_nvic_controller.jpg new file mode 100644 index 0000000..396504b Binary files /dev/null and b/docs/.vuepress/public/images/arm_nvic_controller.jpg differ diff --git a/docs/.vuepress/public/images/arm_pensv_example.png b/docs/.vuepress/public/images/arm_pensv_example.png new file mode 100644 index 0000000..4f8c12b Binary files /dev/null and b/docs/.vuepress/public/images/arm_pensv_example.png differ diff --git a/docs/doc/kernel/int.md b/docs/doc/kernel/int.md index 9661dc8..31bf11a 100644 --- a/docs/doc/kernel/int.md +++ b/docs/doc/kernel/int.md @@ -9,6 +9,11 @@ * [中断处理机制](#riscv_int_process) * [中断服务程序](#riscv_int_service) * [中断处理流程](#riscv_int_process2) +* [ARM CORTEX-M架构的中断和异常](#arm_interrupt) + * [概述](#arm_interrupt_intro) + * [异常处理机制](#arm_interrupt_process_mechnism) + * [中断类型](#arm_int_type) + * [中断控制器](#arm_int_controller) * [中断函数接口](#riscv_int_api) * [使用场景](#situation) @@ -77,7 +82,7 @@ RISC-V中断控制器如下图所示: ![XiUOS RISC-V CONTROLLER](/images/int_riscv_controller.png) - + ### 中断处理机制 @@ -104,6 +109,53 @@ CPU响应中断并进行处理,通常经历以下过程:保存当前线程 + + +## ARM-cortex-M架构的中断和异常 + + + +### 概述 +cortex-M提供了一个异常响应系统,支持为数众多的系统异常和外部中断。其中编号0-15对应系统异常,大于等于16位外部中断。 + + + +### 异常处理机制 +cortex-M支持的异常如下表所示: + +![ARM CORTEX-M EXCEPTION](/images/arm_exception_table.png) + +表格中的SVCall异常属于系统服务调用,用于产生系统函数的调用请求,该异常必须得到响应,例如,操作系统不让用户程序直接操作硬件,通过一些系统服务函数发出SVC请求,触发一个SVC异常,然后通过SVC异常服务程序执行; +PendSV异常属于可悬挂系统调用,它可以像普通中断一样被悬起,典型应用是提供线程切换服务。 + +![ARM PENSV EXAMPLE](/images/arm_pensv_example.png) + +1. 任务 A 呼叫 SVC 来请求任务切换(例如,等待某些工作完成) +2. OS 接收到请求,做好上下文切换的准备,并且 pend 一个 PendSV 异常。 +3. 当 CPU 退出 SVC 后,它立即进入 PendSV,从而执行上下文切换。 +4. 当 PendSV 执行完毕后,将返回到任务 B,同时进入线程模式。 +5. 发生了一个中断,并且中断服务程序开始执行 +6. 在 ISR 执行过程中,发生 SysTick 异常,并且抢占了该 ISR。 +7. OS 执行必要的操作,然后 pend 起 PendSV 异常以作好上下文切换的准备。 +8. 当 SysTick 退出后,回到先前被抢占的 ISR 中,ISR 继续执行 +9. ISR 执行完毕并退出后,PendSV 服务例程开始执行,并且在里面执行上下文切换 +10. 当 PendSV 执行完毕后,回到任务 A,同时系统再次进入线程模式。 + + + +### 中断类型 + +![ARM INT TYPE](/images/arm_int_type.png) + +NVIC共支持1到240个外部中断输入(IRQs)。另外 ,NVIC还支持一个不可屏蔽输入中断,除了包含控制寄存器和中断控制逻辑外,还包含了MPU的控制寄存器、systick定时器以及调试控制。 + + + +### 中断控制器 +cortex-M系列包含一个NVIC(嵌套中断向量控制器)提供硬件嵌套中断服务。在中断发生时,NVIC自动取出对应的服务例程入口地址,并且直接调用,无需软件判定中断源。另外M系列包含一个基本的systick定时器,配合NVIC工作,用于系统计数。NVIC控制器如下图所示: +![NVIC CONTROLLER](/images/arm_nvic_controller.jpg) + + ## 中断函数接口