CMSIS RTX开发之中断优先级(Interrupt priority)

在使用CMSIS RTX这个RTOS时,遇到了如何设计异常的问题。(异常包含中断,为了让搜索引擎更好搜索,本文不区分异常和中断,但是其实异常是中断更为通用的叫法。)

问题有2个:

第一个,如何设置异常优先级。

第二个,进程的优先级和异常优先级要如何匹配。

我们先看第一个问题,如何设置异常优先级。

在使用CMSIS RTX RTOS时,由于RTOS本身会利用Systick,SVC,PendSV这3个异常来完成进程调度之类的任务。而用户在编程开发时,还会用到一些其他中断,GPIO,UART之类。

那么用户要怎么样设置异常的优先级,使得RTOS和用户使用的异常优先级,这两者之间是匹配的。

首先在使用CMSIS RTX RTOS时,由于RTOS的初始化分割成了2个函数,

osKernelInitialize();

osKernelStart();

用户应该调用osKernelStart()函数之前,设置好priority group,什么是priority group?读者请自行查阅Cortex-M3权威指南的第7.2节。

之所以这样,是因为osKernelStart()函数会调用rt_svc_init()函数,初始化Systick,SVC,PendSV这三个异常的优先级。其中SVC的优先级依赖于priority group的值。

rt_svc_init()函数的源码如下:

 1 __inline static void rt_svc_init (void) {
 2 #if !defined(__TARGET_ARCH_6S_M)
 3 U32 sh,prigroup;
 4 #endif
 5 NVIC_SYS_PRI3 |= 0x00FF0000U;
 6 #if defined(__TARGET_ARCH_6S_M)
 7 NVIC_SYS_PRI2 |= (NVIC_SYS_PRI3<<(8+1)) & 0xFC000000U;
 8 #else
 9 sh = 8U - __clz(~((NVIC_SYS_PRI3 << 8) & 0xFF000000U));
10 prigroup = ((NVIC_AIR_CTRL >> 8) & 0x07U);
11 if (prigroup >= sh) {
12 sh = prigroup + 1U;
13 }
14 NVIC_SYS_PRI2 = ((0xFEFFFFFFU << sh) & 0xFF000000U) | (NVIC_SYS_PRI2 & 0x00FFFFFFU);
15 #endif
16 }

如果priority group = 0,那么:

Systick优先级 = 0x0;

PendSV优先级 = 0xFF;

SVC优先级 = 0xFD.

如果priority group = 1,那么:

Systick优先级 = 0x0;

PendSV优先级 = 0xFF;

SVC优先级 = 0xFB.

ARM公司规定了异常优先级供用户设置,寄存器有效位为8bit,其中

参考文献:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/CIAGECDD.html

http://www.keil.com/support/man/docs/rlarm/rlarm_ar_hints_cortex.htm

http://www.cnblogs.com/gcczhongduan/p/4739096.html

http://www.keil.com/support/man/docs/rlarm/rlarm_ar_svc_func.htm

时间: 07-23

CMSIS RTX开发之中断优先级(Interrupt priority)的相关文章

distributor之Interrupt Priority Registers, GICD_IPRIORITYRn

这组寄存器主要是用来设置中断的优先级,每个寄存器可以设置4个中断的优先级,每个中断对应8个bit位,由此可知每个中断的优先级的设置值最大为255,最小为0,数值越小,表示中断优先级越高,寄存器相对于distributor基地址的偏移区间为0x400-0x7f8: 此组寄存器的个数由GICD_TYPER.ITLinesNumber 的值决定,为(8 * (GICD_TYPER.ITLinesNumber+1))个: 每个寄存器划分的4个设置域为: [31:24] Priority, byte of

Linux Kernel Interrupt、Interrupt Priority、Prohibit Things Whthin CPU In The Interrupt Off State

