首页 » 互联网 » RTOS系列9——中断系统_优先级_内核

RTOS系列9——中断系统_优先级_内核

落叶飘零 2025-01-16 23:46:55 0

扫一扫用手机浏览

文章目录 [+]

早期的打算机没有中断系统,人们每每须要等上一个任务运行结束才能运行下一个任务,这极大地限定了打算机的实行效率。
早期打算机如下图:

事实上中断系统涌现的很早,Intel的传奇中断掌握芯片8259在1976年就被用在8085系列产品中。
当代打算机中毫无例外地都要采取中断技能!

RTOS系列9——中断系统_优先级_内核 互联网

当打算机在运行时,很多事情在“同时”发生,磁盘在快速读写,网络在收发数据,而用户也每每同时运行了多个运用程序。
这些能够发生,中断系统扮演了关键角色。

中断是一种基于硬件的机制,用于关照CPU发生了一个异步事宜。
CPU确认中断后,跳转并实行一个分外的函数,这个分外的函数叫中断做事程序。

根据中断发生韶光可以讲中断分为同步中断和异步中断:

1、同步中断是实行指令时由CPU产生的,之以是称之为同步,是由于只有在一条分外指令被实行后CPU才会发出中断(如实行了一条未定义指令),这类型的中断也被称为非常。
2、异步中断时由其他硬件设备随机触发CPU产生的,这类型的中断也被称为外部中断。

根据中断做事函数入口地址可以将中断分为向量中断和非向量中断:

1、在向量中断中,不同的中断号由不同的入口地址。
2、在非向量中断中,多个中断共享一个入口地址。

2.中断硬件实现

中断是一种基于硬件的机制,目前的主流处理器都是向量中断构造。
以ARM 体系处理为参考剖析中断机制的硬件实现。
在ARM向量中断体系中有一个向量中断掌握器VIC,其特点如下:1、支持多个中断要求输入。
2、支持动态分配优先级。
3、支持向量地址配置。
向量中断掌握器VIC的模型框图如下:

普通的理解:向量中断掌握器VIC根据中断输入旗子暗记,给CPU产生一个中断旗子暗记,同时将中断的做事的地址加载给PC,从而跳转到中断做事程序中。
中断机制是通过硬件来实现。

3.操作系统中断做事程序

操作系统的任务有优先级,处理器中断也有优先级,可以将这两个优先级汇总在一起,框图如下:

由图可知中断优先级高于任务优先级。
操作系统中中断做事程序可以分为两类:操作系统内核不参入的中断做事程序和操作系统内核参入的中断做事程序。

操作系统内核不参入的中断做事程序在很多情形下,中断做事程序须要做的处理非常大略,并不须要向任务发布或信息(利用操作系统API),这种情形下的中断做事程序的代码框架如下:

进入中断做事程序后,直接完成须要的处理操作,完成操作后硬件自动退出中断返回用户程序,连续实行被打断的程序。
操作系统内核不参入的中断做事程序的运行关系图如下:

操作系统内核参入的中断做事程序在有些情形下,中断做事程序须要向任务发布或旗子暗记(利用操作系统API),由于发布布或旗子暗记有可能会导致高优先级的任务就绪,当完成中断操作后这时操作系统不能直接返回刚刚被中断打断的任务,而是须要实行高优先级任务,因此在操作系统内核参入的中断做事程序末端我们须要增加一种任务切换的机制。

进入中断做事程序后,完成须要的处理操作,向任务发布或旗子暗记,实行任务切换(当有高优先级任务就绪时切换任务)。
操作系统内核参入的中断做事程序的运行关系图如下:

4.中断嵌套

中断中存在一种较为繁芜的情形:中断嵌套。
中断嵌套便是一个中断程序正在处理时,又发了一个高优先级的中断,中断嵌套的关系图如下:

对付操作系统内核不参入的中断做事程序,涌现嵌套征象不会产生影响。
对付操作系统内核参入的中断做事程序,涌现嵌套征象会产生影响。
前文我们提到操作系统内核参入的中断做事程序末端有任务切换操作。
这样将会涌现以下多次切换任务的情形,同时任务切换1还有导致在中断嵌套未处理完成直接切换到用任务,导致中断壅塞,中断嵌套的关系图如下:

