PendSV中断服务函数

2023-05-16

之前在系统滴答定时器中断服务函数中调用API函数xPortSysTickHandler(),xPortSysTickHandler()函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中断,具体PendSV中断服务函数是 PendSV_Handler,并且任务切换的具体任务是在PendSV中断服务函数中完成的,都是拿汇编写的,简单看一下。

PendSV中断服务函数

#define xPortPendSVHandler 	PendSV_Handler 

_asm void xPortPendSVHandler( void )
{
	extern uxCriticalNesting;
	extern pxCurrentTCB;
	extern vTaskSwitchContext;

	PRESERVE8

	mrs r0, psp
	isb
	/* Get the location of the current TCB. */
	ldr	r3, =pxCurrentTCB
	ldr	r2, [r3]

	/* Is the task using the FPU context?  If so, push high vfp registers. */
	tst r14, #0x10
	it eq
	vstmdbeq r0!, {s16-s31}

	/* Save the core registers. */
	stmdb r0!, {r4-r11, r14}

	/* Save the new top of stack into the first member of the TCB. */
	str r0, [r2]

	stmdb sp!, {r3}
	mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY
	msr basepri, r0
	dsb
	isb
	bl vTaskSwitchContext  //在此处 调用函数vTaskSwitchContext() ,该函数用来获取下一个要运行的任务,并将 pxCurrentTCB更新为这个要运行的任务。
	mov r0, #0
	msr basepri, r0
	ldmia sp!, {r3}

	/* The first item in pxCurrentTCB is the task top of stack. */
	ldr r1, [r3]
	ldr r0, [r1]

	/* Pop the core registers. */
	ldmia r0!, {r4-r11, r14}

	/* Is the task using the FPU context?  If so, pop the high vfp registers
	too. */
	tst r14, #0x10
	it eq
	vldmiaeq r0!, {s16-s31}

	msr psp, r0
	isb
	#ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */
		#if WORKAROUND_PMU_CM001 == 1
			push { r14 }
			pop { pc }
			nop
		#endif
	#endif

	bx r14  //至此,任务切换成功。
}

查找下一个要运行的任务

在PendSV中断服务函数中调用了函数vTaskSwitchContext()来获取下一个要运行的任务,也就是查找已经就绪了的优先级最高的任务,缩减后(去掉条件编译)后的函数源码:

