【FreeRTOS】【STM32】中断详细介绍

这篇具有很好参考价值的文章主要介绍了【FreeRTOS】【STM32】中断详细介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、三种优先级的概念辨析

本篇文章将对下面三种优先级进行概念辨析:

  • Cortex-M3 内核的中断优先级
  • STM32F1XX 控制器的中断优先级
  • FreeRTOS 的任务的优先级

1. 先理清楚两个概念:CPU 和 MPU

  • “CPU”:“Central Processing Unit”,即中央处理器。它是计算机系统中的主要组件,负责执行指令并进行数据处理和计算。CPU通常由控制单元、算术逻辑单元(ALU)和寄存器等部分组成。

  • “MPU:”“Microprocessor Unit”,微处理器单元。MPU通常用来指代一种单芯片的微处理器,它集成了处理器核心、内存、接口和其他外设等功能,常用于嵌入式系统和嵌入式设备。MPU可以被视为一种较小规模的计算机系统。

2. Cortex-M3 内核与 STM32F1XX 控制器有什么关系

先看看较为官方的解释:

Cortex-M3内核是一种由Arm公司设计的低功耗、高性能的32位RISC处理器内核。它具有较高的执行效率和能效,专门针对嵌入式系统设计。

STMicroelectronics的STM32F1系列是十分流行的Cortex-M3微控制器系列,提供了多个型号和配置选项,包括STM32F103、STM32F107等

简而言之,Cortex-M3 内核是 ARM 这个公司设计的一种 CPU 架构,而 STM32F1XX 控制器是 ST 公司在 CPU 上连接了片上外设、存储器、接口的一种 MPU,也就是 Cortex-M3 芯片
【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS
此图片来自《CM3 权威指南》一书。

3. 优先级的概念辨析

① Cortex-M3 内核和 STM32F1XX 的中断优先级

由于芯片制造商可以对 Cortex-M3 内核进行裁剪(只使用 Cortex-M3 的一部分),所以在内核方面, STM32F1XX 芯片实际上使用了完整的 Cortex-M3 内核的一部分。

所以这两者的优先级是相通的。(注意我使用的是“相通”,而不是“相同”,这意味着 STM32F1XX 芯片的各种设置可以在 Cortex-M3 架构的规定下由芯片厂商灵活自行设计)

② FreeRTOS 的任务的优先级

FreeRTOS 是运行于 STM32 芯片上的操作系统,其任务的优先级决定了设置的各类任务的执行顺序,是任务之间的优先级。

任务之间的优先级限制于 FreeRTOS 框架内,而 FreeRTOS 内核又被限制于 STM32 框架上。

二、 Cortex-M3 内核的中断优先级

(注:以下混合使用“中断”和“异常”这俩个术语,意思一致)

1. 中断编号

  • ARM 为 Cortex-M3 内核 一共设计了 255 个中断,编号为 1~255,而 0 表示没有异常
  • 这里的编号单纯只是这些中断的一个序号,而不是优先级
  • 编号 1-15 是内核中产生的、而 16-255 属于来自内核外

2. 优先级与编号的关系

  • 对于编号为 1-3 的中断,其优先级是固定的,从 -3 到 -1
  • 编号为 4-255 的中断,其优先级都是可以编程的
    【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS
    【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS

3. 优先级配置寄存器

  • Cortex-M3 内核最多可以使用 8 位来表示优先级,共 256 级( STM32F1 使用了 4 位共 16 级)
  • 抢占优先级最多为 128 级
  • Cortex-M3 内核把这 8 位还分成两半,高位的一半配置抢占优先级,低位的一半配置子优先级
    • 当使用 8 位时,至少有 1 位表示子优先级
      【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS

三、STM32F1XX 的中断优先级

1. 中断数量和编号

  • STM32F1XX 只使用了 Cortex-M3 内核中定义的六十几个中断(深色代表内核中断):
    【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS
    【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS
    等等等等
  • 可以看到,编号 0 及以上的中断的优先级都是可编程的

2. 中断优先级配置

  • STM32F1XX 使用了 4 位来表示中断优先级
    • 不管使用多少位,都是 MSB 对齐的
    • 所以实际上是使用优先级配置寄存器的高 4 位进行中断优先级配置
  • 也有抢占优先级和子优先级之分
抢占优先级 子优先级
0 位 4 位
1 位 3 位
2 位 2 位
3 位 1 位
4 位 0 位

三、SVC 和 PendSV 详解

  • “SVC”:SVC是"Supervisor Call"的缩写,也被称为系统服务调用或简称为系统调用。
  • “PendSV”:PendSV是"Pending Supervisor Call"的缩写,用于可悬起系统调用。

1. SVC

① SVC 是什么

用户程序(基于 FreeRTOS 之上的程序)通过 SVC 使用系统服务函数。

一个例子是当启动任务调度器的时候, FreeRTOS 通过 SVC 启动第一个任务,详见:【学习日记】【FreeRTOS】调度器函数实现详解

② SVC 的中断优先级

