第六章 FreeRTOS的中断管理

目录

一. 了解什么是中断

1.1 对中断的简单认识

1.2 中断优先级分组

1.3 FreeRTOS的中断

二. 中断相关寄存器

2.1 三个系统中断优先级配置寄存器

2.1.1 FreeRTOS配置PendSV和Systick中断优先级

2.2 三个中断屏蔽寄存器

​2.2.1 BASEPRI这个寄存器的认识

2.2.2 关中断函数

2.2.3 开中断函数


一. 了解什么是中断

1.1 对中断的简单认识

认识:让CPU打断正常运行的程序,转而去处理紧急的事件,就叫做中断。

中断执行机制,可简单概括为三步:

中断请求:外设产生中断请求(GPIO外部中断、定时器中断等);

响应中断:CPU停止执行当前程序,转而去执行中断处理程序;

退出中断:执行完毕,返回被打断的程序处,继续往下执行。(打断哪个点,就返回哪个点继续执行)

1.2 中断优先级分组

认识:

        ① 在ARM Cortex - M使用了8位宽(256个优先级,0~255)的寄存器来配置中断的优先级,这个寄存器就是中断优先级配置寄存器。

        ② 在STM32中只用了该寄存器的高4位[7:4],所以STM32提供了16个(0~15)的中断优先等级。

STM32 的中断优先级可以分为抢占优先级子优先级

A. 抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断

B. 子优先级:当同时发生具有相同抢占优先级的多个中断时子优先级高的先执行。若子优先级低的先执行,子优先级高的中断则无法打断

注意中断优先级数值越小越优先。

1.3 FreeRTOS的中断

① 低于configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数。

(例如,在代码中configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY设置的是5,所以能被FreeRTOS操作的中断优先级是5~15)

② 建议将所有优先级位指定为抢占优先级位,方便FreeRTOS管理

③ 中断优先级数值越小越优先,任务优先级数值越大越优先。


二. 中断相关寄存器

2.1 三个系统中断优先级配置寄存器

三个系统中断优先级配置寄存器,分别为 SHPR1、 SHPR2、 SHPR3

SHPR1寄存器地址:0xE000ED18

SHPR2寄存器地址:0xE000ED1C

SHPR3寄存器地址:0xE000ED20

表中一个地址是8个位,一个寄存器是32位

若想设置PendSV的优先级,则需要从SHPR3首地址偏移16位;

若想设置SysTick的优先级,则SHPR3首地址偏移24位。

注意:

        PendSV实现任务切换和调度

        SysTick给系统提供心跳节拍


2.1.1 FreeRTOS配置PendSV和Systick中断优先级

 其中0XE000ED20是寄存器SHPR3的首地址。

PendSV的首地址等于变量configKERNEL_INTERRUPT_PRIORITY左移16位

Systick的首地址 等于变量configKERNEL_INTERRUPT_PRIORITY左移24位

configKERNEL_INTERRUPT_PRIORITY为变量configLIBRARY_LOWEST_INTERRUPT_PRIORITY 左移 8-configPRIO_BITS位(其中configPRIO_BITS宏定义为4,configLIBRARY_LOWEST_INTERRUPT_PRIORITY宏定义为15),即将15左移4位,因为STM32优先级配置低4位并没有用到,左移4位到高四位。

 经过以上配置将PendSV和Systick设置优先级位15。

设置最低:保证系统任务切换不会阻塞系统其他中断的响应(中断可以打断任务,任务不能打断中断,因为中断是较为紧急的事情)


2.2 三个中断屏蔽寄存器

三个中断屏蔽寄存器,分别为 PRIMASKFAULTMASK BASEPRI

2.2.1 BASEPRI这个寄存器的认识

BASEPRI:设置为某个值时,屏蔽优先级低于某一个阈值的中断,当设置为0时,则不关闭任何中断。

例如: BASEPRI设置为0x50,代表中断优先级在5~15内的均被屏蔽,0~4的中断优先级正常执行。


2.2.2 关中断函数

portDISABLE_INTERRUPTS();

关中断程序示例:

#define portDISABLE_INTERRUPTS() 		vPortRaiseBASEPRI()
static portFORCE_INLINE void vPortRaiseBASEPRI( void ) 
{ 
	uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY; 
	__asm 
	{
		msr basepri, ulNewBASEPRI 
		dsb 
		isb
	} 
}
#define configMAX_SYSCALL_INTERRUPT_PRIORITY            ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        5      /* FreeRTOS可管理的最高中断优先级 */ 

以上程序中变量 configMAX_SYSCALL_INTERRUPT_PRIORITY0x50,赋值给变量ulNewBASEPRI ,使用汇编语言将ulNewBASEPRI 赋值给BASEPRI寄存器。


2.2.3 开中断函数

portENABLE_INTERRUPTS();

开中断程序示例:

#define portENABLE_INTERRUPTS()		 vPortSetBASEPRI( 0 )
static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI ) 
{ 
	__asm
	{
		msr basepri, ulBASEPRI
	} 
}

  以上程序将寄存器BASEPRI设置成0

在中断服务函数中调度FreeRTOS的API函数需注意:

1、中断服务函数的优先级需在FreeRTOS所管理的范围内;

2、在中断服务函数里边需调用FreeRTOS的API函数,必须使用带“FromISR”后缀的函数 ;

3、优先级分组必须设置为组4,全部设置成抢占优先级。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
FreeRTOS中的SysTick延时是一种基于系统时钟的延时机制。SysTick定时器是一个硬件定时器,用于产生系统节拍。它可以被用来创建精确的延时和时间测量。 在FreeRTOS中,有两种类型的SysTick延时函数可供使用:相对延时和绝对延时。相对延时使用vTaskDelay函数,它接受一个参数xTicksToDelay,表示要延时的SysTick数目。这种延时方式是相对于当前任务的时间来计算的,它会暂停当前任务的执行,并将任务加入到延时队列中等待指定的SysTick数目后再次运行。 另一种是绝对延时,使用vTaskDelayUntil函数。它接受两个参数pxPreviousWakeTime和xTimeIncrement。pxPreviousWakeTime表示要延时起始的SysTick时刻,xTimeIncrement表示相对起始时刻的时间间隔。这种延时方式允许任务按照固定的时间间隔执行,可以用于周期性任务的调度。 需要注意的是,SysTick延时函数只能在FreeRTOS任务中使用,不能在中断服务程序(ISR)中使用。此外,SysTick定时器的配置需要在FreeRTOSConfig.h文件中进行设置。 总结起来,FreeRTOS中的SysTick延时是通过使用定时器服务任务和定时器命令队列来实现的,提供了相对延时和绝对延时两种方式,可用于实现精确的任务调度和时间控制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [FreeRTOS学习(六)时间管理](https://blog.csdn.net/la_fe_/article/details/114880371)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [浅析 FreeRTOS SysTick 和任务延时](https://blog.csdn.net/wangyx1234/article/details/127311949)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值