之前在系统滴答定时器中断服务函数中调用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;PRESERVE8mrs r0, pspisb/* Get the location of the current TCB. */ldr    r3, =pxCurrentTCBldr   r2, [r3]/* Is the task using the FPU context?  If so, push high vfp registers. */tst r14, #0x10it eqvstmdbeq 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_PRIORITYmsr basepri, r0dsbisbbl vTaskSwitchContext  //在此处 调用函数vTaskSwitchContext() ,该函数用来获取下一个要运行的任务,并将 pxCurrentTCB更新为这个要运行的任务。mov r0, #0msr basepri, r0ldmia 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 registerstoo. */tst r14, #0x10it eqvldmiaeq r0!, {s16-s31}msr psp, r0isb#ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata */#if WORKAROUND_PMU_CM001 == 1push { r14 }pop { pc }nop#endif#endifbx r14  //至此,任务切换成功。
}

查找下一个要运行的任务

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

void vTaskSwitchContext( void )
{if( uxSchedulerSuspended != ( UBaseType_t ) pdFALSE )  //如果调度器被挂起{/* The scheduler is currently suspended - do not allow a contextswitch. *///调度器被挂起就不能进行任务切换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 portoptimised asm code. */taskSELECT_HIGHEST_PRIORITY_TASK();//调用该宏来获取下一个要运行的任务,即获取就绪列表的最高优先级任务列表中的下一个列表项,将列表项所对应的任务控制块赋值给pxcurrenttcb,就确定了下一个运行的任务;traceTASK_SWITCHED_IN();//在选择要运行的任务后调用。pxcurrenttcb保存指针到选定任务的任务控制块;}
}

PendSV中断服务函数相关推荐

  1. 嵌入式中断服务函数的一些特点

    --------------------------------------------- -- 时间:2019-02-20 -- 创建人:Ruo_Xiao -- 邮箱:xclsoftware@163 ...

  2. STM32 关于外部中断线、中断源和中断服务函数的问题

    STM32 关于外部中断线.中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0.PB0...PG0共用的EXTI0中断线,PA1.PB1...PG1共用的EXTI1中断线,也就是 编程里面 ...

  3. 中断函数 printf_嵌入式中断服务函数的一些特点

    中断是嵌入式系统中重要的组成部分,但是在标准C中不包含中断.许多编译开发商在标准C上增加了对中断的支持,提供新的关键字用于标示中断服务程序 (ISR),类似于__interrupt.#program ...

  4. stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)

    rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口.当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发.系统复位 ...

  5. 串行口中断服务函数的触发条件-------TI/RI 触发

    串行口中断服务函数和其他中断本质上是一样的,达到特定的条件,向CPU申请中断,进入中断服务函数: 我特意在郭天祥老师的书上找到了一句话:当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发 ...

  6. 正点原子STM32-串口中断服务函数USART1_IRQHandler关于USART_RX_STA的学习笔记

    目录 USART1_IRQHandler 中断服务函数代码 介绍 函数USART_GetITStatus 每个状态描述 USART_RX_STA 接收状态标记的思考 USART1_IRQHandler ...

  7. 中断解读以及中断服务函数

    文章目录 1.硬中断和软中断 2.中断服务程序(ISR) 3.面试题 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器.如果中断的线是激活的,中 ...

  8. 嵌入式里的中断解读以及中断服务函数

    不要年纪轻轻,就觉得自己进入了人生低谷,其实,后来你会发现你还有很大的下降空间. 从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器.如果中断的线 ...

  9. stm32f103——中断——UART中断服务函数

    在程序中,CPU对外界突发事件进行处理的方式又两种: 1>轮询系统:(在main中,使用while循环,进行循环判断外界事物是否发生)         while(1){            ...

最新文章

  1. awk2.0 — awk分隔符
  2. ORACLE AWR 和 ASH
  3. bat php 监控网站,bat curl 发送http请求 监控网站
  4. Mssql 跨域查询
  5. 定义空列表元素类型_python数据类型是什么
  6. bzoj 3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(状压+BFS)
  7. 基于SharePoint 2010的控制台应用程序常见问题
  8. 安全计算:AVG免费版提供免费病毒防护
  9. 2022年6月25日PMP考试通关宝典-3
  10. 解构CPU--从晶体管到门电路
  11. css3优惠卷上方锯齿_CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式
  12. 大数据Hadoop入门
  13. 数据挖掘 文本分类(四)批处理分词
  14. 解决systemback 无法生成超过4G的iso的问题
  15. JAMF的NetBoot/SUS Appliance
  16. 【vbers】ibv_reg_mr|RDMA
  17. 关于dumper和mysqldump的
  18. python查看微信撤回消息_python轻松实现查看微信撤回消息代码实例
  19. 小人数字时钟安卓版本APP
  20. 新颖的基于互联网的毕业设计题目50例

热门文章

  1. linux can软件,Linux学习系列十:使用CAN
  2. wamp mysql 启动 mysql_wampserver的mysql启动与环境变量设置
  3. C#_Unicode字符串 转中文编码
  4. Clinically Applicable AI System for Accurate Diagnosis, Quantitative Measurements...论文总结
  5. 路面附着系数估计_无迹 扩展卡尔曼滤波(UKF/EKF) 采用无迹/扩展卡尔曼滤波UKF进行路面附着系数估计,可实现“不变路面,对接路面和对开路面”等工况的路面附着系数估计
  6. 手机克隆android iphone,苹果官方应用让 Android 手机一键克隆到 iOS
  7. 服务器共享文档密码,电脑共享 服务器密码是多少
  8. macbook air php 内存,紧急抢救性拆解喝了150毫升咖啡的苹果MacBook Air超薄笔记本!...
  9. 【51Nod1815】调查任务
  10. 2023大型企业全面预算管理趋势