AliOS Things操作系统之中断管理

简介: 前言本文主要介绍AliOS Things中断相关的概念。由于中断处理与CPU架构密切相关,所以本文会基于HaaS100开发板/HaaS EDU K1所使用的ARM Cortex-M3的CPU架构,来介绍AliOS Things的中断管理机制。读完本文,大家将深入了解AliOS Things的中断处理过程、如何添加中断服务程序(ISR)以及相关的注意事项。AliOS Things 中断管理硬件中断行

前言

本文主要介绍AliOS Things中断相关的概念。由于中断处理与CPU架构密切相关,所以本文会基于HaaS100开发板/HaaS EDU K1所使用的ARM Cortex-M3的CPU架构,来介绍AliOS Things的中断管理机制。读完本文,大家将深入了解AliOS Things的中断处理过程、如何添加中断服务程序(ISR)以及相关的注意事项。

AliOS Things 中断管理

硬件中断行为介绍

在嵌入式系统中,当中央处理器CPU正在处理某件事的时候,外部发生了某一事件,请求CPU迅速处理,CPU 暂停系统当前的工作,转入处理所发生的事件,处理完后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。

下图是一个简单的中断处理示意图。

  

从中断处理示意图也可以看出,中断或者异常都是指任何打断处理器正常执行,并且迫使处理器进入另外一个指令流执行的事件。异常通常可以分成两类:同步异常和异步异常。由内部事件(像处理器指令运行产生的事件)引起的异常称为同步异常,如指令读写访问了一个非法地址、代码中出现了除0等错误,都会导致(同步)异常。异步异常与当前的指令流执行无关,异步异常事件来源于外部,比如按下一个按键,产生了一个异步事件,这个异步事件通常也被称为异步异常。

 

中断是一种异步异常,是导致处理器脱离正常运行流程,转向执行特殊代码的异步事件。在嵌入式系统中,中断处理与系统实时性紧密相关。正确的中断处理是避免系统错误、提高系统稳定性和实时性的重要手段。

中断工作机制

中断向量表

首先明确中断向量和中断向量表的概念。

中断向量:所有中断处理程序(ISR)的入口。

中断向量表:存储中断向量的存储区,中断向量与中断号对应,中断向量在中断向量表中按照中断号顺序存储。

 

以ARM Cortex-M系列处理器为例,所有中断都采用中断向量表的方式进行处理。中断的处理过程就是外界硬件发生了中断后,CPU到中断控制器读取中断向量,并且查找中断向量表,找到对应的中断服务程序 (ISR)的首地址,然后跳转到对应的ISR去做相应处理。如图所示:

Cortex-M中断控制器名为NVIC(Nested Vectored Interrupt Controller嵌套向量中断控制器)。NVIC共支持1至240个外部中断输入(通常外部中断写作IRQs)。具体的数值由芯片厂商在设计芯片时决定。此外,NVIC还支持不可屏蔽中断(NMI)输入。NMI的实际功能也是由芯片制造商决定。在某些情况下,NMI无法由外部中断源控制。

 

NVIC与CPU内核息息相关,CPU的所有中断机制都由NVIC实现。CPU与NVIC的关系如下图所示。

NVIC除了响应外部中断外,还具有以下几个功能:

  1. 可嵌套中断支持

可嵌套中断指的是当一个中断发生时,硬件会自动比较该中断的优先级是否比当前的中断优先级更高。如果发现来了更高优先级的中断,处理器就会中断当前的中断服务例程(或者是普通程序),而服务新来的中断——即发生了中断抢占。此时,操作系统将先保存当前中断服务函数的上下文环境,并且转向处理高优先级中断,当高优先级中断处理完后,才能继续执行被抢占的低优先级中断。

  1. 动态优先级调整支持

软件可以在运行时期更改中断的优先级。如果在某ISR中修改了自己所对应中断的优先级,而且这个中断又有新的实例处于悬起中(pending),也不会自己打断自己。

 

  1. 中断可屏蔽

Cortex-M中断控制器即可以屏蔽优先级低于某个阈值的中断/异常,也可以全局开关中断。

 

中断处理过程

AliOS Things将中断处理程序分为中断进入、用户中断服务处理程序、中断退出三部分,如图所示:

中断进入

中断进入

