0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

矜辰所致 来源:矜辰所致 作者:矜辰所致 2022-06-24 10:25 次阅读
RT-Thread 内核部分最后一个点 中断管理,顺带着对前面所学知识做个小结。

目录

前言
一、RT-Thread 中断管理
1.1 Cortex-M架构
1.1.1 内核的中断管理
1.1.2 嵌套向量中断控制器
1.1.3 中断向量表
1.1.4 中断测试
1.2 RISC-V 架构
(待更新……)
1.3 中断管理API
二、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 中断管理中,将中断处理程序分为中断前导程序、用户中断服务程序、中断后续程序三部分:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_1,color_FFFFFF,t_70,g_se,x_16

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任务调度原理解析 的文章中也有对于 Cortex-M架构 内核中断管理的说明:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_15,color_FFFFFF,t_70,g_se,x_16

只要是基于 Comtex-M 内核,那么都得以内核的中断管理为标准,RT-Thread也不例外,所有 RT-Thread 中断管理的相关内容在上面推荐博文都能找到,可以结合官方说明查看。

1.1.2 嵌套向量中断控制器

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

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

NVIC 这个我们就很熟悉了,在 RT-Thread 操作系统上也是使用的内核的 NVIC 作为中断管理,在系统启动的时候肯定会有 NVIC 的初始化,我们看一下 NVIC在哪里初始化的,如下图:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

NVIC 设置的问题我们这里就不过多的说明了,这个就算不明白网上资料也很多。

1.1.3 中断向量表

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

还是在系统启动的时候,我们讲到过启动文件里面有中断向量表,对应着芯片上所有的异常:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_15,color_FFFFFF,t_70,g_se,x_16

如果使能了中断不实现中断响应函数,发生中断后都会进入 Default_Handler这个死循环。

在使用 RT-Thread 的时候也需要遵循这个中断向量表,虽然我们之前的讲解中,我们自己并没有使用中断作为示例,但是有些中断还是需要用到,而且系统已经实现了。

比如我们讲到过的滴答定时器的的中断响应函数:

pYYBAGK1IKmALlc3AAAirBgZCO8510.png

再比如我们打印日志的串口1:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_14,color_FFFFFF,t_70,g_se,x_16

不仅如此,我们可以通过跳转的方式查看 RT-Thread 都做了哪些中断函数的处理,比如 GPIO外部中断:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_13,color_FFFFFF,t_70,g_se,x_16

总的来说,RT-Thread 在 Cortex-M 内核上的管理还是遵从内核本身的 NVIC,所有中断都采用中断向量表的方式进行处理,用户如果想要响应中断,直接实现中断向量表中定义的函数即可。

1.1.4 中断测试

通过上面的学习,我们已经知道了如何在 RT-Thread 中使用中断处理,其实说白了和裸机一样,自己实现中断向量表中的中断响应函数。

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

使能一个定时器,开启定时器中断,每次中断发生打印系统当前 tick 的值

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

OK!一切正常!

我们如果使用 RT-Thread Nano 版本,那么这就是我们常用的 中断处理方式,后面我们会学习到RT-Thread 的设备模型,我们或许不需要自己去实现这些中断响应函数,但是并不代表我们不是按照内核的中断管理方式来进行,而是系统已经在底层为我们实现了这些函数。

1.2 RISC-V 架构

(待更新……)

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

1.3 中断管理API

虽然我们在 Cortex-M 内核上有些接口并没有实现,而且我们已经知道了 程序中断的处理方式了,但是这里也记录一下中断管理对应的API函数,方便以后使用其他架构也需要用到。

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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_1,color_FFFFFF,t_70,g_se,x_16

其中 中断锁API 我们在将临界区的时候,已经讲到过;

中断通知,我们以前也有接触到,只是没有加以说明,在进入中断的时候,RT-Thread就会调用,比如滴答定时器中断响应函数,和我们用来看 LOG 的串口1:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

这里记录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篇文章(算上本文),我们来看一下目录:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55-c6L6w5omA6Ie0,size_20,color_FFFFFF,t_70,g_se,x_16

