美文网首页
内核大佬来告诉你,什么叫中断管理(rtthread)

内核大佬来告诉你,什么叫中断管理(rtthread)

作者: 极致Linux内核 | 来源:发表于2022-04-18 14:52 被阅读0次

一.中断管理

当 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);return0;}

/* 导出到 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】获取,进群免费获取相关资料,免费观看公开课技术分享,入群不亏,快来加入我们吧~

资料免费领

学习直通车

相关文章

  • 1.Linux内核简介

    Linux内核简介 内核是操作系统的核心 ,其主要功能有: 响应中断,执行中断服务程序 管理多个进程,调度和分享处...

  • 第1章 Linux内核简介

    通常,内核由负责响应中断的中断服务程序、负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管...

  • stm32f4系列外部中断的配置

    一,外部中断简介 1.1 CM4 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,...

  • 品味内核中断上下半部

    在《初尝内核中断》里我们了解了Linux内核中断模块的实现,也体验了一番共享中断的魅力,但上面这样的中断程序把任务...

  • 9.18总结

    1.CM4内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 2...

  • Linux用户态如何切换到内核态?

    在Linux技术大佬口中,我们经常会时不时听到内核态、用户态等,内核主要是和硬件打交道,管理最核心的内容,如硬盘、...

  • Linux系统中用户态如何切换到内核态?

    在Linux技术大佬口中,我们经常会时不时听到内核态、用户态等,内核主要是和硬件打交道,管理最核心的内容,如硬盘、...

  • 9.18嵌入式知识点总结

    1.NVIC中断嵌套控制器 2.97个中断10个内核中断87个可屏蔽中断 3.负数优先级为内核优先级 其他的可管...

  • 深入理解Linux内核架构

    一、简介和概述二、进程管理和调试除了代表用户程序执行代码之外,内核还可以由异步硬件中断激活,然后在中断上下文中运行...

  • RTthread RTOS 使用 Env 开发

    RTthread 开发支持裸机移植, Env 工具移植, 和 RTThread Studio 直接开发。一般裸机移...

网友评论

      本文标题:内核大佬来告诉你,什么叫中断管理(rtthread)

      本文链接:https://www.haomeiwen.com/subject/erjqertx.html