中断进入的主要工作是保存CPU中断现场,这部分与CPU架构相关,不同CPU架构的实现方式有差异。对于Cortex-M来说,该工作由硬件自动完成。当一个中断触发并且系统进行响应时,处理器硬件会将当前运行任务的上下文自动保存在中断栈中,保存的上下文寄存器和顺序如下图所示:

同时,通知内核进入中断状态,调用krhino_intrpt_enter()函数,其作用是把全局变量g_intrpt_nested_level加1,用它来记录中断嵌套的次数。硬件随即执行用户中断服务程序ISR。

中断退出

执行完用户ISR后,系统首先通知内核离开中断状态,通过调用krhino_intrpt_exit()函数,把全局变量g_intrpt_nested_level减1。然后判断是否需要发生任务切换,判断的理由是当前的任务调度队列中是否有高优先级的任务处于就绪状态,如果有高优先级任务,则会发生任务切换,CPU会选择优先级的任务开始运行。

中断中进行任务切换和恢复上下文的工作,与具体的CPU架构相关。具体可以参考代码cpu_intrpt_switch()的具体实现。

中断嵌套

在Cortex-M内核以及NVIC的芯片设计中,已经内建了对中断嵌套的全力支持,用户只需要为每个中断适当地建立优先级, 如果在执行中断服务程序的过程中,如果出现高优先级中断,当前服务程序的执行将被打断,以执行高优先级的中断服务,当高优先级中断服务执行完毕后,被打断的中断服务继续执行。如图所示:

 

Cortex-M内核会自动入栈和出栈,用户无需担心在中断发生嵌套时,会使寄存器的数据损毁,从而可以放心地执行中断处理程序ISR。

中断管理与配置

为了把操作系统和底层硬件平台相关的实现隔离,AliOS Things提供了一组中断相关的接口。如下图所示:

全局开关中断

全局关中断可以让处理器不响应中断。在关闭中断期间,通常处理器会把新产生的中断挂起,当中断打开时再进行响应。在嵌入式系统中,当前任务独占CPU访问临界区资源的最简单的一种方式即是通过全局开关中断来实现。关闭中断后,整个系统已经不在响应哪些可以触发任务重新调度的外部事件,这样就可以保证当前任务不会被其他事件打断 ,除非这个任务主动放弃了CPU的控制权。

当需要进入临界区,暂时关闭整个系统的中断,随即执行临界区代码后恢复中断,可成对调用下面的函数接口:

RHINO_CRITICAL_ENTER()
RHINO_CRITICAL_EXIT()

调用关闭中断RHINO_CRITICAL_ENTER()时,系统的中断状态会保存在一个临时变量里,调用恢复中断RHINO_CRITICAL_EXIT()时会恢复之前的中断状态,保证这两个接口使用前后,系统中断状态前后一致。即如果调用前系统的中断是关闭的,那么调用后也应该是关闭状态,不应该被打开;同理,如果调用前系统的中断是打开的,那么调用后也应该是打开状态,不应该被关闭。

 

使用全局开发中断操作临界区的方法可以应用于任何场合,可以说是最强大、最高效的同步方法。但需要注意的是,在关中断期间,系统不再响应任何中断,也就不能响应外部事件。所以全局关中断对系统的实时性是有影响的,一般用于短暂的临界区代码。

AliOS Things中断ISR举例

下面以SysTick中断为例,在系统启动代码中,需要将SysTick_Handler中断服务程序添加到中断向量表中。

SysTick_Handler 在AliOS Things的实现demo如下:

void SysTick_Handler ( void )
{
    /* 进入中断, 中断嵌套的次数加1 */
    krhino_intrpt_enter();

    /* tick中断服务程序*/
    krhino_tick_proc();

    /* 退出中断,中断嵌套的次数减1,同时会检查是否发起调度 */
    krhino_intrpt_exit();
}

总结

AliOS Things作为嵌入式RTOS,其中断原理是比较基础的,没有Linux上“上半部下半部”、“用户态中断”的概念。但是理解中断,尤其是结合芯片架构,对于理解一个嵌入式系统是非常重要的。