实际上,在 FreeRTOS 中并未显式配置 SVC 的中断优先级。

我们可以开启调试查看,可以看到默认优先级是 0:
【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS
【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS

③ 使用 SVC 的好处

  1. 操作系统(OS)负责控制具体的硬件,使用户程序从控制硬件的繁文缛节中解脱出来。
  2. OS的代码经过充分的测试,提高系统的健壮性和可靠性。
  3. 用户程序无需在特权级下执行,避免用户程序误操作导致系统瘫痪的风险。
  4. 通过SVC的机制,使用户程序与硬件无关,简化了开发难度和繁琐度,使应用程序跨硬件平台移植成为可能。
  5. 应用程序只需了解操作系统提供的应用编程接口(API),并使用SVC提出请求,而无需了解硬件的操作细节。

2. PendSV

① PendSV 是什么

可悬起的系统调用,顾名思义,是可以像普通的中断一样被悬起的中断。也就是触发后如果优先级不够,会等到时机合适再执行。

在 FreeRTOS 默认配置为优先级最低的 15。

② PendSV 的应用

在 FreeRTOS 中,被用于任务的切换。

在 FreeRTOS 中,我们在 SysTick 中断中触发 PendSV,在 PendSV 进行任务切换。

如果不使用 PendSV 进行任务切换,那么当 SysTick 的优先级不是最低时:

  • 理想情况下,任务A 执行一段时间后进入 SysTick 中断,在 SysTick 中断中进行上下文切换到任务B
    【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS

  • 糟糕的情况是,任务A 执行一段时间后进入了一个中断,在中断中又进入到 SysTick 中断,并在其中尝试上下文切换,也就是切换到主线程中,但是第一个中断还未执行完毕(这会导致 Usage Fault,因为其使中断执行一半就跳会到主线程,如果允许这样做系统将没有实时性的保证)
    【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS
    如果使用了 PendSV,则可以使上下文切换的动作暂时搁置,先执行完中断再进行上下文的切换。

不过,值得深思的是,在 FreeRTOS 的默认配置中, SysTick 的中断优先级被配置为最低的 15,这意味着其不能打断任何的中断,那么使用 PendSV 可能有其他更充分的理由。

四、运行在 STM32 上的 FreeRTOS 中断优先级的配置

1. 中断优先级分组

使用分组 4,也就是 16 级的抢占优先级、0 级的子优先级:

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );

2. FreeRTOS 内核优先级

① 定义

FreeRTOSConfig.h中,由 configKERNEL_INTERRUPT_PRIORITY 定义:

  • configPRIO_BITS:使用 4 位来表示优先级
  • configLIBRARY_LOWEST_INTERRUPT_PRIORITY:配置内核优先级为最低级 15 级
  • configKERNEL_INTERRUPT_PRIORITY:将最低优先级左移,使 MSB 对齐
#define configPRIO_BITS       		4

//中断最低优先级
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			15

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

② 内核优先级的作用范围

那么这个内核优先级究竟是谁在用呢?实际上就是 SysTick 中断和 PendSV 中断在使用。
SysTick 用于时间片轮转、PendSV 用于上下文切换:

#define portNVIC_PENDSV_PRI					( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 16UL )
#define portNVIC_SYSTICK_PRI				( ( ( uint32_t ) configKERNEL_INTERRUPT_PRIORITY ) << 24UL )

/* Make PendSV and SysTick the lowest priority interrupts. */
	portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI;
	portNVIC_SYSPRI2_REG |= portNVIC_SYSTICK_PRI;

3. 临界段保护的中断优先级

① 临界段保护就是关中断

  • 之前提到过 FreeRTOS 的临界段保护,进入临界段也就是关中断。
    【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS

② 如何关中断

  • 关中断是通过写 basepri 进行操作的:
    详情见【学习日记】【FreeRTOS】临界段的保护
static portFORCE_INLINE void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI = configMAX_SYSCALL_INTERRUPT_PRIORITY;

	__asm
	{
		/* Set BASEPRI to the max syscall priority to effect a critical
		section. */
		msr basepri, ulNewBASEPRI
		dsb
		isb
	}
}
  • basepri 是 MSB 对齐(在 STM32F1 中,basepri 是八位的寄存器,可只使用其中某几位,MSB 对齐指最高位对齐,也就是当只使用其中某几位时从最高位开始用,低位不管)用法和优先级配置寄存器类似:
    【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS

  • basepri 设定为大于其值的中断都会被屏蔽(此处的中断优先级指 STM32 的中断优先级而不是 FreeRTOS 我们为任务设定的优先级):
    【FreeRTOS】【STM32】中断详细介绍,RTOS,stm32,嵌入式硬件,单片机,RTOS
    下面是 FreeRTOS 中进入临界段时对 basepri 的设置,设置为 5,也就是 FreeRTOS 进入临界段时,中断优先级 5-15 的中断都被屏蔽:

//系统可管理的最高中断优先级
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5

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

后记

