FreeRTOS学习笔记<中断>

2023-11-07

中断概念

Cortex-M的NVIC最多支持240个IRQ(中断请求)、1个不可屏蔽中断(NMI)、1个Systick(滴答定时器)定时器中断和多个系统异常

Cortex-M处理器有多个用于管中断和异常的可编程寄存器, 这些寄存器大多数都在 NVIC和系统控制块 (SCB)中, CMSIS将这些寄存器定义为结构体。以 STM32F103为例,打开core_cm3.h,有两个结构体, NVIC_Type和 SCB_Type。NVIC和SCB都位于系统控制空间(SCS)内,SCS的地址从0XE000E000开始。

对于FreeRTOS比较关注的是三个中断屏蔽寄存器:PRIMASK、FAULTMASK和BASEPRI

优先级

Cortex-M处理器有三个固定优先级和256个可编程优先级,最多128个抢占优先级(因为抢占式最多只能占7bit,留一个给子优先级),但实际的优先级数量是由芯片决定的,大多数为8、16、32级等,比如STM32只有16级(这里用了4bit,所以2的4次是16),在设计芯片时会裁掉表达优先级低几位,下面是STM32使用Cortex-M的高四位表示优先级:

使用4位表达优先级
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
用于表达优先级 没有实现,读回0
STM32支持的5组优先级
优先级分组 抢占优先级 子优先级 描述
NVIC_PriorityGroup_0 0 0-15 主-0bit,子-4bit
NVIC_PriorityGroup_1 0-1 0-7 主-1bit,子-3bit
NVIC_PriorityGroup_2 0-3 0-3 主-2bit,子-2bit
NVIC_PriorityGroup_3 0-7 0-1 主-3bit,子-1bit
NVIC_PriorityGroup_4 0-15 0 主-4bit,子-0bit

移植FreeRTOS只能配置组4(只有抢占优先级),因为FreeRTOS中断处理没有子优先级这种情况

优先级设置

每个外部中断都有一个对应的优先级寄存器,每个寄存器占8bit,最大宽度8bit,最小3bit。4个相邻的寄存器可以拼成一个32bit寄存器。在FreeRTOS设置PendSV和Systick的中断优先级的时候都是直接操作地址0xE000ED20

 FreeRTOS中断的屏蔽和开启

(1)FreeRTOS在STM32中中断关闭调用 BASEPRI寄存器。

①只屏蔽优先级低于某一个阈值的中断
1)MOV R0, #0X60
2)MSR BASEPRI, R0

②开启中断
1)FreeRTOS中开启中断是通过对BASEPRI寄存器写0进行的
2)MOV R0, #R0
3)MSR BASEPRI, R0

portENABLE_INTERRUPTS ()//开中断

portDISABLE_INTERRUPTS()//关中断

FreeRTOS中断配置宏

configPRIO_BITS

设置MCU使用几位优先级,STM32使用4位

configLIBRARY_LOWEST_INTERRUPT_PRIORITY

设置最低优先级,因为STM32使用了4bit,这里也配置了组4,所以只有抢占优先级0-15,这里15就是最低优先级。

configKERNEL_INTERRUPT_PRIORITY

用来设置内核中断优先级,主要是PendSV和Systick中断优先级,这里设置为0xF0(最低优先级是configLIBRARY_LOWEST_INTERRUPT_PRIORITY==15,即0x0F,这里要左移4位,得到0xF0),最低的中断优先级。这里写0xFF也行

configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

设置FreeRTOS系统可管理的最大优先级,就是BASEPRI寄存器的阈值。现在的范围是0~15,如果设置为5,也就是高于5的优先级(0~5)不归FreeRTOS管理。

configMAX_SYSCALL_INTERRUPT_PRIORITY

是configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY左移4bit来的,低于configKERNEL_INTERRUPT_PRIORITY设置好的阈值,可以安全调用FreeRTOS的API函数,但未被FreeRTOS管理的中断是不能禁止的(就是调用FreeRTOS开关中断时,对这些中断不受影响),其中断函数不能调用FreeRTOS的API函数

