RT-Thread系统的SysTick和pendSV的中断优先级

2023-05-16

问题描述:

SysTick和pendSV的中断优先级分别设置为0和15。
SysTick中断用于系统心跳。
pendSV中断用于任务调度。

代码证明:

RT-Thread中设置pendSV中断优先级的代码在cpu文件夹下context_rvds.S的汇编部分,中断优先级设置为15,代码如下:
其中
在这里插入图片描述
汇编代码解释如下:

; set the PendSV exception priority设置PendSV的中断优先级
    LDR     r0, =NVIC_SYSPRI2 ;r0中加载中断优先级寄存器2的地址
    LDR     r1, =NVIC_PENDSV_PRI ; r1中加载设置PendSV中断为低优先级的数据地址
    LDR.W   r2, [r0,#0x00]       ; 读取r0中断优先级寄存器2地址上的数据,存入r2
    ORR     r1,r1,r2             ; r2与r1相或的结果存入r1中
    STR     r1, [r0]             ; 设置PendSV中断优先级为低优先级

查阅手册得知:
PendSV优先级设置寄存器地址为0xe000ed22
SysTick优先级设置寄存器地址为0xe000ed23

这段代码的意思是读取地址为0xe000ed20的连续四个字节的值或上0X00FF0000,然后给0xe000ed20这个地址赋值。
假如首地址为0xe000ed20的连续四个字节的值为0x00000000,那么0xe000ed20地址上的值为0X00,0xe000ed21地址上的值为0X00,0xe000ed22地址上的值为0XFF,0xe000ed23地址上的值为0X00。

SysTick的中断优先级设置在Drivers文件夹下的drv_common.c,优先级设置为0,代码如下:
在这里插入图片描述
程序中两个优先级设置顺序:
在这里插入图片描述
在rtthread_startup()中先调用rt_hw_board_init()设置了systic的优先级(根据参数设置中断优先级寄存器2),后调用rt_system_scheduler_start()函数设置pendSV优先级(如果在汇编中设置了中断优先级寄存器2的高四位值,使systic的优先级低于在rt_hw_board_init()设置的systic的优先级,这段汇编代码会改变systic的优先级为更低优先级,否则不会改变systic的优先级)在调度器启动第一个线程的时候调用rt_hw_context_switch_to()这个函数,进入的汇编代码,改了优先级,调度器启动以后就不会再改变优先级了。

总结为SysTick和pendSV的中断优先级分别设置为0和15,通过MDK软件仿真证明如下:
在这里插入图片描述

中断优先级设置逻辑:

SysTick系统嘀嗒定时器是Cortex内核的部分,尤其对于有实时操作系统的软件,它一般会作为整个系统的时基,所以这个对操作系统非常重要。
在NVIC 有一个专门的寄存器:中断优先级寄存器NVIC_IPRx(在F429 中,x=0…90)用来配置外部中断的优先级,IPR 宽度为8bit,原则上每个外部中断可配置的优先级为
0~255,数值越小,优先级越高。但是绝大多数CM4 芯片都会精简设计,以致实际上支持的优先级数减少,在M4中,只使用了高4bit,如下所示:
在这里插入图片描述
优先级的分组由内核外设SCB 的应用程序中断及复位控制寄存器AIRCR 的PRIGROUP[10:8]位决定,使用NVIC_PriorityGroupConfig()实现:
在这里插入图片描述
优先级设置有HAL_NVIC_SetPriority()函数实现。
中断分为内核中断和外设的中断,配置的寄存器位置不同。外设的中断配置在NVIC的IP内,内核的中断配置在SCB内。

更改SysTick的中断优先级的方法:

1.把汇编部分的NVIC_PENDSV_PRI EQU 0x00FF0000 改为 NVIC_PENDSV_PRI EQU 0xF0F00000 ;这样就可以在第一次启动任务调度的时候把SysTick和pendSV的中断优先级一起改为15。
在这里插入图片描述
2.优先级设置有HAL_NVIC_SetPriority(),更改其中的参数
在这里插入图片描述
在程序运行到rt_system_scheduler_start()时会调用rt_hw_context_switch_to()这个函数进入汇编,如果在汇编中设置了中断优先级寄存器2的高四位值,使systic的优先级低于在HAL_NVIC_SetPriority()设置的systic的优先级,这段汇编代码会改变systic的优先级为更低优先级,否则不会改变systic的优先级。

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

RT-Thread系统的SysTick和pendSV的中断优先级 的相关文章

  • 线程池

    1 线程池的概念 线程池 其实就是一个容纳多个线程的容器 其中的线程可以反复使用 省去了频繁创建线程对象的操作 无需反复创建线程而消耗过多资源 最初是程序员自己开发线程池 用ArrayList
  • C++:std::thread:线程用法

    1 std thread的基本用法 最简单的 std thread用法如下 调用 thread将立即同时开始执行这个新建立的线程 新线程的任务执行完毕之后 main 的主线程也会继续执行 include
  • Win32环境下两种用于C++的线程同步类

    线程同步是多线程程序设计的核心内容 它的目的是正确处理多线程并发时的各种问题 例如线程的等待 多个线程访问同一数据时的互斥 防死锁等 Win32提供多种内核对象和手段用于线程同步 如互斥量 信号量 事件 临界区等 所不同的是 互斥量 信号量
  • QT多线程

    Qt多线程 1 QThread类 QThread类并不是代表一个新的线程 而是QT提供的一个接口 用于控制一个子线程 每个QThread的实例就代表着对一个新线程的一个控制类 对于第一次使用QT多线程的人 或许就会很迷惑很不适应 QThre
  • std::jthread与std::thread区别

    std jthread是C 20新引入的线程类 与 std thread 类似 或者说 jthread是对thread进一步的封装 功能更强大 std jthread的 j实际上是 joining的缩写 众所周知 std thread在其生
  • 03C++11多线程编程之测试join,detach传各种实参时形参的拷贝次数

    03C 11多线程编程之测试join detach传各种实参时形参的拷贝次数 首先我们看下面的总结测试图 然后一步步的测试 1 这里我们先测试join传实参的类型 当实参为普通对象时 1 当形参为普通对象时 拷贝了两次 2 当形参为引用时
  • boost.asio服务器使用io_service作为work pool

    使用io service作为处理工作的work pool 可以看到 就是通过io service post投递一个Handler到io service的队列 Handler在这个io service run内部得到执行 有可能你会发现 io
  • C++:多线程的正确打开姿势

    目的 本例简介c 11中thread库如何创建与停止线程 实现 如下的实例中 通过ThreadWrapper start 方法启动线程 通过ThreadWrapper stop 方法停止线程 线程的主体函数为Thread run 方法 in
  • java之Thread类详细分析(全)

    目录 前言 1 属性值 1 1 线程属性方法 2 常用方法 3 使用方法 前言 Thread是程序中的执行线程 jvm并发地运行多个执行线程 1 属性值 通过查看Thread源码 是继承Runnable接口的实现类 无论使用Runnable
  • C#-Async关键字(异步方法)

    async关键字 异步方法 async关键字是C 特有的 Java没有这玩意 async在C 世界里是上下文关键字 它只有在修饰一个方法的时候才自动被编译器识别为关键字 在代码的其他位置上可以被用作变量名等其他任何用途 async关键字用来
  • 0.net-跨线程使用CSocket

    CSocket断言错误 ASSERT pState gt m hSocketWindow NULL 起因 在套接字处于连接或者发送状态时 试图关闭套接字 于是在这个断言语句处发生中断 原因分析 微软官方解释如下 http support m
  • JAVA多线程--信号量(Semaphore)

    简介 信号量 Semaphore 有时被称为信号灯 是在多线程环境下使用的一种设施 它负责协调各个线程 以保证它们能够正确 合理的使用公共资源 一个计数信号量 从概念上讲 信号量维护了一个许可集 如有必要 在许可可用前会阻塞每一个 acqu
  • Java 线程创建方法

    除了继承Thread 实现Runnable Callable三种创建线程方式外的第四种创建方式 实现java util concurrent ThreadFactory接口 实现newThread Runnable r 方法 这种方式应用于
  • SuspendThread 造成程序死锁的一个例子

    msdn对SuspendThread 的说明 This function is primarily designed for use by debuggers It is not intended to be used for thread
  • surfaceDestroyed什么时候被调用

    今天看别人的代码 突然有个疑问 surfaceDestroyed这个函数什么时候被调用呢 上网搜了一番 基本都说是surface被销毁的时候 才会调用surfaceDestroyed 问题又来了surface什么时候被销毁呢 大家都知道su
  • 使用org.apache.tools.zip包操作文件

    import java io import org apache tools zip import java util Enumeration 功能 zip压缩 解压 支持中文文件名 说明 本程序通过使用Apache Ant里提供的zip工
  • C++11多线程std::thread的简单使用

    文章转载自http blog csdn net star530 article details 24186783 在cocos2dx 2 0时代 我们使用的是pthread库 是一套用户级线程库 被广泛地使用在跨平台应用上 但在cocos2
  • python 图片、文件 通过 request header 多线程下载

    写爬虫过程中发现图片下载比较慢 遂使用多线程下载来提速 import threading import requests class MulThreadDownload threading Thread def init self url
  • 一、使用interrupt()中断线程

    当一个线程运行时 另一个线程可以调用对应的Thread对象的interrupt 方法来中断它 该方法只是在目标线程中设置一个标志 表示它已经被中断 并立即返回 这里需要注意的是 如果只是单纯的调用interrupt 方法 线程并没有实际被中
  • POSIX线程:API

    一 线程创建与取消 1 线程创建 1 1 线程与进程 相对进程而言 线程是一个更加接近于执行体的概念 它可以与同进程中的其他线程共享数据 但拥有自己的栈空间 拥有独立的执行序列 在串行程序基础上引入线程和进程是为了提高程序的并发度 从而提高

随机推荐