请选择 进入手机版 | 继续访问电脑版
点击联系客服
客服QQ: 客服微信:
查看: 105|回复: 50

国庆节假期学习新技术 拒绝只玩crud boy 从操作系统开始

[复制链接]

1

主题

1

帖子

-7

积分

限制会员

积分
-7
发表于 2021-10-1 07:28:32 | 显示全部楼层 |阅读模式



老板说我的技术要进步,不能只做crud  boy。所以我选择了挑选,学习操作系统。因为操作系统一直被认为是计算机软件的基石。

这个系列是我学习操作系统的笔记,操作系统以AliOS  Things为例。其他操作系统也相似。

本文是从操作系统的中断管理的,后面会有更多的操作系统内容介绍。

主要介绍与AliOS  Things中断相关的概念。中断处理与CPU体系结构密切相关,因此本文以HaaS100开发版/HaaS  EDU  K1中使用的ARM  Cortex-M3的CPU体系结构为基础,介绍了AliOS  Things的中断管理机制。阅读本文档后,我们将详细了解AliOS  Things的中断处理过程、如何添加中断服务程序(ISR)以及相关注意事项。

1、AliOS  Things  中断管理

1.1、硬件中断行为介绍

嵌入式系统中,中央处理器CPU正在处理某些东西时,外部发生某些事件,请求CPU迅速处理,CPU暂时中断当前工作,处理发生的事件,处理结束后返回原来中断的地方,继续原来工作的过程被称为中断。

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





中断处理图

在嵌入式系统中,中断称为异步异常。中断或异常是中断处理器正常运行并强制处理器进入其他指令流的事件,如中断处理图表所示。异常通常可以分为两类:同步异常和异步异常。内部事件(如执行处理器命令引起的事件)引起的异常称为同步异常。例如,如果命令读写访问无效的地址,代码中出现除0以外的错误(同步),则会抛出异常。异步异常与当前命令流的执行无关。异步异常事件在外部发生,如按下一个键。此异步事件通常也称为异步异常。

中断是处理器脱离正常操作过程,切换到运行特殊代码的异步事件的异步异常。嵌入式系统中中断处理与系统的实时性能密切相关。正确的中断处理是防止系统故障,提高系统稳定性和实时性能的重要手段。

1.2、中断工作机制

1.2.1、中断向量表

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

中断向量:所有中断处理程序(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实现:





Cortex-M内核和NVIC关系示意图


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

1)可嵌套中断支持

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


2) 动态优先级调整支持

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


3) 中断可屏蔽

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


1.3、中断处理过程
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()的具体实现。


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





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


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



全局开关中断


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

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

RHINO_CRITICAL_ENTER()
RHINO_CRITICAL_EXIT()

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


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


1.6、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();
}

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

使用道具 举报

1

主题

371

帖子

-167

积分

限制会员

积分
-167
发表于 2021-10-1 07:35:09 | 显示全部楼层
找到好贴不容易,我顶你了,谢了
回复

使用道具 举报

1

主题

370

帖子

-118

积分

限制会员

积分
-118
发表于 2021-10-1 08:05:32 | 显示全部楼层
不错不错,楼主您辛苦了。。。
回复

使用道具 举报

0

主题

359

帖子

-126

积分

限制会员

积分
-126
发表于 2021-10-1 08:26:56 | 显示全部楼层
写的真的很不错
回复

使用道具 举报

1

主题

372

帖子

-135

积分

限制会员

积分
-135
发表于 2021-10-1 08:48:28 | 显示全部楼层
学习了,谢谢分享、、、
回复

使用道具 举报

1

主题

384

帖子

-183

积分

限制会员

积分
-183
发表于 2021-10-1 09:14:29 | 显示全部楼层
小手一抖,积分到手!
回复

使用道具 举报

1

主题

387

帖子

-126

积分

限制会员

积分
-126
发表于 2021-10-1 09:42:10 | 显示全部楼层
难得一见的好帖
回复

使用道具 举报

1

主题

354

帖子

-147

积分

限制会员

积分
-147
发表于 2021-10-1 10:02:13 | 显示全部楼层
好帖,来顶下
回复

使用道具 举报

0

主题

350

帖子

-153

积分

限制会员

积分
-153
发表于 2021-10-1 10:29:34 | 显示全部楼层
我是个凑数的。。。
回复

使用道具 举报

0

主题

369

帖子

-123

积分

限制会员

积分
-123
发表于 2021-10-1 10:50:17 | 显示全部楼层
难得一见的好帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|无图版|手机版|小黑屋|汕头@IT精英团

Powered by Discuz! X3.4 © 2021 Comsenz Inc.

GMT+8, 2021-10-25 03:58 , Processed in 0.312000 second(s), 19 queries .

快速回复 返回顶部 返回列表