600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > FreeRTOS Cortex-M 中断管理

FreeRTOS Cortex-M 中断管理

时间:2024-07-10 04:29:29

相关推荐

FreeRTOS Cortex-M 中断管理

目录

1.中断简介

中断的优先级数字越小优先级越大,这是它内部的15个

外部的有140个但用不了那么多

​编辑

WEAK

NVIC 的访问地址是 0xE000_E000

NVIC结构体里的寄存器

优先级的定义

2.优先级分组

3.优先级设置

4.中断屏蔽寄存器

FreeRTOS中断配置

注意

1.中断简介

中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生之后CPU就会中断当前的流程而去处理中断服务,Cortex-M 内核的MCU提供了一个用于中断管理的嵌套向量中断控制器NVIC。

Cotex-M3和M4的NVIC最多支持240个IRQ(中断请求),1个不可屏蔽中断(NM)),1个Systick(滴答定时器)定时器中断和多个系统异常。

与中断相关的寄存器都在NVIC和SCB中。

中断的优先级数字越小优先级越大,这是它内部的15个

__Vectors向量中断表

外部的有240个但用不了那么多

WEAK

WEAK函数就是已经定义了的,我过我们重写,他就不会调用这里面的函数了,就会调用我们自己写的函数(32里的printf重定向说到)

NVIC 的访问地址是 0xE000_E000

NVIC的地址就是0xE000E000加上偏移地址0x0100,

NVIC结构体里的寄存器

这些寄存器都是跟中断相关

优先级的定义

在 CM3 中,优先级对于异常来说很关键的,它会影响一个异常是否能被响应,以及何时可以响应。优先级的数值越小,则优先级越高。CM3 支持中断嵌套,使得高优先级异常会抢占(preempt)低优先级异常。有 3 个系统异常:复位,NMI 以及硬 fault,它们有固定的优先级,并且它们的优先级号是负数,从而高于所有其它异常。所有其它异常的优先级则都是可编程的(但不能编程为负数)。原则上,CM3 支持 3 个固定的高优先级和多达 256 级的可编程优先级,并且支持 128级抢占

优先级寄存器是由 __IO uint8_t IP[240]; 决定的,最多有240个外部中断

正常我们用4位用来表达优先级4567,它这里举例用3个

2.优先级分组

为了使抢占机能变得更加可控,CM3还把256级优先级按位分成高低两段,分别是抢占优先级和亚优先级,MSB所在的位段(左边的)对应抢占优先级,而LSB所在的位段(右边的)对应亚优先级。分组位置 表达抢占优先级的位段表达亚优先级的位段

优先级分组通过寄存器AIRCR设置(地址为OXEOOOEDOC)

7:1意思是说第7位到第1位都表示抢占优先级,第0位表示亚优先级,下面以此类推,所以我们最多用128来表示抢占优先级

如果我们要使用4位的话,低四位不用,我们要左移4位才是我们最终的优先级

对应上表76543,这5中情况

寄存器AIRCR地址就是这么来的

优先级分组实际上是调用SCB->AIRCR 控制优先级分组,通过寄存器来进行设定

3.优先级设置

对于外设中断优先级的设置可以通过奇存器:OXE000 E400 ~ OXEOOOE4EF系统异常中断通过寄存器OXE000 ED18 ~ OXE000ED23

4.中断屏蔽寄存器

详细可查

中断屏蔽寄存器有3个:1.PRIMASK2.PAULTMASK3.BASEPRI用于中断屏蔽的特殊寄存器PRIMASK, FAULTMASK 和 BASEPRI这三个寄存器,可以参考上面链接,大致了解这三个中断屏蔽寄存器。BASEPRI寄存器可以只屏蔽低于某一阈值的优先级中断,FreeRTOS的开关中断就是通过BASEPRI这个寄存器实现。想屏蔽某一阈值之下的优先级,直接将优先级写进寄存器即可,写入0就停止屏蔽中断

freeRTOS使用第三个

关闭中断和开启中断,

关闭

用的出最高优先级去关闭

使能中断,vPortSetBASEPRI( 0 )有一个形参0,把0传进去,把0写进basepri里

这两个寄存器不是freertos用

FreeRTOS中断配置

我们用四位配置中断优先级,所以中断优先级配置都要8 - configPRIO_BITS左移四位

在FreeRTOS 中 0-4 的优先级 不受它的管理 5-15 才是它的管理范围

configLIBRARY_LOWEST_INTERRUPT_PRIORITY

此宏是用来设置最低优先级,前面说了,STM32优先级使用了4位,而且STM32配置的使用组4,也就是4位都是抢占优先级。因此优先级数就是16个,最低优先级那就是15。所以此宏就是15

configLIBRARY_MAX_sYSCALL_INTERRUPT_PRIORITY

此宏用来设置FreeRTOS系统可管理的最大优先级,讲解BASEPRI寄存器说的那个阈值优先级,这个大家可以自由设置,这里我设置为了5。也就是高于5的优先级(优先级数小于5)不归FrecRTOS管理!

注意

在mian函数的开始和结束是有临界段的,临界段里面其实就是调用了中断屏蔽的语句,临界段打开,临界段关闭,main函数里面的程序才能运行

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。