网站建设需要购买什么,长沙建设品牌网站,做小程序公司哪家好,apache安装WordPress目录
前言#xff1a;
一、中断优先级设置
二、中断相关寄存器#xff08;STM32-Cortex M3#xff09;
三、临界段代码保护
四、任务调度器的挂起和恢复
总结#xff1a; 前言#xff1a;
博客笔记根据正点原子视频教程编辑#xff0c;仅供学习交流使用#xff0…目录
前言
一、中断优先级设置
二、中断相关寄存器STM32-Cortex M3
三、临界段代码保护
四、任务调度器的挂起和恢复
总结 前言
博客笔记根据正点原子视频教程编辑仅供学习交流使用
一、中断优先级设置
①中断概念回顾
让CPU打断正常运行的程序转而去处理紧急的事件程序就叫中断。可简单概括为以下三步 ② 优先级分组设置
ARM Cortex-M 使用了 8 位宽的寄存器256级来配置中断的优先等级这个寄存器就是中断优先级配置寄存器。但STM32只用了中断优先级配置寄存器的高4位 [7 : 4]所以STM32提供了最大16级的中断优先等级。 STM32 的中断优先级可以分为抢占优先级和子优先级。抢占优先级 抢占优先级高的中断可以打断正在执行但抢占优先级低的中断。子优先级当同时发生具有相同抢占优先级的两个中断时子优先级数值小的优先执行。中断优先级数值越小越优先
优先级的设置有5 种分配方式对应着中断优先级分组的 5 个组通过在在HAL_Init中调用函数HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4即可完成设置FreeRTOS中常用NVIC_PriorityGroup_4 注意低于5级优先级的中断里才可调用FreeRTOS的API函数。在FreeRTOS中常把4位都设置为抢占优先级即NVIC_PriorityGroup_4。中断优先级数值越小越优先任务优先级数值越大越优先。 二、中断相关寄存器STM32-Cortex M3
①三个系统中断优先级配置寄存器
一个寄存器是32位的它的地址是这一段区域的首地址8位要设置一个寄存器区域的非首地址如PendSV和SysTick通过首地址偏移bit即可。
SHPR1寄存器地址0xE000ED1
SHPR2寄存器地址0xE000ED1C
SHPR3寄存器地址0xE000ED20 注意PendSV和SysTick设置最低优先级保证系统任务切换不会阻塞系统其他中断的响应。即中断可打断任务但任务不可打断中断。
②三个中断屏蔽寄存器 注意FreeRTOS利用的BASEPRI这个寄存器完成对中断的管理。该寄存器屏蔽优先级低于某个阈值或优先级号大于某个值的中断如BASEPRI设置为0x50配置优先级只用到低4位只用到高四位[7:4]所以这里写的是5向左偏移4位的值代表中断优先级在5~15内的均被屏蔽0~4的中断优先级正常执行。当BASEPRI设置为0不关闭任何中断不是屏蔽所有中断的意思。
关闭中断优先级在5-15的中断程序示例
#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) )
/*STM32中断优先级只用高4位配置偏移4位*/
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5
/* FreeRTOS可管理的最高中断优先级 也即把BASEPRI设置为0x50*/ FreeRTOS说“我可以中断你可以让你用我的API函数我不能中断你你也不能用我的API函数”
注意中断服务函数的优先级需在FreeRTOS所管理的范围内中断服务函数里边需调用FreeRTOS的API函数必须使用带“FromISR”后缀的函数。 开中断代码示例即BASEPRI设置为0
#define portENABLE_INTERRUPTS() vPortSetBASEPRI( 0 )
static portFORCE_INLINE void vPortSetBASEPRI( uint32_t ulBASEPRI )
{ __asm{msr basepri, ulBASEPRI}
}三、临界段代码保护
临界段代码也叫做临界区是指那些必须完整运行不能被打断的代码段。
使用场合①外设需严格按照时序初始化的外设如I2C、SPI等。②系统在自身需求。③用户的某些需求。
能够打断当前程序运行的中断、任务调度PendSV相关。要想程序不被打断关中断即可指FreeRTOS所管辖的最高级别中断因为PendSV是与任务切换有关的一个中断被设置成了最低优先级所以关中断后PendSV与任务调度器有关也一定不会响应。
FreeRTOS 在进入临界段代码的时候需要关闭中断当处理完临界段代码以后再打开中断 无论是任务级还是中断级临界区本质都是关中断代码是成对使用的且支持嵌套可尽量保持临界段耗时短
//任务级临界区调用格式示例
taskENTER_CRITICAL() ;
{… … /* 临界区 */
}
taskEXIT_CRITICAL() ;//中断级临界区调用格式示例这段写在中断服务函数里
uint32_t save_status;
save_status taskENTER_CRITICAL_FROM_ISR()
{… … /* 临界区 */
}
taskEXIT_CRITICAL_FROM_ISR(save_status ); 四、任务调度器的挂起和恢复 调用挂起任务调度器的函数时不需要关闭中断仅仅是防止了任务之间的资源争夺中断照样可以直接响应。
挂起调度器的方式适用于临界区位于任务与任务之间既不用去延时中断又可以做到临界区的安全。 vTaskSuspendAll() ;
{… … /* 内容 */
}
xTaskResumeAll() ; 总结
实时操作系统是嵌入式学习的进阶内容掌握好在面试时会有巨大优势 往期精彩
电机应用控制——直流无刷电机
OpenCV机器视觉系列专栏
C语言进阶