如果您觉得本文写得不错,可以点个赞激励一下作者!
如果您发现本文的问题,欢迎在评论区或者私信共同探讨!
共勉!文章来源地址https://www.toymoban.com/news/detail-669908.html

到了这里,关于【FreeRTOS】【STM32】中断详细介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式学习笔记——STM32的USART收发字符串及串口中断

    上一篇中,介绍了串口收发相关的寄存器,通过代码实现了一个字节的收发,本文接着上面的内容,通过功能函数实现字符串的收发,然后引入中断解决收发过程中while()死等的问题。 根据昨天的字符发送函数,只需要稍作修改即可实现发送函数了,一个字符串的结尾会有一

    2024年02月03日
    浏览(58)
  • 嵌入式开发--STM32用DMA+IDLE中断方式串口接收不定长数据

    之前讲过用 利用IDLE空闲中断来接收不定长数据 ,但是没有用到DMA,其实用DMA会更加的高效,MCU也可以腾出更多的性能去处理应该做的事情。 IDLE顾名思义,就是空闲的意思,即当监测到串口空闲超过1个串口的数据帧时,会使状态寄存器(SR或ISR)的IDLE位置位,如果此时控制

    2024年04月17日
    浏览(52)
  • 【FreeRTOS】FreeRTOS移植stm32详细步骤介绍

    我在查找FreeRTOS移植的相关教程特别少,所以想非常详细的介绍FreeRTOS移植stm32详细步骤,包括源码的下载,源码介绍,系统移植,代码验证等,每一步都有对应的介绍和解释,希望可以帮助到你们。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分

    2024年02月08日
    浏览(33)
  • 【STM32】-串口开发经验分享-基于RTOS+空闲中断

    目录 1. 概述     2.串口介绍 2.1 原理框图 2.2 RS-232C 2.3 RS-422 2.4 RS-485 2.5 UART 3. STM32 USART介绍 4. CubeMx生成Uart初始化代码 4.1 NewProject选择单片机型号 4.2 设置rcc时钟  4.3 设置Usart 4.4 初始化代码 4.5 注意 5 工程源码解析 5.1 程序架构 5.2 源码 fml_ring_buffer.c fml_usart.c app_usart_task.c stm3

    2023年04月16日
    浏览(39)
  • 嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置

    上一篇中,对串口做了个概述,主要是介绍了串口通信的特征,异步串行全双工通信,然后就是结合串口的框图梳理了一下STM32中USART的配置流程以及发送接收数据的流程,本文将接着上篇的内容,对串口的寄存器做个介绍,然后实现一个简单的收发实验。 根据之前GPIO的经验

    2024年02月05日
    浏览(39)
  • 蓝桥杯嵌入式STM32G431RBT6的学习(总大纲)(HAL库学习)板子介绍

    我写蓝桥杯嵌入式大概用到的外设,都是非常常用的。我在这里汇总一下。 蓝桥杯嵌入式基础模块——GPIO的使用(新板)STM32G431(HAL库开发)_薛定谔的猫咪死了的博客-CSDN博客 蓝桥杯嵌入式基础模块——串口的使用(新板)STM32G431(HAL库开发)_薛定谔的猫咪死了的博客-C

    2024年02月02日
    浏览(35)
  • 单片机 嵌入式开发软件介绍对比与推荐(Keil、IAR、VSCode、Clion、STM32CubeIDE)

    单片机 嵌入式开发软件介绍对比与推荐(Keil、IAR、VSCode、Clion、STM32CubeIDE) KEI官网:www.keil.com         Keil与MDK(Microcontroller Development Kit)是同一个软件开发工具套件的不同名称。         Keil是一家德国公司,而MDK是他们开发的一款集成开发环境(IDE),通常称为Keil

    2024年02月06日
    浏览(60)
  • STM32用FreeRTOS串口中断接收卡死问题

    现在意法半导体的配套软件做得很全面了,简直可以说是保姆式的服务。从芯片选型,引脚定义,到代码模板生成,一条龙服务,很方便。但是方便也有方便的坏处,那就是有些细节的规则会造成天然的bug。 比如,在stm32cubeIDE里新建工程的时候,如果勾选了FREERTOS 那么,程序

    2024年02月15日
    浏览(28)
  • stm32 freertos多任务状态迁移,中断临界段,任务延时

    arm中SP,LR,PC寄存器以及其它所有寄存器以及处理器运行模式介绍 特权级与用户级的区别主要是某些寄存器能不能访问与修改: cortex M3/M4内核 特权级与用户级详解 Cortex-M3双堆栈MSP和PSP Cortex-M3双堆栈MSP和PSP M3内核何时使用MSP何时使用PSP? 特权级可以使用MSP 和PSP指针 用户级

    2024年02月12日
    浏览(34)
  • STM32 CubeMX (第三步Freertos中断管理和软件定时)

    学习使用Freertos第三步 在 FreeRTOS 中,中断管理和软件定时: · taskENTER_CRITICAL() ·; 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用 ·

    2024年02月12日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包