因此我们须要有一个中断嵌套机制避免上述问题,办理方法有两种:1、中断屏蔽2、低优先级任务切换

中断屏蔽为将中断分为两种内核不参入和内核参入如下图:

因此我们须要无内核参入的中断放在最高优先级,无内核参入的中断做事须要“短平快”,有内核参入的中断做事利用低优先级,同时有内核参入的中断做事进中断后会屏蔽所有有内核参入的中断,使得只有一个中断能“独享”操作系统内核。
利用这种机制就可以办理中断嵌套给操作系统内核带来的中断返回问题。

低优先级任务切换将在内核参入的中断返回时切换任务策略修正为,内核参入的中断返回时设置一个最低优先级中断标志,等内核参入的中断完成后,由一个低优先级中断完成任务切换操作。
以CORTEX-M4为例,cortex-M4核有一个PendSV(可挂起的系统调用)非常,其非常编号为14并且具有可编程的优先级。
当软件将PendSV设置成挂起时,程序将进入PendSV非常(可中断)。
系统优先级如下:

将PendSV非常优先级设置为最低,这样其他的中断函数都可以正常相应中断,不会受到PendSV非常影响,在PendSV非常中实行任务切换时序框图如下:

中断做事程序中操作内核API,使得高优先级任务就绪,此时设置PendSV标志位,等所有中断完成后,系统才进入最低优先级中断PendSV进行任务切换。

5.FreeRTOS示例

在硬件为cortex-m3的FREERTOS系统中,一个串口中断做事如下:

在串口中断做事中,处理了串口硬件的数据,然后给干系任务发送了旗子暗记,使得干系任务就绪,在中断返回时调用了切换任务接口。
任务切换接口代码如下:

portYIELD_FROM_ISR宏终极将设置PendSV中断的标志位,当其他中断结束后,PendSV中断会进行任务切换(PendSV中断被设计成任务切换功能)。

6.源码

void UART4_IRQHandler(void){static portBASE_TYPE xHigherPriorityTaskWoken;__disable_irq();xHigherPriorityTaskWoken = pdFALSE;if(USART_GetITStatus(UART4, USART_IT_IDLE) == SET){useless_ram_data = UART4->DR; DMA_Cmd(DMA2_Channel3,DISABLE); Common_Cache_Data(CACHE_BUFF_NUM - DMA_GetCurrDataCounter(DMA2_Channel3),&rs485_commnuication_frame);DMA2_Channel3->CNDTR=CACHE_BUFF_NUM;DMA_Cmd(DMA2_Channel3,ENABLE); / 开释旗子暗记 /xSemaphoreGiveFromISR(xSem_uart4_com_recv, &xHigherPriorityTaskWoken);USART_ClearITPendingBit(UART4, USART_IT_TC);USART_ClearITPendingBit(UART4, USART_IT_IDLE);}__enable_irq();portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); / 切换任务 /}#define portYIELD_FROM_ISR( x ) portEND_SWITCHING_ISR( x )#define portEND_SWITCHING_ISR( xSwitchRequired ) if( xSwitchRequired != pdFALSE ) portYIELD()/ 切换任务 /#define portYIELD() \{\/ 设置PendSV 标志位 /\portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;\__dsb( portSY_FULL_READ_WRITE );\__isb( portSY_FULL_READ_WRITE );\}

未完待续…实时操作系统系列将持续更新创作不易希望朋友们点赞,转发,评论,关注。
您的点赞,转发,评论,关注将是我持续更新的动力作者:李巍Github:liyinuoman2017

标签:

相关文章

RTOS系列9——中断系统_优先级_内核

早期的打算机没有中断系统,人们每每须要等上一个任务运行结束才能运行下一个任务,这极大地限定了打算机的实行效率。早期打算机如下图:事...

互联网 2025-01-16 阅读 评论0