| |
|
开发:
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 中 由定义:
可以看到宏 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()
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
中断级临界代码保护使用方法如下:
进入临界区会返回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例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |