xPortPendSVHandler任务切换流程

news2025/1/4 8:16:57

__asm void xPortPendSVHandler( void )

{

    extern uxCriticalNesting;

    extern pxCurrentTCB;

    extern vTaskSwitchContext;

    PRESERVE8

    mrs r0, psp

    isb//指令同步命令,

    ldr r3, =pxCurrentTCB       /* Get the location of the current TCB. */

    ldr r2, [r3]//r2保存pxCurrentTCB的值,也是结构体topofstack的值,即栈顶的地址,

    stmdb r0!, {r4-r11}         /* Save the remaining registers. */进入中断会自动保存部分寄存器到//PSP

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

更新topofstack的值。

    stmdb sp!, {r3, r14}//接下来会用到r3和r14.

    mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY

    msr basepri, r0//禁止部分中断优先级低的中断

    dsb

    isb

    bl vTaskSwitchContext//进行跳转的任务切换函数,见解析一

    mov r0, #0

    msr basepri, r0//运行所有中断

    ldmia sp!, {r3, r14}

    ldr r1, [r3]//因为r3保存的是xCurrentTCB的地址。在任务切换函数中,xCurrentTCB的值变成了要切换任务的TCB。所以下面的栈就是要运行的任务栈

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

    ldmia r0!, {r4-r11}         /* Pop the registers and the critical nesting count. */

    msr psp, r0//将top of stack赋给PSP

    isb

    bx r14//跳转到另一个任务。因为中断的硬件保存机制,所以即使另一个任务是被中断的,也可以继续保持运行。

    nop

}

解析一:
 

void vTaskSwitchContext( void )

{

假设调度器正常运行。(精简后)

        xYieldPending = pdFALSE;//允许礼让。

        /* Select a new task to run using either the generic C or port

        optimised asm code. */

        taskSELECT_HIGHEST_PRIORITY_TASK();解析二

        

}

解析二:

    #define taskSELECT_HIGHEST_PRIORITY_TASK()                                                      \

    {                                                                                               \

    UBaseType_t uxTopPriority;    

        /* Find the highest priority list that contains ready tasks. */                             

找到就绪列表中含有的任务中最高的优先级。

        portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority );   

根据找到的就绪列表中的其它任务,并将该任务的TCB赋值给pxCurrentTCB

        listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); 

    } 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1053952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ghostscript 在 Linux 和 Windows 系统的应用与问题解决

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

分享10个必备的VS Code技巧和窍门,提高你的开发效率

目录 前言 1. 时间线视图:本地源代码控制 2. 自动保存:不再需要按Ctrl S 3. 使用命令面板进行任何操作 4、快速转到文件 5. 快速跳转指定行 6. 快速删除该行 7. 享受使用流畅的光标进行打字 8. 快速格式化代码 9. 使用多光标编辑功能节省时间…

redis5.0配置一主两从三哨兵

基础配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/ /etc/selinux/configvi /etc/hosts ip1 node1 ip2 node2 ip3 node3redis 配置一主两从 yum -y install autoconf automake bison byac…

leetCode 309.买卖股票的最佳时机含冷冻期 动态规划 + 滚动数组

309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode) 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买…

排序篇(四)----归并排序

排序篇(四)----归并排序 1.归并(递归) 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到…

【Linux】UDP的服务端 + 客户端

文章目录 📖 前言1. TCP和UDP2. 网络字节序2.1 大小端字节序:2.2 转换接口: 3. socket接口3.1 sockaddr结构:3.2 配置sockaddr_in:3.3 inet_addr:3.4 inet_ntoa:3.5 bind绑定: 4. 服…

【VR】【unity】如何在VR中实现远程投屏功能?

【背景】 目前主流的VD应用,用于娱乐很棒,但是用于工作还是无法效率地操作键鼠。用虚拟键盘工作则显然是不现实的。为了让自己的头显能够起到小面积代替多显示屏的作用,自己动手开发投屏VR应用。 【思路】 先实现C#的投屏应用。研究如何将C#投屏应用用Unity 3D项目转写。…

FFmpeg 命令:从入门到精通 | ffplay 播放控制选项

FFmpeg 命令:从入门到精通 | ffplay 播放控制选项 FFmpeg 命令:从入门到精通 | ffplay 播放控制选项选项表格图片 FFmpeg 命令:从入门到精通 | ffplay 播放控制选项 选项表格 项目说明Q,Esc退出播放F,鼠标左键双击全…

