FreeRTOS中断

1.PRIMASK和FAULTMASK寄存器

有时候为了执行严格的时序,需要暂时屏蔽所有中断,这是可以使用PRIMASK。PRIMASK可以屏蔽除复位,MNI和HardFault之外的所有中断。

FAULTMASK比PRIMASK更严格,连HardFault都可以屏蔽。

2.BASEMASK对中断的屏蔽更灵活一些,可以屏蔽优先级低于某一阀值的中断,这个阀值就是通过BASEMASK设置。

3.中断配置宏

configPRIO_BITS:配置MCU使用几位优先级,例如STM32使用的是4位,则设置成4;

configLIBRARY_LOWEST_INTERRUPT_PRIORITY: 设置最低优先级,例如configPRO_BITS=4,则有16级优先级,那么最低优先级为15,此宏应配置成15.

configKERNEL_INTERRUPT_PRIORITY:此宏配置内核中断优先级,用来设置PendSV和滴答定时器中断优先级,其定义是:

#define configKERNEL_INTERRUPT_PRIOPRTY    (configLIBRARY_LOWEST_INTERRUPT_PRIORITY <<(8-configPRIO_BITS))

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY: 此宏用来配置FreeRTOS能管理的最高优先级,例如此宏配置成5,那么0-4优先级不受系统管理,系统无法对其屏蔽等操作。5-15级优先级才能受系统管理。

configMAX_SYSCALL_INTERRUPT_PRIORITY: 其定义是:

#define configMAX_SYSCALL_INTERRUPT_PRIORITY   (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY<<(8-configPRIO_BITS))

4.FreeRTOS中断开关

系统的开关操作是通过两个宏定义实现:

portENABLE_INTERRUPS();

portDISABLE_INTERRUPTS();

详细定义为:

#define portENABLE_INTERRUPTS()  vPortRaiseBASEPRI()

#define portDISABLE_INTERRUPTS()  vPortSetBASEPRI()

5.临界区代码

临界区代码也叫临界区,是指那些需要完整运行,不能被打断的代码段。例如以下外设初始化时需要执行严格的时序,不能被中

断。系统进入临界区前会先关闭中断,在退出临界区后重新打开。

临界区代码保护函数有4个:

 taskENTER_CRITICAL();

 taskEXIT_CRITICAL();

taskENTER_CRITICAL_FROM_ISR();//在中断中进入临界区

taskEXIT_CRITICAL_FROM_ISR();//在中断中退出临界区

 

 

 

 

 

你可能感兴趣的:(FreeRTOS)