长沙市互联网加网站,做网站linux主机,绵阳网站建站,制作网站的软件叫什么本文基础内容参考的是正点原子的FREERTOS课程。 这是基于HAL库的 正点原子手把手教你学FreeRTOS实时系统 这是基于标准库的 正点原子FreeRTOS手把手教学-基于STM32 回顾STM32的中断 什么是中断#xff1f; 中断优先级分组设置 Freertos中断分组 Freertos就是用的最后一种…本文基础内容参考的是正点原子的FREERTOS课程。 这是基于HAL库的 正点原子手把手教你学FreeRTOS实时系统 这是基于标准库的 正点原子FreeRTOS手把手教学-基于STM32 回顾STM32的中断 什么是中断 中断优先级分组设置 Freertos中断分组 Freertos就是用的最后一种所以我们需要重设中断优先级分组 有三个主要特点 1、低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数 2、建议将所有优先级位指定为抢占优先级位方便FreeRTOS管理 3、中断优先级数值越小越优先任务优先级数值越大越优先 配置PendSV和Systick中断优先级 freertos如何配置PendSV和Systick中断优先级 得先熟悉下STM32中断相关寄存器 其中跟PendSV和SysTick优先级相关的就是SHPR3这个寄存器地址为0xE000ED20理论上我们只要把对应优先级数值赋值到上表的最后两个地址处的寄存器就能实现配置PendSV和Systick的中断优先级。 具体Freertos是怎么做的呢 其实就是通过写这两个寄存器来实现的 PendSV 和 SysTick 优先级是在哪里设置的呢在函数 xPortStartScheduler()中设置此函数在文件 port.c 中。 往下看有这么两行 看看调用关系 通过上述过程就可以将15这个freertos管理的最低优先级赋值给pendsv和systick这两个中断的优先级。其中左移4位是因为中断寄存器只有高4位有效低4位不使用。 详细过程可自行看源码分析此处不赘述。 只要知道freertos中将pendsv和systick的中断都设置成了最低优先级注意是中断的最低优先级不管再怎么低都比任务要高这样就能保证系统任务切换不会阻塞系统其他中断的响应因为任务切换其实就是在pendsv中断中进行的它最低其他中断也能及时抢占它。 freertos开中断和关中断 先熟悉下另外几个中断相关寄存器 freertos实现关中断和开中断其实就是往寄存器BASEPRI写阈值然后优先级小于等于阈值中断都会被屏蔽此时如果往该寄存器写入freertos管理的最高优先级那么所有的优先级都小于等于最高优先级因此所有优先级中断都会被屏蔽。 FreeRTOS 开关中断函数为portENABLE_INTERRUPTS ()和portDISABLE_INTERRUPTS() 这两个函数其实是宏定义在 portmacro.h 中有定义如下 可以看出开关中断实际上是通过函数 vPortSetBASEPRI(0)和 vPortRaiseBASEPRI()来实现 的。 比如关中断调用portDISABLE_INTERRUPTS() freertos管理的优先级能被freertos屏蔽也能调用它的API函数不能管理的中断没法屏蔽也就是说管不了管不了你也不让你调用我的API。 开中断调用portENABLE_INTERRUPTS() 其实就是往该寄存器里写0此时不屏蔽任何中断。 临界段代码 临界段代码也叫做临界区是指那些必须完整运行不能被打断的代码段比如有的外设 的初始化需要严格的时序初始化过程中不能被打断。FreeRTOS 在进入临界段代码的时候需要关闭中断当处理完临界段代码以后再打开中断。FreeRTOS 系统本身就有很多的临界段代码这些代码都加了临界段代码保护我们在写自己的用户程序的时候有些地方也需要添加临界段代码保护。 FreeRTOS 与临界段代码保护有关的函数有4个 这4个函数其实是宏定义在 task.h 文件中有定义。这4个函数的区别是前两个是任务级的临界段代码保护后两个是中断级的临界段代码保护。 注意任务调度靠的是PendSV中断所以关中断也就关闭了任务调度。 进入临界区函数的内部其实就是调用了关中断函数一直跳转可以看到如下所示 退出临界区函数里面就对应调用了开中断函数 只不过临界区相对于开关中断增加了嵌套功能即通过变量自增和自减来实现调用了n次进入临界区就要调用n次退出临界区才能开中断。