计算机网络分层结构

一、OSI参考模型(法定标准) 1.由国际标准化组织(ISO)提出的开放系统互连(OSI)参考模型 2.OSI七层结构: 3.通信过程: 4.各层功能 应用层-能和用户交互产生网络流量(需要联网)的程序,常见协议有文件传输(FTP)、电子邮件(SMTP)、万维网(HTTP)…

MASM32配置问题

1. 总述 当你用masm32 SDK出现类似下面的错误情况: cannot open file :windows.inc这说明你的汇编器无法找到windows.inc这个头文件, 有3种解决方法 2. 解决方法 a. 使用绝对路径 直接把需要的inc头文件或者lib库文件的绝对路径包含进去, 问题就解决了 .586 .model flat,…

【Java 进阶篇】MySQL多表关系详解

MySQL是一种常用的关系型数据库管理系统,它允许我们创建多个表格,并通过各种方式将这些表格联系在一起。在实际的数据库设计和应用中,多表关系是非常常见的,它能够更好地组织和管理数据,实现数据的复杂查询和分析。本文…

Heptabase 究竟好在哪儿?

(注:本文为小报童精选文章,已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费) Heptabase 1.0 正式版发布,你可以免费尝试了。 赞誉 我因为研究各种知识管理工具,常年混迹在不同的社区、群组与论坛中…

Python日期的加减等操作

嗨喽,大家好呀~这里是爱看美女的茜茜呐 日期输出格式化 所有日期、时间的api都在datetime模块内。 👇 👇 👇 更多精彩机密、教程,尽在下方,赶紧点击了解吧~ python源码、视频教程、插件安装教程、资料我都…

《MySQL高级篇》十六、主从复制

文章目录 1、主从复制概述1.1 如何提升数据库并发能力1.2 主从复制的作用 2、主从复制的原理2.1 原理剖析2.2 复制的基本原则 3、一主一从架构搭建3.1 准备工作3.2 主机配置文件3.3 从机配置文件3.4 主机:建立账户并授权3.5 从机:配置需要复制的主机3.6 …

UE5.1编辑器拓展【二、脚本化资产行为,快速更改资产名字,1.直接添加前缀或后缀2.通过资产类判断添加修改前缀】

目录 了解相关的函数 第一种做法:自定义添加选择资产的前缀或后缀 代码 效果 第二种做法:通过映射来获取资产类型添加前缀和修改前缀 映射代码 代码 效果 在之前一章中,我们创建了插件,用来扩展编辑器的使用: …

福利!这两款我自制的免费配色工具你领到了吗?

​前两天刚入职,还没干过啥活儿,就迎来了中秋3天国庆7天总共8天的假期,美滋滋。 在这么喜庆的日子里,我觉得大家应该也无心科研,所以不如给大家发点儿福利,继续乐呵乐呵。 当然,说是福利&…

Redis代替session 实现登录流程

Redis代替session 实现登录流程 如果使用String,他的value,用多占用一点空间,如果使用哈希,则他的value中只会存储他数据本身,如果不是特别在意内存,其实使用String就可以 设计key的具体细节 在设计这个k…

如何在Cocos中绘制一面国旗祝祖国生日快乐、繁荣昌盛

引言 大家好,我是亿元程序员,一位有着8年游戏行业经验的主程。 74年风雨兼程、74载山河巨变,我们一起来祝福伟大的祖国生日快乐、繁荣昌盛!我爱你中国! 本文主要演示在Cocos中绘制一面国旗,用代码去表达…

【Java每日一题】— —第十七题:杨辉三角(等腰三角形)。(2023.10.01)

🕸️Hollow,各位小伙伴,今天我们要做的是第十七题。 🎯问题: 第一步:动态初始化 第二步:求各元素的值 第三步:遍历输出 测试结果如下: 🎯 结果: public class yanghui {public sta…

10.1 国庆节小任务

目录 select实现服务器并发 服务器 客户端 运行现象 select实现服务器并发 服务器 #include<myhead.h>#define PORT 8888 //1024~49151 #define IP "192.168.1.104" //ifconfig查看本机IPint main(int argc, const char *argv[]) {//创建流式…