十年内核开发者来告诉你,什么叫中断管理(rtthread)
一.中断管理
当 CPU 正在处理内部数据时,外界发生了紧急情况,要求 CPU 暂停当前的工作转去处理这个 异步事件。处理完毕后,再回到原来被中断的地址,继续原来的工作,这样的过程称为中断。实现这一功能的系统称为 中断系统,申请 CPU 中断的请求源称为 中断源。中断是一种异常,异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果不及时进行处理,轻则系统出错,重则会导致系统毁灭性地瘫痪。如下图是一个简单的中断示意图。
二.RT-Thread 中断工作机制
1.中断向量表
中断向量表是所有中断处理程序的入口,如下图所示是 Cortex-M 系列的中断处理过程:把一个函数(用户中断服务程序)同一个虚拟中断向量表中的中断向量联系在一起。当中断向量对应中断发生的时候,被挂接的用户中断服务程序就会被调用执行。
在 Cortex-M 内核上,所有中断都采用中断向量表的方式进行处理,即当一个中断触发时,处理器将直接判定是哪个中断源,然后直接跳转到相应的固定位置进行处理,每个中断服务程序必须排列在一起放在统一的地址上(这个地址必须要设置到 NVIC 的中断向量偏移寄存器中)。中断向量表一般由一个数组定义或在起始代码中给出,默认采用起始代码给出:
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset 处理函数
DCD NMI_Handler ; NMI 处理函数
DCD HardFault_Handler ; Hard Fault 处理函数
DCD MemManage_Handler ; MPU Fault 处理函数
DCD BusFault_Handler ; Bus Fault 处理函数
DCD UsageFault_Handler ; Usage Fault 处理函数
DCD 0 ; 保留
DCD 0 ; 保留
DCD 0 ; 保留
DCD 0 ; 保留
DCD SVC_Handler ; SVCall 处理函数
DCD DebugMon_Handler ; Debug Monitor 处理函数
DCD 0 ; 保留
DCD PendSV_Handler ; PendSV 处理函数
DCD SysTick_Handler ; SysTick 处理函数
… …
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
2.中断处理过程
RT-Thread 中断管理中,将中断处理程序分为中断前导程序、用户中断服务程序、中断后续程序三部分,如下图:
三.RT-Thread 中断管理接口
为了把操作系统和系统底层的异常、中断硬件隔离开来,RT-Thread 把中断和异常封装为一组抽象接口,如下图所示:
4.全局中断开关使用示例
这是一个中断的应用例程:在多线程访问同一个变量时,使用开关全局中断对该变量进行保护,如下代码所示:
使用开关中断进行全局变量的访问
#include <rthw.h>
#include <rtthread.h>
#define THREAD_PRIORITY 20
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 5
/* 同时访问的全局变量 */
static rt_uint32_t cnt;
void thread_entry(void *parameter)
{undefined
rt_uint32_t no;
rt_uint32_t level;
no = (rt_uint32_t) parameter;
while (1)
{/* 关闭全局中断 */level = rt_hw_interrupt_disable();cnt += no;/* 恢复全局中断 */rt_hw_interrupt_enable(level);rt_kprintf("protect thread[%d]'s counter is %d\n", no, cnt);rt_thread_mdelay(no * 10);
}
}
/* 用户应用程序入口 */
int interrupt_sample(void)
{undefined
rt_thread_t thread;
/* 创建 t1 线程 */
thread = rt_thread_create("thread1", thread_entry, (void *)10,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);
if (thread != RT_NULL)rt_thread_startup(thread);/* 创建 t2 线程 */
thread = rt_thread_create("thread2", thread_entry, (void *)20,THREAD_STACK_SIZE,THREAD_PRIORITY, THREAD_TIMESLICE);
if (thread != RT_NULL)rt_thread_startup(thread);return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(interrupt_sample, interrupt sample);
仿真运行结果如下:
\ | /
RT - Thread Operating System
/ | \ 3.1.0 build Aug 27 2018
2006 - 2018 Copyright by rt-thread team
msh >interrupt_sample
msh >protect thread[10]'s counter is 10
protect thread[20]'s counter is 30
protect thread[10]'s counter is 40
protect thread[20]'s counter is 60
protect thread[10]'s counter is 70
protect thread[10]'s counter is 80
protect thread[20]'s counter is 100
protect thread[10]'s counter is 110
protect thread[10]'s counter is 120
protect thread[20]'s counter is 140
更多Linux内核源码高阶知识请加开发交流Q群篇【318652197】获取,进群免费获取相关资料,免费观看公开课技术分享,入群不亏,快来加入我们吧~
学习资料免费领
学习直通车
十年内核开发者来告诉你,什么叫中断管理(rtthread)相关推荐
- 如何成为一个Linux内核开发者
你想成知道如何成为一个Linux内核开发者么?或者你的老板告诉你,"去为这个设备写一个Linux驱动."这篇文档的目的,就是通过描述你需要经历的过程和提示你如何和社区一起工作,来教 ...
- 追思心中璀璨的明星:杰出内核开发者李少华
我敬佩的兄弟李少华,最杰出的国人Linux内核开发者之一,在操蛋的2018年离开了我们. 2018年最后一天,今天在商场溜娃,忽然看到少华妻子的朋友圈提到李少华于12月28日离开了我们.我知道少华前阵 ...
- Fuchsia 确认支持安卓 APP;悼念杰出的内核开发者李少华
(给技术最前线加星标,每天看技术热点) 转自:开源中国.solidot.cnBeta.腾讯科技.快科技等 [技术资讯] 0.谷歌 Fuchsia 开源操作系统确认支持运行 Android APP 有关 ...
- meltdown linux 内核,内核开发者称应更新Linux内核应对 Meltdown 和 Spectre漏洞
著名的Linux内核开发者Greg Kroah-Hartman发表了一篇关于Linux内核中Meltdown和Spectre补丁状态的深度文章. 正如你所知道的,上周出现了两个严重的硬件缺陷,成为计算 ...
- 1024,第 15 届「中国内核开发者大会」 参会指南(议程全剧透)
各位好,第 15 届「中国内核开发者大会」即将开幕,这些参会指南请提前收藏好: 2020「中国内核开发者大会」(以下简称 CLK)将在 2020 年 10 月 24 日举办,线上线下同步进行,线上由 ...
- Linux 内核开发者完成了对所有来自 UMN.edu 补丁的审查
导读 前段时间,明尼苏达大学被禁止为 Linux 内核做贡献,因为该大学的研究人员被发现试图通过新的补丁故意向内核提交错误,而使这个过程作为一篇有问题的研究论文的一部分这种不诚实甚至恶意行为而引发轩然 ...
- 十大ios开发者喜爱的开源库
十大ios开发者喜爱的开源库 (转自博客园) 2014-08-17 14:07:58| 分类: objective-c | 标签:ios 开源库 |举报|字号 订阅 下载LOFTER我的照片书 ...
- 第十届Flash开发者大会-深圳
活动主题 2012年Flash经历了不同凡响的一年,真正专注到游戏与AIR领域.路线图发布后,每一个版本的更新都在兑现着专注的承诺.starling日渐成熟与崛起:Stage3d支持到移动设备:游戏高 ...
- 牛群:Linux内核开发者峰会照的全家福
刚才看到一张Linux内核开发者峰会照的全家福,有历史价值,给大家分享一下.上面有Torvalds(大致在中间).Andrew Morton(目前的内核主要维护者,第二排右数第二个).Alan Cox ...
最新文章
- Sublime Text 3 python 配置
- C++和C#实现剪切板数据交互
- python语言的主要网站是_python语言主要是做什么的
- html5a链接_HTML 5 a 标签
- 鸿蒙系统真实评测,鸿蒙系统和安卓的区别-华为鸿蒙系统使用体验评测
- Jackson相关的一些注解
- ZZULIOJ 1118: 数列有序
- KVO 实现两个页面之间的通信
- java实现mqtt服务端_基于Swoole使用MQTT协议连接阿里云物联网平台设备实现消息订阅
- esp8266接入小度语音,小度音箱控制,附开源app控制
- 多通道波形记录仪自动化计量校准软件NSAT-3070
- mysql 导出数据到txt文件_mysql 导出数据到txt文件
- WebLogic的安装步骤及部署
- php: RGB 转 HSB(HSV)
- SQL数据库msdb置疑(急)
- 助企开门红 浙江省科技厅厅长高鹰忠一行到访加速科技
- 飞速创新更新IPO招股书:计划募资约14亿元,向伟为实际控制人
- 监控 prometheus及其部署及server discovery,alertmanager,grafana(更新结束)
- python manage.py runserver报错
- golang 打桩,mock 数据怎么玩?
热门文章
- java如何调取别人接口_调别人的接口会,现在别人调我的接口。不知道怎么操作了...
- 服务器尚未完成维护梦幻西游,5月31日维护:可使用点卡直接兑换精力!
- Android MINI-YY进度
- 最浪漫的十大精典爱情句子.......
- 需求调研中有效沟通系列--如何提问?
- 图形图像的一些基本概念
- (2种)输入一个单词,请输出这个单词中的第一个出现的元音字母,元音字母为a,e,i,o,u
- TOM企业邮箱教您如何提升邮箱密码安全
- Jenkins+Maven+Git搭建持续集成和自动化部署的配置手记
- linux 小老鼠界面,linux 每日学习 ls详解