IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> FreeRTOS学习之中断配置和临界段 -> 正文阅读

[嵌入式]FreeRTOS学习之中断配置和临界段

前言

此文章针对开发板stm32F103ZET6。

工作中的学习是重应用,不是用来考试的!!!

在初学的时候对里面的一些概念比较模糊,看了第二遍才清楚了不少。因为是初学stm32,学习过程中有些知识掌握得不够扎实,比如:

此章涉及了NVIC的有关知识,相关内容拓展知识:

????????STM32属于ARM中Cortex-M系列处理器,比如:STM32F1数据Cortex-M3,STM32F7数据Cortex-M7。

????????Cortex-M3是stm32F1的一个内核,stm32F1是在Cortex-M3基础上增加了一些外设(如:USART、AD等)的芯片

参考博文:(12条消息) STM32中断,及FreeRTOS中断优先级配置_strongerHuang-CSDN博客

FreeRTOS中断配置和临界段

中断配置

Cortex-M中断(涉及NVIC知识)

中断简介

中断是微控制器一个很常见的特性,中断由硬件产生,当中断产生以后 CPU 就会中断当前的流程转而去处理中断服务,Cortex-M 内核的 MCU 提供了一个用于中断管理的嵌套向量中断 控制器(NVIC)。

优先级

优先级分两种:抢占优先级和响应优先级,两种优先级还有其他叫法。

本文章外的内容:

????????中断优先级 > 任务优先级

? ? ? ? 在stm32的FreeRTOS中,中断优先级与中断分组和相关优先级寄存器的位数有关(在stm32f1中用了高4位,共有16级优先级——抢占和响应的总和)

FreeRTOS中断配置宏

? ? ? ? 1.configPRIO_BITS

设置MCU使用几位优先级,stm32一般使用4位,因此设此宏为4,共16级抢占优先级????????

????????2.configLIBRARY_LOWEST_INTERRUPT_PRIORITY

设置最低优先级,优先技术是16个,最低优先级为15

? ? ? ? 3.configKERNEL_INTERRUPT_PRIORITY

设置内核中断优先级

此宏由 configLIBRARY_LOWEST_INTERRUPT_PRIORITY 左移 (8-configPRIO_BITS 位),也就是左移4位

宏 configKERNEL_INTERRUPT_PRIORITY 用来设置 PendSV 和滴答定时器的中断优先级,在函数 xPortStartScheduler()中设置:

上述代码中红色部分就是设置 PendSV 和 SysTick 优先级的,它们是直接向地址 portNVIC_SYSPRI2_REG 写入优先级数据,portNVIC_SYSPRI2_REG 是个宏,在文件 port.c 中 由定义:

#define portNVIC_SYSPRI2_REG ( * ( ( volatile uint32_t * ) 0xe000ed20 ) )

可以看到宏 portNVIC_SYSPRI2_REG 就是地址 0XE000ED20!同时也可以看出在 FreeRTOS 中 PendSV 和 SysTick 的中断优先级都是最低的

? ? ? ? 4.configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

设置FreeRTOS系统可管理的中断最大优先级,BASEPRI 寄存器说的那个阈值优先级。这个大家可以自由设置,实验中设置为了5。也就是高于5 的优先级(优先级数小于 5)不归 FreeRTOS 管理!

? ? ? ? 5.configMAX_SYSCALL_INTERRUPT_PRIORITY

此宏是 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 左移 4 位而来的。

此宏设置好以后,低于此优先级的中断可以安全的调用 FreeRTOS 的 API 函数;高于此优先级的中断 FreeRTOS 是不能禁止的,中断服务函数也不能调用 FreeRTOS 的 API 函数!

由于高于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的优先级不会被 FreeRTOS 内核 屏蔽,因此那些对实时性要求严格的任务就可以使用这些优先级,比如四轴飞行器中的壁障检测。

FreeRTOS开关中断

用于开启或关闭中断优先级低于RTOS可管理优先级的外设中断服务

FreeRTOS 开关中断函数为 portENABLE_INTERRUPTS ()和 portDISABLE_INTERRUPTS()

#define portDISABLE_INTERRUPTS() ????vPortRaiseBASEPRI()