相关文章
|
7月前
|
缓存 Linux UED
深入理解操作系统的虚拟内存管理
【5月更文挑战第30天】 在现代计算机系统中,虚拟内存是允许用户程序逻辑地址空间与物理内存解耦的关键概念。此技术不仅增强了多任务处理能力,还提供了内存保护和简化了内存管理。尽管虚拟内存的基本概念广为人知,但本文将探讨其背后的机制,以及如何通过分页和分段优化系统性能。我们将分析虚拟内存对操作系统稳定性的影响,并讨论当前操作系统中虚拟内存管理的最佳实践。
|
7月前
|
安全 算法 网络协议
探索Linux操作系统的内核管理
【5月更文挑战第31天】本文将深入探讨Linux操作系统的内核管理机制,包括其设计原则、主要组件以及它们如何协同工作以提供高效的系统性能。通过分析Linux内核的关键特性和功能,我们将揭示这一开源操作系统如何在各种计算环境中保持其稳定性和灵活性。
|
5月前
|
算法
深入理解操作系统的虚拟内存管理
【7月更文挑战第24天】在现代操作系统中,虚拟内存管理是一项至关重要的技术,它允许系统拥有比物理内存更大的地址空间,从而提升多任务处理能力。本文将详细探讨虚拟内存的工作原理、关键技术及其对操作系统性能的影响,帮助读者构建对虚拟内存管理的深入理解。
|
5月前
|
Cloud Native Devops 数据库
云原生架构:未来软件开发的引擎深入理解操作系统的虚拟内存管理
【7月更文挑战第30天】在这篇文章中,我们将深入探讨云原生架构的概念,以及它如何改变软件开发的世界。我们将从云原生的基本概念开始,然后深入到它的关键技术和实践,最后讨论它对软件开发的未来影响。无论你是软件开发者,还是IT专业人士,这篇文章都将为你提供深入理解和掌握云原生架构的重要信息。 【7月更文挑战第30天】在数字世界的构建中,虚拟内存是操作系统不可或缺的一环。本文将探索虚拟内存的核心概念、工作机制及其对现代计算环境的重要性,同时揭示其背后的技术细节和面临的挑战。
54 3
|
5月前
|
缓存 算法
操作系统的虚拟内存管理
【7月更文挑战第29天】本文深入探讨了操作系统中至关重要的虚拟内存管理机制,包括其设计原理、实现方式以及在现代计算机系统中的作用。通过分析分页系统、分段系统、页面置换算法和内存分配策略,揭示了虚拟内存如何优化资源利用,提高系统性能,并确保进程间的安全性与隔离性。此外,文章还讨论了虚拟内存管理面临的挑战及未来的发展方向。
|
5月前
|
缓存 算法 程序员
深入理解操作系统中的虚拟内存管理
【7月更文挑战第14天】本文将深入探讨操作系统中至关重要的组成部分——虚拟内存管理。通过分析其设计原理、实现机制以及性能优化策略,旨在为读者提供一个全面而深入的视角来理解虚拟内存在现代操作系统中的作用和重要性。文章不仅会涵盖虚拟内存的基本概念和功能,还会讨论其在多任务处理、内存保护及系统性能提升方面的贡献。
|
5月前
|
算法 Linux 调度
操作系统中的虚拟内存管理:原理与实现
本文深入探讨了操作系统中虚拟内存管理的核心概念,包括分页、分段、需求分页和页面置换算法。通过分析现代操作系统如Linux和Windows的虚拟内存实现机制,文章揭示了虚拟内存在提升内存利用率、进程隔离和保护内存中的关键作用。同时,讨论了虚拟内存管理面临的挑战,如内存泄漏、碎片化以及性能开销,并提出了相应的优化策略。
|
6月前
|
算法
深入理解操作系统中的虚拟内存管理
【6月更文挑战第19天】在现代操作系统中,虚拟内存管理是一个至关重要的组件。它不仅使得程序能够在有限的物理内存中运行更大的地址空间,还为系统提供了多任务处理能力。本文将深入探讨虚拟内存的概念、实现机制以及它在操作系统中的重要性,同时也会讨论虚拟内存管理中遇到的挑战和解决方案。
86 4
|
6月前
|
Python
Python中使用os库管理环境变量
在Python中,可以使用os库来管理操作系统的环境变量。通过os.environ对象,我们可以获取、修改和删除环境变量的值。
134 3
|
5月前
|
Windows 内存技术
nvm 管理和切换 node版本(windows操作系统)
nvm 管理和切换 node版本(windows操作系统)
92 0