临界段代码

指必须完整运行,不能被打断的代码(代码要保证精简),比如有的初始化过程不能被打算。一般都是采用开关中断的方式。FreeRTOS在进入临界段代码时需要关闭中断,处理完临界段代码再打开中断。分以下两种:

任务级临界段代码保护

taskENTER_CRITICAL()和 taskEXIT_CRITICAL()是任务级的临界代码保护,一个进入是任务级的临界段,一个是退出临界段,成对使用。可能会发生临界段嵌套,所以看源码需要一个全局变量uxCriticalNesting++;来保证成对使用。

中断级临界段代码保护

 taskENTER_CRITICAL_FROM_ISR()和 taskEXIT_CRITICAL_FROM_ISR()

在中断服务程序使用的

这个中断服务程序的优先级一定要低于configMAX_SYSCALL_INTERRUPT_PRIORITY,因为高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断不能调用FreeRTOS的API,避免造成系统紊乱。

以 “FromISR” 结尾的 FreeRTOS 函数是具有中断调用保护的(执行这些函数会进入临界区),但是就算是这些函数,也不可以被逻辑优先级高于                 configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断服务函数调用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习笔记<中断> 的相关文章

  • 【FreeRtos学习笔记】STM32 CubeMx——Timers(定时器)

    目录 1 软件定时器 2 示例程序 2 1 例程功能 2 2 步骤 2 3 实验结果 2 4 函数讲解 1 软件定时器 定时器是MCU常用的外设 我们在学习各种单片机时必然会学习它的硬件定时器 但是 MCU自带的硬件定时器资源是有限的 而且
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)

    STM32F103移植FreeRTOS必须搞明白的系列知识 1 Cortex CM3中断优先级 STM32F103移植FreeRTOS必须搞明白的系列知识 2 FreeRTOS任务优先级 STM32F103移植FreeRTOS必须搞明白的系
  • FreeRTOS 软件定时器的使用

    FreeRTOS中加入了软件定时器这个功能组件 是一个可选的 不属于freeRTOS内核的功能 由定时器服务任务 其实就是一个定时器任务 来提供 软件定时器是当设定一个定时时间 当达到设定的时间之后就会执行指定的功能函数 而这个功能函数就叫
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • 【FreeRTOS开发问题】FreeRTOS内存溢出

    FreeRTOS内存溢出 如下图所示 FreeRTOS编译完成后可以看到 系统提示无法分配内存到堆 Objects Template axf Error L6406E No space in execution regions with A
  • freertos---软定时器

    一 软件定时器介绍 freeRTOS软件定时器的时基是基于系统时钟节拍实现的 可以创建很多个 在硬件定时器资源不充足的情况下非常有用 软件定时器一般用作周期性地执行函数 在创建软件定时器时指定软件定时器的回调函数 在回调函数中实现相应的功能
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV
  • FreeRTOS打印任务对CPU的占有率

    1 配置RTOS 1 打开RTOS Config Parameter 找到Run Time And Task States gathering related definitions 使能GENERATE RUN TIME STATS US
  • freeRTOS手册 第六章 . 中断管理

    如果我对本翻译内容享有所有权 允许任何人复制使用本文章 不会收取任何费用 如有平台向你收取费用与本人无任何关系 第六章 中断管理 章节介绍和范围 事件 嵌入式实时系统必需对环境中的事件做出响应 比如 外部网络设备收到一个发送给TCP IP栈
  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • freeRTOS使用uxTaskGetStackHighWaterMark函数查看任务堆栈空间的使用情况

    摘要 每个任务都有自己的堆栈 堆栈的总大小在创建任务的时候就确定了 此函数用于检查任务从创建好到现在的历史剩余最小值 这个值越小说明任务堆栈溢出的可能性就越大 FreeRTOS 把这个历史剩余最小值叫做 高水位线 此函数相对来说会多耗费一点
  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • FreeRTOS:中断配置

    目录 一 Cortex M 中断 1 1中断简介 1 2中断管理简介 1 3优先级分组定义 1 4优先级设置 1 5用于中断屏蔽的特殊寄存器 1 5 1PRIMASK 和 FAULTMASK 寄存器 1 5 2BASEPRI 寄存器 二 F
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • FreeRTOS学习笔记(8)---- 软件定时器

    使用FreeRTOS软件定时器需要在文件FreeRTOSConfig h先做如下配置 1 configUSE TIMERS 使能软件定时器 2 configTIMER TASK PRIORITY 定时器任务优先级 3 configTIMER
  • FreeRTOS笔记(二)

    FreeRTOS笔记 二 静态任务 文章目录 FreeRTOS笔记 二 静态任务 一 任务定义 二 任务创建 2 1 定义任务栈 2 2 定义任务函数 2 3 定义任务控制块 2 4 实现任务创建函数 三 实现就绪列表 3 1 定义就绪列表
  • STM32 Freertos 添加 外部sram heap_5.c

    1 添加外部SRAM 初始化 2 添加heap 5 c 3 初始化heap 5 c 外部堆栈 Define the start address and size of the two RAM regions not used by the
  • 再论FreeRTOS中的configTOTAL_HEAP_SIZE

    关于任务栈和系统栈的基础知识 可以参考之前的随笔 FreeRTOS 任务栈大小确定及其溢出检测 这里再次说明 define configTOTAL HEAP SIZE size t 17 1024 这个宏 官方文档解释 configTOTA
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • pandas apply使用多列计算生成新的列

    在python数据分析中 有时需要根据多列数据生成中间结果 pandas给我们带来了很多方便 通常简短的代码可以实现一些高级功能 灵活掌握一些技巧可以事倍功半 pandas的apply方法用于对指定列的每个元素进行相同的操作 下面生成一个d
  • 静态代码分析工具清单:开源篇(各语言)

    本文是一个静态代码分析工具的清单 共有26个工具 包括4个 NET工具 2个Ada工具 7个C 工具 4个Java工具 2个JavaScript工具 1个Opa工具 2个Packaging工具 3个Perl工具 1个Python工具 1 N
  • Python——列表排序和赋值

    1 列表排序 列表排序方法 ls sort 对列表ls 中的数据在原地进行排序 ls 13 5 73 4 9 ls sort ls sort reverse False 默认升序 reverse True 降序 ls 13 5 73 4 9
  • Mysql备份工具xtraback全量和增量测试

    Mysql备份工具xtraback全量和增量测试 xtrabackup 是 percona 的一个开源项目 可以热备份innodb XtraDB 和MyISAM 会锁表 官方网址http www percona com docs wiki
  • 系统运维日常工作有哪些,应该具备哪些技能

    一 日常工作内容 看监控 网站流量 CDN流量 看邮件有没有普通业务监控报警 看有家中有没有其他需要做的工作 处理报警 查看报警的原因 和开发一起解决 并且尽量找出避免再次发生的方法 例如添加一些定时清理脚本 处理发布 基本都是自动化 但是
  • 使用tab键分割的文章能快速转换成表格。( )_Word教程:最常用的 7 个 Tab 键用法,瞅一眼就会了...

    Tab键一直是键盘上 不起眼 的一个按键 平时很多人可能不会去碰触这个键 实际上 它有很多实用的功能 如果用好了 可以大大提高我们的操作效率 01 段首空两格 写文章时 通常段首需要空两格 许多人会直接敲空格 这种操作是很Low的 其实 你
  • git cherry-pick apply-merge 任意commit(s)

    文章目录 必杀技 困惑 cherry pick 必杀技 是什么让Git 从众多版本控制系统中脱颖而出 独领风骚 当然是其分支模型 正因如此 人称分支模型为Git的 必杀技 如果不能熟练的运用Git的分支技巧 那就远离了Git的精华 困惑 我
  • zabbix配置微信报警

    如有错误 敬请谅解 此文章仅为本人学习笔记 仅供参考 如有冒犯 请联系作者删除 6 1 注册企业微信 企业微信注册地址 https work weixin qq com 设置总部门名称添加成员 也可以成员扫码加入 点击 成员加入 过程略 6
  • C语言实现RGB888转BMP格式图片功能

    1 bmp格式介绍 bmp格式图片里实际存储的也是RGB原始数据 可以分为8bit 16bit 24bit 32bit的bmp格式 也就是指bmp图片中保存的RGB是用8bit 16bit 24bit 32bit来表示 简单理解就是在原始R
  • 2020年IT技术的发展趋势!

    在IT范畴 企业指导者在IT范畴做出的选择不只会对业务开展和客户关系产生影响 也会对整体经济产生影响 而整体经济越来越依赖于为关键业务提供牢靠效劳的企业网络 随着岁末年初的到来 如今是瞻望将来一年行业开展趋向的时分 以便企业为做出明智的决议
  • 1054 求平均值

    1054 求平均值 20 分 本题的基本要求非常简单 给定 N 个实数 计算它们的平均值 但复杂的是有些输入数据可能是非法的 一个 合法 的输入是 1000 1000 区间内的实数 并且最多精确到小数点后 2 位 当你计算平均值的时候 不能
  • 手写Mybatis

    Mybatis核心配置文件就是为了配置Configration 因此要首先会解析Mybatis核心配置文件 首先使用dom4J解析Mybatis核心配置文件 新建模块演示dom4j解析 xml 目录放错了 无所谓 引入依赖 从原来项目可以拷
  • MMDrawerController(0.6.0) 文档翻译(简介,非API文档)

    Mutual Mobile Drawer Controller 随着使用抽屉效果的应用越来越多 MMDrawerController应运而生 MMDrawerController是一个仅支持侧边抽屉导航的轻量级库 同时库中还提供了定制展现
  • QListWidget 关闭滚动条,用鼠标拖动QListWidget进行滚动

    效果如下 采用QListWidget显示候选词 然后鼠标可以点击左键进行拖动 实现代码如下 m ListWidget new QListWidget m backgroud m ListWidget gt setViewMode QList
  • SQLite下载历史版本

    SQLITE 指定版本下载 下载地址 SQLite Tags step1 挑选版本 以3 30 1为例 step2 进入下载链接 选则为Classic View 点击18db032d step3 选择下载版本则可
  • 一些servlet的代码

    一些servlet的代码 添加数据 WebServlet name AddServlet value AddServlet public class AddServlet extends HttpServlet StudentService
  • 3.2 回溯法—N皇后问题

    1 问题描述 在 n n n times n n n的棋盘上摆放 n n n个皇后 使任意两个皇后都不能处于同一行 同一列或同一斜线上 2 问题
  • uniapp 跳转支付宝支付

    saId 作用 20000123 支付宝收款码 10000007 支付宝扫一扫 let authUrl alipays platformapi startapp saId 10000007 qrcode decodeURI res code
  • 华为机试 放苹果

    题解 动态规划 采用dp i j 表示 i个苹果放入j个盘子的不同分法数 状态转移 我们首先要明确一点 j个苹果放入i个盘中中 总共有下列两种情况 盘子全部放满 至少有一个盘子不放 为空 一 当i gt j 时 也就是苹果数多于盘子数时 1
  • FreeRTOS学习笔记<中断>

    中断概念 Cortex M的NVIC最多支持240个IRQ 中断请求 1个不可屏蔽中断 NMI 1个Systick 滴答定时器 定时器中断和多个系统异常 Cortex M处理器有多个用于管中断和异常的可编程寄存器 这些寄存器大多数都在 NV