我们内核的线程管理,时间管理,中断管理,内存管理,和线程同步与通信的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 做一个实际的应用。

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

好了,本文就到这里,谢谢大家!

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39843
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41020
  • RTT
    RTT
    +关注

    关注

    0

    文章

    63

    浏览量

    16880
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38865
收藏 人收藏

    评论

    相关推荐

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-16 08:35 77次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    RT-Thread x 英飞凌图像处理和识别入门培训顺利收官

    在上海全球先锋开发者大会(GDC)上,RT-Thread与全球知名半导体公司英飞凌联手举办了一场别开生面的实践工作坊。本次工作坊的主题聚焦于“图像处理和识别入门”,为参会者提供了一次难得的实战
    的头像 发表于 03-29 08:34 105次阅读
    <b class='flag-5'>RT-Thread</b> x 英飞凌图像<b class='flag-5'>处理</b>和识别入门培训顺利收官

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深嵌入式软件工程师农晓明老师为您讲
    的头像 发表于 03-27 11:36 415次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 03-27 08:34 142次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread公司的Persimmon图形界面是否必须依赖RTT操作系统?

    RT-Thread公司的Persimmon图形界面是否必须依赖RTT操作系统?
    发表于 10-28 07:38

    踩坑记录RT-Thread Studio烧录ch32v307

    RT-Thread Studio向ch32v307vct6烧录程序,有个前置条件要完成。
    的头像 发表于 10-13 15:28 2022次阅读
    踩坑<b class='flag-5'>记录</b>—<b class='flag-5'>RT-Thread</b> Studio烧录ch32v307

    基于rt-thread的socket通信设计

    最近再研究 rt-thread 的通信 ,想设计出 eps8266(多个) rt-thread(作为中控) 服务器的通信框架,使用的开发板是 潘多拉
    的头像 发表于 10-13 15:02 669次阅读
    基于<b class='flag-5'>rt-thread</b>的socket通信设计

    试用RT-Thread Studio(VSCode)

    想尝试RT-Thread studio (VSCode),先下载安装VSCode,再搜索RT-Thread
    的头像 发表于 10-12 10:58 560次阅读
    试用<b class='flag-5'>RT-Thread</b> Studio(VSCode)

    RT-Thread v5.0.2 发布

    RT-Thread 代码仓库地址: ●  https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本发布日志详情: ●  htt
    的头像 发表于 10-10 18:45 769次阅读
    <b class='flag-5'>RT-Thread</b> v5.0.2 发布

    基于 RT-Thread 的 RoboMaster 电控框架(一)

    记录与分享,希望能帮助到更多初识 RT-Thread 的小伙伴,也欢迎大家交流分享,指正不足,共同进步。 背景
    的头像 发表于 09-19 19:55 412次阅读

    新书上架|RT-Thread带你解密“芯”世界

    与睿赛德科技的共同努力下,RT-Thread 早已实现对于龙芯 1/2/3 全系列处理器的支持,同时支持 LoongArch32 和 LoongArch64。
    的头像 发表于 08-22 20:10 451次阅读
    新书上架|<b class='flag-5'>RT-Thread</b>带你解密“芯”世界

    RT-Thread标准版裁剪记录

    RT-Thread 下的 BSP 里适配了非常丰富的工具,但有的时候既想直接使用这些便捷的工具,又想缩减代码体量。
    的头像 发表于 07-31 14:28 524次阅读
    <b class='flag-5'>RT-Thread</b>标准版裁剪<b class='flag-5'>记录</b>

    RT-Thread入门学习笔记-熟悉全局中断的操作

    RT-Thread中,全局中断的操作很多,大家都知道全局中断的【disable】与【enable】
    的头像 发表于 06-07 14:58 1017次阅读
    <b class='flag-5'>RT-Thread</b>入门学习笔记-熟悉全局<b class='flag-5'>中断</b>的操作

    RT-Thread中的Github Actions

    RT-Thread中一共有五个Github Action(rt-thread/.github/workflow) 分别是: RT-Thread BSP build check(.github
    的头像 发表于 06-01 03:10 348次阅读
    <b class='flag-5'>RT-Thread</b>中的Github Actions

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 2574次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio学习