FreeRTOS中断管理

2023-11-20

目录

说明:

一、中断基础

1.1、中断理解

1.2、中断执行步骤

1.3、中断寄存器选择位

1.4、中断优先级分类

二、中断优先级分组设置

2.1、分类

2.2、特点

三、中断有关寄存器

3.1、SHPR1寄存器

3.2、SHPR2寄存器

3.3、SHPR3寄存器

3.4、FreeRTOS中配置PendSV、Systick中断优先级步骤

四、FreeRTOS中断管理

4.1、中断有关函数

4.2、中断示例


说明:

1)以下内容多为概念了解与步骤分析

2)暂无个人示例代码,使用的是FreeRTOS的示例代码

3)若想移植代码测试的,请移步其它地方寻找,下文内容暂无个人示例代码供测试

关于其它:

1)操作系统:win 10

2)平台:keil 5 mdk

3)语言:c语言

4)板子:STM32系列移植FreeRTOS

一、中断基础

1.1、中断理解

        让CPU打断正常运行的程序,转而去处理的事件(程序),称为中断。

1.2、中断执行步骤

        1)中断请求,外设产生中断请求(GPIO外部中断、定时器中断);

        2)响应中断,CPU停止执行当前程序,转而去处理中断程序(ISR);

        3)退出中断,返回被中断打断的程序位置,继续执行程序。

1.3、中断寄存器选择位

        1)ARM Cortex-M使用了8位宽的寄存器来配置中断的优先等级,这个寄存器就是中断优先级配置寄存器;
        2)但STM32,只用了中断优先级配置寄存器的高4位[7 : 4](如下图1),所以STM32提供了最大16级的中断优先等级,用于表达优先级没有实现,读回零;

图1

1.4、中断优先级分类

1)STM32的中断优先级可以分为抢占优先级和子优先级

2)抢占优先级:抢占优先级高的中断可以打断正在执行但抢占优先级低的中断

3)子优先级:当同时发生具有相同抢占优先级的两个中断时,子优先级数值小的优先执行

二、中断优先级分组设置

2.1、分类

可以分为5种,如下图2:

图2

2.2、特点

1)低于宏定义configMAX_ SYSCALL INTERRUPT_ PRIORITY优先级的中断里才允许调用FreeRTOS的API函数;

2)建议将所有优先级位指定为抢占优先级位,方便FreeRTOS管理
(调用函数HAL_ NVIC_ SetPriorityGrouping(NVIC PRIORITYGROUP_4)这是HAL库,标准库应该是:NVIC_ SetPriorityGrouping(NVIC PRIORITYGROUP_4)

3)中断优先级数值越小越优先,任务优先级数值越大越优先
 

三、中断有关寄存器

3.1、SHPR1寄存器

寄存器地址:0xE000ED18

3.2、SHPR2寄存器

寄存器地址:0xE000ED1C

3.3、SHPR3寄存器

寄存器地址:0xE000ED20

具体如下图3(来自Cortex M3权威指南(中文)第286页中):

 图3

3.4、FreeRTOS中配置PendSV、Systick中断优先级步骤

1)SHPR3寄存器地址获取,左移16位得到设置PendSV的寄存器地址

2)SHPR3寄存器地址获取,左移24位得到设置Systick的寄存器地址

3)通过一系列赋值,最后一步是进行汇编操作直接赋值给寄存器,进行配置,最后设置出PendSV与Systick的优先级为15,最低优先级

四、FreeRTOS中断管理

4.1、中断有关函数

关中断函数原型:portDISABLE_INTERRUPTS()

如果使用的移植支持 configMAX_SYSCALL_INTERRUPT_PRIORITY( 或 configMAX_API_CALL_INTERRUPT_PRIORITY)常量,那么 taskDISABLE_interrupts 将 禁用所有中断,或在 configMAX_SYSCALL_INTRUPT_PROJECT 设置之前屏蔽(禁用)中断。 检查 taskDISABLE_INTERRUPTS 在使用的移植中的实现。

如果使用的移植不支持 configMAX_SYSCALL_INTERRUPT_PRIORITY 常量, 那么 taskDISABLE_INTERRUPTS() 将对所有可屏蔽的中断进行全局禁用。

通常情况下不会直接调用该宏,而是使用 taskENTER_CRITICAL() 和 taskEXIT_CRITICAL() 来替代。

开中断函数原型:portENABLE_INTERRUPTS()