目录 0. 引言 1. Linux 中断的概念 2. Linux 中断相关的源代码分析 3. Linux 硬件中断 4. Linux 软中断 5. 中断优先级 6. CPU在关中断状态下编程要注意的事项 0. 引言 中断是现代计算机体系结构的重要组成部分.现代体系结构的基本输入输出方式有三种 1. 程序查询: CPU周期性询问外部设备是否准备就绪.该方式的明显的缺点就是浪费CPU资源,效率低下.但是在特定的场景下这种"程序查询"的方式还有有它的用武之地的 例如,在网络驱动中,通常接口(

DTRACE简介(2)

By samwan on 三月 21, 2007 通过上一次的介绍,相信大家对DTRACE已经有了一个初步的认识.上一次结束时专门留了一个例子,可能大家第一次看有很多不明白的地方,没有关系,随着我们对DTRACE更多的介绍,很快就会"云开雾散"了. D语言作为一种编程语言,自然就有其语法.关键字.数据结构.运算符.函数等,我将一一介绍. D语言中标志符名称与C语言类似,由字母.数字和下划线组成,其中第一个字符必须是字母或者下划线.D语言预留了一些关键字供DTRACE本身使用,关键字不能

织女星开发板RISC-V内核实现微秒级精确延时

前言 收到VEGA织女星开发板也有一段时间了,好久没玩了,想驱动个OLED屏,但是首先要实现IIC协议,而实现IIC协议,最基本的就是需要一个精确的延时函数,所以研究了一下如何来写一个精确的延时函数.众所周知,ARM Cortex-M内核都有一个24位的SysTick系统节拍定时器,它是一个简易的周期定时器,用于提供时基,多为操作系统所使用.RV32M1的RISC-V内核也有一个SysTick定时器,只不过它不属于内核,而是使用的一个外部通用定时器,即LPIT0( low power perio

TI C66x DSP 系统events及其应用 - 5.3(Interrupt)

对于TI C66x DSP的每个CPU有INT4~15共12个中断输入.对于中断,event combiner将INTC的输入event 4~127分为4个组(event 0~3为INTC内部使用,如图示为event combiner的四个输出),然后event 0~127作为Interrupt Selector的输入.类似于4.x中的exception,中断也有同样功能的event flag,event mask,masked event flag寄存器. Interrupt Seclctor

the difference between an embOS interrupt and a zero latency interrupt

the difference between an embOS interrupt and a zero latency interrupt is the interrupt priority level and the usage of OS_EnterInterrupt()/OS_LeaveInterrupt() or OS_EnterNestableInterrupt()/OS_LeaveNestableInterrupt(). Example of an embOS interrupt

ZYNQ. Interrupt(2)SPI.AXI TIMER

Shared Peripheral Interrupts (SPI) SPI 可以接收来自PL的中断,这里使用PL模块 AXI Timer 的中断模式,并连接到CPU. AXI TIMER 定时器,内部有两个完全相同的TIMER模块. 特性: 在手册里可以找到详细的参数和寄存器信息. 硬件系统 需要zynq核和一个AXI Timer,PL的clock可以在zynq核内部设置. 软件部分 这里会使用到xilinx提供的函数库 中断       xscugic.h 定时器 xtmrctr.h 因为使

数码相框(LCD、I2C)

一:项目介绍    该项目最终实现的功能很简单,手指在触摸屏左滑(下一张图片),右滑(上一张图片)    1.1软硬件资源    硬件:pc机,ARM Cortex-A9开发板    软件:linux 操作系统    1.3项目流程        本项目主要分为三大模块:        一:LCD驱动编写        二:I2C驱动编写        三:使用I2C读取触摸屏上的数据,判断是向左或者向右,再控制lcd进行图片的显示 大体流程图如下所示: 二:项目环境搭建 2.1安装交叉环境编译

I/O输入系统

I/O输入系统 计算机有两个主要任务:I/O操作与计算处理.在许多情况下,主要任务是I/O操作.而计算处理只是附带的. 操作系统在计算机I/O方面的作用是管理和控制I/O操作和I/O设备. 概述 对与计算机相连设备的控制是操作系统设计者的主要任务之一. I/O设备技术呈现两个相矛盾的趋势.一方面,可以看到硬件与软件接口日益增长的标准化.这一趋势有助于将设备集成到现有计算机和操作系统.另一方面,也可以看到I/O设备日益增长的多样性.有的新设备与以前的设备区别很大,以至于很难集成到计算机和操作系统中