void vTaskSwitchContext( void )
{
	if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE )  //如果调度器被挂起
	{
		/* The scheduler is currently suspended - do not allow a context
		switch. */
		//调度器被挂起就不能进行任务切换
		xYieldPending = pdTRUE;  //当xYieldPending为pdTRUE时代表不进行任务切换;
	}
	else
	{        //调度器没有被挂起,
		xYieldPending = pdFALSE; //xYieldPending赋值为pdFALSE时进行任务切换;
		traceTASK_SWITCHED_OUT();//在选择运行任务之前调用。pxcurrenttcb保存一个指针,指向正在关闭的任务的任务控制块;

	
		/* Check for stack overflow, if configured. */
		taskCHECK_FOR_STACK_OVERFLOW(); //检查堆栈溢出(如果已配置)

		/* Select a new task to run using either the generic C or port
		optimised asm code. */
		taskSELECT_HIGHEST_PRIORITY_TASK();//调用该宏来获取下一个要运行的任务,即获取就绪列表的最高优先级任务列表中的下一个列表项,将列表项所对应的任务控制块赋值给pxcurrenttcb,就确定了下一个运行的任务;
		traceTASK_SWITCHED_IN();//在选择要运行的任务后调用。pxcurrenttcb保存指针到选定任务的任务控制块;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PendSV中断服务函数 的相关文章

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

    问题描述 xff1a SysTick和pendSV的中断优先级分别设置为0和15 SysTick中断用于系统心跳 pendSV中断用于任务调度 代码证明 xff1a RT Thread中设置pendSV中断优先级的代码在cpu文件夹下con
  • 一图理解M0不同优先级中断及Pendsv切换

  • 有了Systick中断为什么还要PendSV中断?

    文章目录 问题 xff1a 原因 xff1a 1 在SysTick中断里完成任务切换会降低操作系统的实时性 xff1a 2 把systick优先级设置为最高把PendSV设置为最低的好处 xff1a 3 结语 xff1a 问题 xff1a
  • 怎样去理解异常SVC和PendSV

    目录 什么是SVC和PendSV 什么是SVC和PendSV SVC xff08 系统服务调用 xff09 和 PendSV xff08 可悬挂系统调用 xff09 它们多用于在操作系统之上的软件开发中 SVC 用于产生系统函数的调用请求
  • FreeRTOS记录(三、RTOS任务调度原理解析_Systick、PendSV、SVC)

    RTOS的任务调度原理和所使用的内核中断 寄存器息息相关 文中截图大多是 Cortex M3与Cortex M4权威指南 翻译版本里面的内容 需要对内核有一定的了解 xff0c 本文尽量用简单的描述表达清楚 虽然是FreeRTOS的记录 x
  • UC/OS-III学习——触发PendSV中断

    UC OS III学习 触发PendSV中断 前言一 关于PendSV的基础知识二 代码1 c语言2 汇编语言 前言 PendSV典型使用场合是在上下文切换时 xff08 在不同任务之间切换 xff09 本文主要介绍触发PendSv中断的两
  • 【FreeRTOS】3. PendSV异常

    PendSV异常 问题 xff1a 怎么触发PendSV异常 xff1f 何时使用MSP何时切换PSP xff1f PendSV如何实现上下文切换 xff1f 1 触发PendSV异常 在RTOS内核中 xff0c 任务切换的原理是 xff
  • uCOS上下文切换,PendSV中断函数

    摘自 xff1a http www stmcu org module forum thread 384142 1 1 html 介绍一 xff1a 移植详解1和2中主要讲了移植需要用到的基础知识 xff0c 本文则对具体的移植过程进行介绍
  • 【stm32】 OS 支持特性之 PendSV 异常和 SVC异常

    1 SVC和PENDSV 基本概念 SVC xff08 系统服务调用 xff0c 亦简称系统调用 xff09 和 PendSV xff08 可悬起系统调用 xff09 xff0c 它们多用于在操作系统之上的软件开发中 SVC 用于产生系统函
  • 三、任务切换之PendSV异常

    文章目录 PendSV异常1 没有PendSV异常的任务切换2 有PendSV异常的任务切换2 1 系统调用引起的任务切换2 2 systick中断引起任务切换2 3 PendSV异常处理函数2 4 寻找下一个要运行的任务2 5 时间片调度
  • 手写RTOS-PendSV中断

    今天这一篇 xff0c 我们说一下操作系统都要用到的PendSV中断 xff0c 整个操作系统中 xff0c 要自己写的的汇编代码不超过20行 xff0c 全部都在PendSV中断里 以下是 Cotex M3权威指南 里对PendSV的描述
  • 手写RTOS-使用PendSV进行压栈与出栈操作

    学会使用PendSV中断进行压栈和出栈操作 xff0c 是实现任务调度的关键 今天我们就来学习一下如何使用不超过20行的汇编实现压栈和出栈操作 我们现在来实现这么一个例子 xff1a 先把R4 R11通用寄存器的值保存到一个缓冲区里面 xf
  • FreeRTOS操作系统如何设置的PendSV和SysTick优先级

    首先应该明确PendSV和SysTick的优先级应该设置为最低 xff0c 具体原因参见这一篇博客 PendSV功能 xff0c 为什么需要PendSV 设置优先级在函数port c中的xPortStartScheduler 函数中实现的
  • 中断及pendSV

    1 概述 通过任务及任务切换一节读者已经了解了任务切换的详细过程 其实要实现任务切换的功能前面讲的还远远不够 因为 PSP的操作必须在特权模式下 而用户的程序是工作在线程模式下的 所以 用户要想实现任务的切换功能就必须想办法让CPU工作在特
  • FreeRTOS的学习(十四)——PendSV异常

    FreeRTOS的学习系列文章目录 FreeRTOS的学习 xff08 一 xff09 STM32上的移植问题 FreeRTOS的学习 xff08 二 xff09 任务优先级问题 FreeRTOS的学习 xff08 三 xff09 中断机制
  • stm32f103——中断——UART中断服务函数

    在程序中 xff0c CPU对外界突发事件进行处理的方式又两种 xff1a 1 轮询系统 xff1a xff08 在main中 xff0c 使用while循环 xff0c 进行循环判断外界事物是否发生 xff09 while xff08 1
  • STM32、FreeRTOS—— SVC 和 PendSV

    问 I went through the xTaskStartSechudler function which ends up triggering the SVC instruction and i came to know that i
  • xos详解5:PendSV_Handler

    PendSV Handler PendSV Handler LDR R2 61 OSTcbCurr 不必关中断 嵌套中断发生时会自动保存 R0 R3 到 MSP 并恢复 LDR R0 R2 如果发生咬尾的多个 PendSV xff0c 上半
  • SVC和PendSV

    转载于 xff1a http book 2cto com 201209 4625 html 1 xff0e SVC SVC xff08 Supervisor Call xff09 指令用于产生一个SVC异常 它是用户模式代码中的主进程 xf
  • 2.PendSV的触发

    PendSV典型使用场合是在上下文切换时 xff08 在不同任务之间切换 xff09 我们先简单的写几段代码实现PendSV的中断触发 xff0c 当然也会涉及到CM3内核汇编指令 xff0c 自从开始挑战的那天起 xff0c 你不如地狱谁

随机推荐

  • ttf文件结构解析

    TrueType字体通常包含在单个TrueType字体文件中 xff0c 其文件后缀为 TTF OpenType字体是以类似 于TrueType字体的格式编码的POSTSCRIPT字体 OPENTYPE字体使用 OTF文件后缀 OPENTY
  • centos卸载软件三种方式

    1 我们来卸载用yum安装的软件 xff1a yum remove 软件名字 xff1b 2 如果是用rpm包安装的软件呢 xff0c 则使用如图命令进行卸载 xff1b rpm e 软件名 xff1b 3 如果是用tar包安装的软件呢 x
  • Pycharm设置http代理

    1 Pycharm设置 2 urllib下载数据配置 span class token keyword from span urllib span class token punctuation span error span class
  • Docker 配置网络代理

    有时因为网络原因 xff0c 比如公司 NAT xff0c 或其它啥的 xff0c 需要使用代理 Docker 的代理配置 xff0c 略显复杂 xff0c 因为有三种场景 但基本原理都是一致的 xff0c 都是利用 Linux 的 htt
  • 安装 OpenVPN 客户端

    安装 OpenVPN 客户端 yum y span class token function install span epel release yum y span class token function install span op
  • 字符串-字符串匹配

    Leetcode 28题 1 题目描述 Given two strings needle and haystack return the index of the first occurrence of needle in haystack
  • pip无法安装包到新创建的虚拟环境下面,安装包冲突

    第1步 xff1a 查看安装包的路径 span class token punctuation span label studio span class token punctuation span user 64 master pytho
  • 数组-二分查找

    1 Search a 2D Matrix 1 1 题目描述 span class token comment You are given an m x n integer matrix matrix with the following t
  • 渗透测试工具学习笔记(1)——netcat(nc)

    v 显示详细输出内容 n 跟IP地址 xff0c 不进行DNS解析 l 打开一个listen端口 p 端口号 q n 当标准输出完成后延迟n秒断开 z 扫描模式 xff0c 不做I O操作 1 telnet banner nc vn ip地
  • 渗透测试工具学习笔记(2)——netcat(ncat)

    nc的缺点 xff1a nc缺乏加密和身份验证的能力 ncat包含于nmap工具包中 allow 允许连接的IP地址 A ncat c bash allow 192 168 20 14 vnl 333 ssl 用ssl加密 B ncat n
  • 渗透测试工具学习笔记(3)——wireshark

    manjaro安装GUI版本 xff1a yaourt S wireshark qt 需用sudo wireshark图形化版本以顺利使用全部功能 抓包嗅探协议分析 安全专家必备的技能 抓包引擎 Libpcap9 Linux Winpcap
  • PostgreSQL操作

    一 进入PostgreSQL数据库 Linux下切换到postgres用户 xff0c 执行psql即可进入 span class token function su span postgres bash 4 4 psql 此时就进入pos
  • 渗透测试工具学习笔记(4)——tcpdump

    no GUI的抓包分析工具 Linux Unix系统默认安装 说是这么说但是manjaro下没有 xff0c pacman一下即可 抓包 xff1a 默认只抓68个字节 i interface s snaplen 大小 w file tcp
  • 渗透测试工具学习笔记(5)——dradis、keepnote、truecrypt

    过程文档记录工具 1 dradis 导入导出扫描器日志 webapp 默认在http 0 0 0 0 3000 2 keepnote 层级化 3 truecrypt 加密工具 已停止更新 官方原因是安全性不够 xff0c 但实际使用却依然较
  • 渗透测试工具学习笔记(6)——nplookup(被动信息收集)

    被动信息收集 34 开源智能 34 open source OSINT 都是公开渠道可获得的信息 与目标系统不产生直接交互 尽量避免留下一切痕迹 Passive reconnaissance no direct interaction gt
  • PCL学习笔记——合并点云

    合并点云分为两种类型 xff1a 第一种是两个点云数据集的字段类型和维度相同 xff0c 合并之后点云只是点的数量增加了 xff1b 第二种是两个点云数据集的字段类型或维度不同 xff0c 但是点的数量相同 xff0c 合并之后相当于扩展了
  • 云服务器的图形界面的安装和远程连接xfce4 + VNC

    对于阿里和腾讯的云服务器学生价真的很优惠 xff0c 但是对于凑热闹买的我还是个小白 xff0c 我想装一个图形界面 xff08 特别是最近在用腾讯的CVM做HIT操作系统的实验 xff0c 其中有个软件必须要显示图形界面 xff09 较为
  • 【ROS学习】-tf学习(tf_monitor、tf_echo、static_transform_publisher、view_frames)

    写在前面 本文的内容主要来自 ros wiki 上的教程 xff1a http wiki ros org tf 简短总结 xff1a tf monitor 将当前的坐标系转换关系打印到终端控制台 tf echo lt source fram
  • Ubuntu使用WPS打开文档出现缺失字体情况解决方法

    一 问题描述 Ubuntu 通过官网下载deb安装 WPS 之后 xff0c 打开文档出现字体缺失的问题 xff1a 二 解决方法 下载缺失的字体 xff0c 百度网盘下载链接 xff08 TODO xff09 xff0c 然后解压 xff
  • PendSV中断服务函数

    之前在系统滴答定时器中断服务函数中调用API函数xPortSysTickHandler xff09 xff0c xPortSysTickHandler xff09 函数中通过向中断和状态寄存器的bit28写入1来启动PendSV中断 xff