#define portENABLE_INTERRUPTS() ?????vPortSetBASEPRI(0)

portDISABLE_INTERRUPTS()是关中断

portENABLE_INTERRUPTS()是开中断

如:configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY = 5;

? ? ? ? TIM3的PRIORITY = 3、TIM5的PRIORITY = 5,那么TIM3不受FreeRTOS管理,中断的开和关于TIM3的中断服务函数无影响,对TIM5有影响。

实验:

任务实现函数

USART1_IRQHandler()函数

中断分组:中断分组为组4,共16个抢占优先级

①设置usart1抢占优先级<=5(及优先级高于5),RTOS的configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY = 5。

现象:在u1中断服务函数中实现接收到数据就printf,在串口调试助手处发送数据,能接收到printf;

②设置u1>=5。

现象:在上述关闭中断开始的5s内,在串口助手发送数据无法接收到printf;

临界段代码

临界段代码也叫做临界区,指必须完整运行、不能被打断的代码段。比如有的外设的初始化需要严格的时序,初始化过程不能被打断。

FreeRTOS进入临界代码段时,需要关闭中断,处理完临界段代码再打开中断

FreeRTOS与临界段代码保护有关的函数有4个:

? ? ? ? 1.任务级临界段代码保护

taskENTER_CRITICAL() ?????任务级进入临界段

taskEXIT_CRITICAL() ????????任务级退出临界段

任务级临界代码保护使用方法如下:

(1)、进入临界区函数中,会关闭中断;

(2)、退出临界区函数中,会开启中断;

进入临界区时,中断会失效,所以临界区代码要精简。

(1)和(2)中间的代码就是临界区代码,注意临界区代码一定要精简!因为进入临界区会关闭中断,这样会导致优先级低于 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断得不到及时的响应。

? ? ? ? 2.中断级临界段代码保护

函数 taskENTER_CRITICAL_FROM_ISR()和 taskEXIT_CRITICAL_FROM_ISR()中断级别临界段代码保护,是用在中断服务程序中的,而且这个中断的优先级一定要低于 configMAX_SYSCALL_INTERRUPT_PRIORITY

taskENTER_CRITICAL_FROM_ISR()????//中断级进入临界段

taskEXIT_CRITICAL_FROM_ISR(x)????//中断级退出临界段,参数x为taskENTER_CRITICAL_FROM_ISR() 返回值

中断级临界代码保护使用方法如下:

//定时器 3 中断服务函数
void TIM3_IRQHandler(void)
{
    if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
    {
        status_value=taskENTER_CRITICAL_FROM_ISR();     //(1)
        total_num+=1;
        printf("float_num 的值为: %d\r\n",total_num);
        taskEXIT_CRITICAL_FROM_ISR(status_value);       //(2)
    }
    TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
}

进入临界区会返回ulReturn,退出临界区代码保护的时候要使用此值!

(1)、进入临界区。

(2)、退出临界区。

参考:(12条消息) FreeRTOS临界区应用与总结_chipsea_mltsum的博客-CSDN博客_freertos临界区

优先级配置建议:

学习疑问:

stm32使用FreeRTOS时任务优先级和中断优先级说明,它们之间有什么联系?

????????1.简单的说,这两者之间没有任何关系,不管中断的优先级是多少,中断的优先级永远高任何任务的优先级,即在执行的过程中,中断来了就开始执行中断服务程序,

? ? ? ? ?2.对应STM32F103、F407来说,中断优先级数值越小,优先级就越高,而FreeRTOS的任务优先级是,任务优先级数值越小,任务优先级越低。
?

stm32:中断优先级,数值越小,优先级越高;共有16个优先级(中断分组4)

FreeRTOS:任务优先级,数值越大,优先级越高;共有32个优先级

参考:

STM32用FreeRTOS时任务优先级和中断优先级说明 - 骑单车去旅行 - 博客园 (cnblogs.com)

(12条消息) FreeRtos 任务优先级和中断优先级_nanjoh的博客-CSDN博客_freertos优先级

感谢参考博文的博主的总结经验,帮助我解惑,能让我少走点弯路。

本人为初学菜鸟,文章如有错误地方,感谢指正!!!

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:59:49  更:2021-07-28 08:00:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:23:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码