“我报名参加金石方案1期应战——瓜分10万奖池,这是我的第5篇文章,点击检查活动概况”

RT-Thread 内核部分最终一个点 中止办理,顺带着对前面所学常识做个小结。

前言

在前面的内核根底学习记载中,咱们一切的示例都没有运用中止,实践项目中止运用不可或缺,本文咱们就来看看在 RT-Thread 中是怎样呼应中止,怎样处理中止的。

(阐明一下,此刻咱们还没有学习 RT-Thread 的设备模型。)

本 RT-Thread 专栏记载的开发环境:

RT-Thread记载(一、RT-Thread 版别、RT-Thread Studio开发环境 及 合作CubeMX开发快速上手)

RT-Thread记载(二、RT-Thread内核发动流程 — 发动文件和源码剖析)

RT-Thread 内核篇系列博文链接:

RT-Thread记载(三、RT-Thread 线程操作函数及线程办理与FreeRTOS的比较)

RT-Thread记载(四、RT-Thread 时钟节拍和软件定时器

RT-Thread记载(五、RT-Thread 临界区保护)

RT-Thread记载(六、IPC机制之信号量、互斥量和事情集)

RT-Thread记载(七、IPC机制之邮箱、消息行列)

RT-Thread记载(八、了解 RT-Thread 内存办理)

一、RT-Thread 中止办理

本节首要目的在于阐明在运用 RT-Thread 操作系统的时分怎样处理中止,中止来了咱们怎样写程序。

中止咱们都不生疏,当 CPU 正在处理内部数据时,外界发生了紧急情况,要求 CPU 暂停当时的作业转去处理这个 异步事情。处理完毕后,再回到原来被中止的地址,持续原来的作业,这样的过程称为中止。

中止是一种反常!

RT-Thread 中止办理中,将中止处理程序分为中止前导程序、用户中止服务程序、中止后续程序三部分:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

RT-Thread 尽管提供了一致的中止办理接口,但实践上在不同的架构上,会有一些差异。

1.1 Cortex-M架构

在官网是用的Cortex-M 架构的内核作为阐明,而本专栏记载也是运用的 Cortex-M 架构的 STM32,要了解 RT-Thread 在 Cortex-M 内核上的中止办理,就得首要知道 Cortex-M 内核的中止办理。

1.1.1 内核的中止办理

Cortex-M 内核的中止办理在《Cortex-M3与Cortex-M4威望指南》这个文档里有具体的阐明。

在我的博文中,我现已屡次提及这个文档了,实践上咱们学习芯片一切的材料官方都有,官方的材料不只全还威望,只不过大部分人都忽略了官方手册。

所以不管是学习什么芯片,官方手册才是我主张的第一参考材料!!

阐明一下类似于这种官方文档,官网可以下载,还有一般正规点的开发板比方原子,野火,百问科技都会有配套材料里边都能找到。

在我讲 RTOS使命调度原了解析 的博文

FreeRTOS记载(三、RTOS使命调度原了解析_Systick、PendSV、SVC)

也有关于 Cortex-M架构 内核中止办理的阐明:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

只要是根据 Comtex-M 内核,那么都得以内核的中止办理为规范,RT-Thread也不破例,一切 RT-Thread 中止办理的相关内容在上面引荐博文都能找到,可以结合官方阐明检查。

1.1.2 嵌套向量中止控制器

在Cortex-M 内核中,有一个专门的中止控制器 NVIC(嵌套向量中止控制器),支撑中止嵌套功能。

当一个中止触发并且系统进行呼应时,处理器硬件会将当时运行方位的上下文寄存器自动压入中止栈中,这部分的寄存器包含 PSR、PC、LR、R12、R3-R0 寄存器(在上面引荐博文有过阐明)。

NVIC 这个咱们就很熟悉了,在 RT-Thread 操作系统上也是运用的内核的 NVIC 作为中止办理,在系统发动的时分必定会有 NVIC 的初始化,咱们看一下 NVIC在哪里初始化的,如下图:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

NVIC 设置的问题咱们这儿就不过多的阐明了,这个就算不明白网上材料也许多。

1.1.3 中止向量表

在 Cortex-M 内核上,一切中止都采用中止向量表的方法进行处理,即当一个中止触发时,处理器将直接判定是哪个中止源,然后直接跳转到相应的固定方位进行处理,每个中止服务程序必须摆放在一起放在一致的地址上(这个地址必需求设置到 NVIC 的中止向量偏移寄存器中)。

仍是在系统发动的时分,咱们讲到过发动文件里边有中止向量表,对应着芯片上一切的反常:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

假如运用过 STM32CubeMX 开发的朋友应该知道,生成的工程中会有stm32xxxx_it.cstm32xxxx_it.h 这两个文件,在这个文件中便是咱们 用户 中止处理的函数,和中止向量表是一一对应的,如下图所示:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

假如使能了中止不完结中止呼应函数,发生中止后都会进入 Default_Handler这个死循环。

在运用 RT-Thread 的时分也需求遵循这个中止向量表,尽管咱们之前的解说中,咱们自己并没有运用中止作为示例,可是有些中止仍是需求用到,并且系统现已完结了。

  • 比方咱们讲到过的滴答定时器的的中止呼应函数:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

  • 再比方咱们打印日志的串口1:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

  • 不只如此,咱们可以经过跳转的方法检查 RT-Thread 都做了哪些中止函数的处理,比方 GPIO外部中止:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

总的来说,RT-Thread 在 Cortex-M 内核上的办理仍是遵照内核本身的 NVIC,一切中止都采用中止向量表的方法进行处理,用户假如想要呼应中止,直接完结中止向量表中定义的函数即可。

1.1.4 中止测试

经过上面的学习,咱们现已知道了怎样在 RT-Thread 中运用中止处理,其实说白了和裸机一样,自己完结中止向量表中的中止呼应函数。

基本上学习 STM32CubeMX 生成的stm32xxxx_it.c中的方法一样就可以,咱们简略的来测试一下:

使能一个定时器,敞开定时器中止,每次中止发生打印系统当时 tick 的值:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

OK!一切正常!

咱们假如运用 RT-Thread Nano 版别,那么这便是咱们常用的 中止处理方法,后边咱们会学习到RT-Thread 的设备模型,咱们或许不需求自己去完结这些中止呼应函数,可是并不代表咱们不是依照内核的中止办理方法来进行,而是系统现已在底层为咱们完结了这些函数。

1.2 RISC-V 架构

(待更新……)

( 关于 RISC-V 架构博主还在学习过程中,需求等等!= =!)

1.3 中止办理API

尽管咱们在 Cortex-M 内核上有些接口并没有完结,并且咱们现已知道了 程序中止的处理方法了,可是这儿也记载一下中止办理对应的API函数,方便今后运用其他架构也需求用到。

RT-Thread 把中止和反常封装的抽象接口如下:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

其间 中止锁API 咱们在将临界区的时分,现已讲到过;

中止告诉,咱们曾经也有接触到,只是没有加以阐明,在进入中止的时分,RT-Thread就会调用,比方滴答定时器中止呼应函数,和咱们用来看 LOG 的串口1:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

这儿记载API,仍是老规矩:

/*
中止服务程序挂接  Cortex-M上没有
参数 	描绘
vector 	vector 是挂载的中止号
handler 	新挂载的中止服务程序
param 	param 会作为参数传递给中止服务程序
name 	中止的名称
回来 	
return 	挂载这个中止服务程序之前挂载的中止服务程序的句柄
*/
rt_isr_handler_t rt_hw_interrupt_install(int vector,
                                        rt_isr_handler_t  handler,
                                        void *param,
                                        char *name);
/*
屏蔽中止源  Cortex-M上没有
参数 	描绘
vector 	要屏蔽的中止号
*/
void rt_hw_interrupt_mask(int vector);
/*
翻开被屏蔽的中止源  Cortex-M上没有
参数 	描绘
vector 	要翻开屏蔽的中止号
*/
void rt_hw_interrupt_umask(int vector);
/*
中止锁
大局中止关  
回来值 	描绘
中止状况 	rt_hw_interrupt_disable 函数运行前的中止状况
*/
rt_base_t rt_hw_interrupt_disable(void);
/*
中止锁
大局中止开  与上面函数合作运用 
参数 	描绘
level 	前一次 rt_hw_interrupt_disable 回来的中止状况
*/
void rt_hw_interrupt_enable(rt_base_t level);
/*
中止告诉
进入
退出
具体运用见上文比如
*/
void rt_interrupt_enter(void);
void rt_interrupt_leave(void);
/*
获取中止深度
回来 	描绘
0 		当时系统不处于中止上下文环境中
1 		当时系统处于中止上下文环境中
大于 1 	当时中止嵌套层次
*/
rt_uint8_t rt_interrupt_get_nest(void);

二、RT-Thread 记载阶段小结

到目前为止,RT-Thread 专栏现已有了 9篇文章(算上本文),咱们来看一下目录:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

回头来看一下我在第一篇文章中对 RT-Thread Nano 版别的介绍:

RT-Thread记录(九、RT-Thread 中断处理与阶段小结)

咱们内核的线程办理,时间办理,中止办理,内存办理,和线程同步与通信的IPC机制都现已记载完了,这不便是咱们现已完结了对 RT-Thread Nano 的学习记载。

确实到这篇文章为止,咱们确实是掌握了 RT-Thread Nano 一切的常识,咱们现已可以运用 RT-Thread Nano 完结一些项目了。

尽管咱们的专栏记载还不止于此,可是我仍是重视咱们学习是为了快速的使用,所以咱们规范版后期的组件,设备等一些常识先等一小会,先更新一篇实战篇,运用 RT-Thread Nano 完结一个实践的小项目。

结语

本文的许多常识在曾经相关博文都有过阐明记载,所以本文简略过了一遍 RT-Thread 中止的处理,经过本文学习,咱们现已学会在 Cortex-M架 上运用 RT-Thread 时分的中止处理。

然后一起也阐明了一下,咱们前面的记载等于把 RT-Thread Nano 一切的常识全部学过了一遍,咱们现已可以运用 RT-Thread Nano 做一些实践的使用。

所以下面一篇博文博主会更新一篇实例,在 STM32L051 上运用 RT-Thread Nano 做一个实践的使用。

(想想还有点小激动,总算要实战用起来!~ ~)

好了,本文就到这儿,谢谢咱们!