MQX中断系统深度解析(一)

Q

中断的处理绝对是嵌入式开发的重中之重,所以理解对中断和异常的处理显得尤为重要,今天我们来讲讲MQX的中断处理。

关于中断的基本概念,相信大家都已经清楚,在这里就不赘述了,主要是搞清楚中断源,中断向量表和中断相量号,中断优先级,可屏蔽中断,不可屏蔽中断的概念。中断处理的基本过程可以分为中断请求,中断检测,中断响应,等过程。

中断请求

某一中断源要CPU为它服务时,会向CPU发出中断请求信号,中断控制器获取中断源的中断相量号,并通过识别中断相量号将对应的硬件中断源模块的中断状态寄存器中的中断标志位置位,以使CPU知道到底是何种中断请求来了。

中断检测

CPU在每条指令结束时候都会检测中断请求或者异常,在指令周期的中断周期中,CPU将会检测系统是否存在中断请求,若有中断请求,则CPU会暂停当前执行的任务,去对中断事件进行响应,若没有中断请求,则继续执行当前的指令

中断响应

中断响应的过程是由系统自动完成,在中断响应过程中,CPU首先会查找中断源的中断模式是否允许中断,若中断模块允许中断,则响应中断请求,CPU会保存当前运行环境的内部寄存器的内容到堆栈中,通过中断相量号在中断相量表中找到中断对应的中断服务例程,也就是我们常说的ISR,执行中断处理服务程序ISR,在中断结束后,在将之前保存的内容恢复到内部寄存器,从而使中断前后程序的执行现场没有任何变化。

MQX中断处理过程

MQX的中断处理跟之前我们的无操作系统的处理过程稍微有点不同,MQX可以支持多种架构的处理器,为屏蔽不同架构在硬件上对中断管理的差异,使用了独特的中断管理子系统对中断事件的响应过程进行统一管理,中断和异常处理是MQX的可选性组件,但默认状态下是支持这一特性的。

MQX的中断服务例程分为内核ISR和用户ISR两个相对独立的部分,内核ISR与处理器相关,位于MQX安装包的源码目录下PSP文件夹,是汇编文件dispatch.s,用于实现硬件中断到用户ISR的映射,用汇编语言实现,可以确保MQX对中断事件的快速响应。用户ISR一般由C语言编写,实现具体的功能。

在IAR环境下打开此文件可以详细分析。

中断相量表文件vectors.c位于MQX的安装目录源码bsp文件夹下,每个不同的bsp文件夹都有一个vectors.c,如果是安装基于KSDK+MQX的系统,会稍有不同,如果是开kv4x的板载支持包,KSDK的中断相量表可以参考startup_MKV46F15.s文件,vectors.c几乎把所有的中断相量都设为内核ISR,除过复位相量,以及系统服务调用,和可挂起系统调用这两个异常不经过_int_kernel_isr处理外,其他的所有异常和中断都是从这个通用入口来处理的,包括NMI(不可屏蔽中断)和HardFaul(硬错误)。复位相量由硬件决定,不受MQX管理。

在MQX中要弄明白,用户ISR不是任务,而是一个速度快,能对硬件中断做出迅速响应的例程,MQX也完全支持中断嵌套,MQX支持独立的中断栈,用于保存用户的ISR上下文。简单来说中断到来时,MQX执行如下操作:

⑴进入内核ISR,执行_int_kernel_isr

⑵保存现场

⑶运行用户ISR

⑷用户ISR返回

⑸返回内核ISR

⑹返回中断前的任务。

配置MQX中断组件

由MQX用户手册可知,中断组件是一个可选组件,但在默认情况下,MQX是支持中断的,可参考mqx_cnfg.h源码。

/*

** When MQX_USE_INTERRUPTS is defined as 1,the support for interrupts is

** enabled in MQX.

** MGCT: <optiontype="bool"/>

*/

#ifndef MQX_USE_INTERRUPTS

#define MQX_USE_INTERRUPTS 1

#endif

原文发布于微信公众号 - 嵌入式程序猿(InterruptISR)

原文发表时间:2015-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

Python黑客编程3网络数据监听和过滤

课程的实验环境如下: • 操作系统:kali Linux 2.0 • 编程工具:Wing IDE • Python版本:2.7.9 • 涉及到的主要pytho...

1.4K30
来自专栏卡少编程之旅

SHELL脚本的学习和制作

32890
来自专栏从零开始学自动化测试

Selenium+python自动化21-TXT数据参数化

前言 在17篇我们讲了excel数据的参数化,有人问了txt数据的参数化该怎么办呢,下面小编为你带你txt数据参数化的讲解 一、以百度搜索为例,自动搜索五次不...

37950
来自专栏有趣的django

Django用户登录与注册系统

一、创建项目 1.1.创建项目和app django-admin startproject mysite_login python manage.py sta...

2.4K70
来自专栏公众号_薛勤的博客

深入理解跨域SSO原理与技术

​ SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登...

25710
来自专栏PHP在线

PHP输入流php://input介绍

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php:...

53050
来自专栏木头编程 - moTzxx

ThinkPHP 框架下支付宝支付

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

50030
来自专栏java学习

面试题13(一个具有生命的线程有哪些状态)

考点:考察求职者对线程的理解 出现频率:★★★ 【面试题解析】线程的状态表示线程在某时间段内进行的活动和将要进行的任务程有创建、就绪、运行、阻塞、死亡5种状态。...

34850
来自专栏PHP在线

PHP 安全性漫谈

原文出处: 彭长霖 本文所讨论的安全性环境是在Linux+Apache+Mysql+PHP。超出此范围的安全性问题不在本文范畴之内 一、apache serv...

41770
来自专栏芋道源码1024

分布式事务 TCC-Transaction 源码分析 —— 事务恢复

1. 概述 本文分享 TCC 恢复。主要涉及如下二个 package 路径下的类: org.mengyun.tcctransaction.recover Rec...

42630

扫码关注云+社区

领取腾讯云代金券