启用微控制器中断的宏。

通常情况下不会直接调用该宏,而是使用 taskENTER_CRITICAL() 和 taskEXIT_CRITICAL() 来替代。

4.2、中断示例

板子不在身边,无法测试,之后补上。以下是FreeRTOS官方示例:

/* A function that makes use of a critical section. */
void vDemoFunction( void )
{
    /* Enter the critical section.  In this example, this function is itself called
    from within a critical section, so entering this critical section will result
    in a nesting depth of 2. */
    taskENTER_CRITICAL();

    /* Perform the action that is being protected by the critical section here. */

    /* Exit the critical section.  In this example, this function is itself called
    from a critical section, so this call to taskEXIT_CRITICAL() will decrement the
    nesting count by one, but not result in interrupts becoming enabled. */
    taskEXIT_CRITICAL();
}

/* A task that calls vDemoFunction() from within a critical section. */
void vTask1( void * pvParameters )
{
    for( ;; )
    {
        /* Perform some functionality here. */

        /* Call taskENTER_CRITICAL() to create a critical section. */
        taskENTER_CRITICAL();


        /* Execute the code that requires the critical section here. */


        /* Calls to taskENTER_CRITICAL() can be nested so it is safe to call a
        function that includes its own calls to taskENTER_CRITICAL() and
        taskEXIT_CRITICAL(). */
        vDemoFunction();  

        /* The operation that required the critical section is complete so exit the
        critical section.  After this call to taskEXIT_CRITICAL(), the nesting depth
        will be zero, so interrupts will have been re-enabled. */
        taskEXIT_CRITICAL();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS中断管理 的相关文章

  • 作用域和内存问题

    文章目录 一 基本类型和引用类型的值 基本类型和引用类型的区别 1 动态的属性 2 复制变量值 3 传递参数 4 监测类型 二 执行环境及作用域 1 延长作用域链 2 没有块级作用域 一 基本类型和引用类型的值 变量可能包括两种不同的数据类
  • 【Docker】之安装 Redis

    一 下载 Redis 镜像 下载最新版 Redis 镜像 默认版本为 latest docker pull redis 更多版本镜像 1 访问 Docker 官网 https hub docker com 在镜像搜索栏中输入 Redist

随机推荐

  • flea-auth使用之用户子模块介绍

    用户子模块 本篇主要介绍笔者 授权模块 flea auth 下的用户子模块 1 总览 表名 中文描述 flea account 账户 flea account attr 账户扩展属性 flea user 用户 flea user attr
  • libevent的消息传递和回调注册函数

    参考原帖地址 https www cnblogs com secondtonone1 p 5554075 html 1 evconnlistener new bind函数 1 evconnlistener new bind 完成socket
  • JDK8下载安装

    参考 JDK8下载安装教程 涵涵想养猫的博客 CSDN博客 jdk8下载安装 下载地址 https www oracle com java technologies javase javase jdk8 downloads html 根据需
  • python 中 os._exit(), sys.exit()

    1 os exit 不抛异常 后面的代码就不执行了 不执行相关清理工作 直接退出 Python 解释器一般来说用在子线程中退出 2 sys exit 引发一个 SystemExit 异常 没有捕获这个异常 会直接退出 捕获这个异常可以做一些
  • 软考:中级软件设计师:程序语言基础:表达式,标准分类,法律法规,程序语言特点,函数传值传址

    软考 中级软件设计师 程序语言基础 表达式 提示 系列被面试官问的问题 我自己当时不会 所以下来自己复盘一下 认真学习和总结 以应对未来更多的可能性 关于互联网大厂的笔试面试 都是需要细心准备的 1 自己的科研经历 科研内容 学习的相关领域
  • 禁止ios浏览器页面上下滚动 (橡皮筋效果)弹性滚动 微信的下拉回弹

    发现之前阻止页面滚动的代码e preventDefault代码失效了 于是自己折腾了一番 找到了解决办法 一 前言 浏览器在移动端有一个默认触摸滚动的效果 让我们感触最深的莫过于微信浏览器里面 下拉时自带橡皮筋的效果 然而在开发的时候我们经
  • 软件测试日常分享

    以下是测试主管 测试经理 质量保证经理的面试问题和答案 供新人和有经验的求职者获得他们梦想的工作 1 测试经理的职责是什么 QA经理的角色包括 从启动到结束管理项目 测试计划 获得客户对交付成果的认可 向客户端批准中间交付物和补丁发布 提交
  • 动手学深度学习——softmax回归(原理解释+代码详解)

    目录 1 softmax回归 1 1 分类问题 1 2 网络架构 1 3 全连接层的参数开销 1 4 softmax运算 1 5 小批量样本的矢量化 1 6 损失函数 1 6 1 对数似然 1 6 2 softmax及其导数 1 6 3 交
  • 算法导论 学习笔记 第七章 快速排序

    快排最坏时间复杂度为 n 但它的平均性能很好 通常是实际排序应用中最好的选择 它的期望时间复杂度为 nlgn 且 nlgn 中隐含的常数因子非常小 且它还能进行原址排序 快排也使用了分治思想 1 分解 数组被划分为两个子数组 使得一个子数组
  • 服务器如何开多个虚拟机,服务器运行多个虚拟机

    服务器运行多个虚拟机 内容精选 换一换 通过内网连接云手机实例时 需要在租户VPC中创建一台弹性云服务器 作为连接云手机的跳板机器 若创建云手机服务器时未使用自定义网络 还需在云手机租户的VPC和服务器所在VPC之间建立对等连接 如图1所示
  • SpringBoot集成Netty时在Handler类中注入service和dao为null

    最近在做一个服务器接收客户端消息 之前一直都只接触web开发 第一次接触服务器开发 接触到Netty 但在Netty的Handler类里注入为null public class HttpRequestHandler extends Simp
  • 【vue3练习 -12】vue3使用readonly(),shallowReadonly()

    作用 把一个响应式 可以是ref定义的 也可以是reactive定义的 的数据变成只读的 不可以修改 使用场景 假如你的组件有个数据 但是你不希望在使用的时候修改他就可以把他变成只读的 用法示例 import readonly shallo
  • SOLO算法解读

    论文 SOLO Segmenting Objects by Locations 论文链接 https arxiv org abs 1912 04488 代码链接 GitHub WXinlong SOLO SOLO and SOLOv2 fo
  • 安全之安全(security²)博客目录导读

    研究方向 安全之安全 研究内容 ARM RISC V安全架构 TF A TEE之安全 GP安全认证 静态代码分析 FUZZ模糊测试 IDA逆向分析 安全与功耗等 欢迎您的关注 一 ARM安全架构 1 ARM安全架构及其发展趋势 转载 2 A
  • uc同步登陆同步退出

    几乎每个应用在整合UC的时候都会遇到无法同步登陆同步退出的情况 今天分析下原因 首先我们的项目会将uc client这个文件夹原封不动的拷贝到项目根目录 public function inteLogin loginname passwor
  • 从零开始学Python(一)基本变量与数据类型

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于Python的相关操作吧 目录 Welcome Huihui s Code World 一 关于Python的基本知识 变量 注释 二 数据类型 1 强类型
  • 蝴蝶效应,青蛙现象,鳄鱼法则,鲇鱼效应,羊群效...

    标题 蝴蝶效应 青蛙现象 鳄鱼法则 鲇鱼效应 羊群效应 刺猬法则 手表定律 破窗理论 二八定律 木桶理论 马太效应 这些你都明白吗 1 蝴蝶效应 上个世纪70年代 美国一个名叫洛伦兹的气象学家在解释空气系统理论时说 亚马逊雨林一只蝴蝶翅膀偶
  • pycharm快捷键及一些常用设置

    Alt Enter 自动添加包 shift O 自动建议代码补全 Ctrl t SVN更新 Ctrl k SVN提交 Ctrl 注释 取消注释 选择的行 Ctrl Shift F 高级查找 Ctrl Enter 补全 Shift Enter
  • 安装ThinkPHP5.1并在框架中使用FFmpeg视频处理工具遇到的问题和解决办法

    一 安装ThinkPHP5 1框架 问题一 安装方法有很多 我这里使用composer安装的 但是遇到了问题 出现了报错 安装方法可是查看 https www kancloud cn manual thinkphp5 1 353948 co
  • FreeRTOS中断管理

    目录 说明 一 中断基础 1 1 中断理解 1 2 中断执行步骤 1 3 中断寄存器选择位 1 4 中断优先级分类 二 中断优先级分组设置 2 1 分类 2 2 特点 三 中断有关寄存器 3 1 SHPR1寄存器 3 2 SHPR2寄存器