微型操作系统内核源码详解系列三(4):arm架构篇

系列一:微型操作系统内核源码详解系列一:rtos内核源码概论篇(以freertos为例)-CSDN博客

系列二:微型操作系统内核源码详解系列二:数据结构和对象篇(以freertos为例)-CSDN博客

系列三:微型操作系统内核源码详解系列三(0):空间存储及内存管理篇(前置篇)-CSDN博客

                微型操作系统内核源码详解系列三(1):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(2):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(3):任务及切换篇(任务函数定义)-CSDN博客

                微型操作系统内核源码详解系列三(4):arm架构篇-CSDN博客

                微型操作系统内核源码详解系列三(5):进程与线程-CSDN博客

系列四:

 ​​​​​微型操作系统内核源码详解系列四(1):操作系统调度算法(linux0.11版本内核)-CSDN博客

微型操作系统内核源码详解系列四(2):操作系统调度算法(rt-thread内核)-CSDN博客

微型操作系统内核源码详解系列四(3):操作系统调度算法(FreeRTOS内核篇上)-CSDN博客

微型操作系统内核源码详解系列四(4):操作系统调度算法(FreeRTOS内核篇下)-CSDN博客

系列五:

微型操作系统内核源码详解系列五(1):arm cortex m3架构-CSDN博客

微型操作系统内核源码详解系列五(2):cm3下栈的初始化-CSDN博客

微型操作系统内核源码详解系列五(3):cm3下调度的开启-CSDN博客

微型操作系统内核源码详解系列五(四):cm3下svc启动任务-CSDN博客

微型操作系统内核源码详解系列五(五):cm3下Pendsv切换任务上篇-CSDN博客

微型操作系统内核源码详解系列五(六):Pendsv切换任务下篇-CSDN博客

笔者在前文曾经简短介绍过进程和线程的概念,这里简单补充一下:进程是资源分配的最小单位,线程是进程的组成单位,同时线程是处理器调度的最小单位

线程之间可以互相影响,进程之间互不影响,可以把进程理解为手机应用,线程就是应用里的多个界面。

这一篇笔者决定讲一讲arm架构。

线程(任务)切换如下:

       1.保存之前运行的线程的上下文
  2.调用准备运行的线程的上下文
  3.CPU使用权交接

请记住上下文切换!

由于c语言的操作尺度不足,我们只能使用汇编语言完成上下文切换。

简单介绍一下我们要在汇编尺度下完成的事情:产生SVC调用->开启第一个任务 ->任务切换 ->pendsv中断->保存原先任务状态 ->切换下一个任务状态

以最常用的stm32f10系列为例,它的架构是arm cortex m3。在arm架构中,有七种工作模式,37个寄存器。

了解以下模式即可:

1.正常情况下是usr模式

2.用于高速数据传输和通道处理时切换为FIQ模式

3.执行外部中断时是irq模式

4.最高权限是管理模式svc

5.系统模式sys

除了系统模式和用户模式,其他模式都被称之为异常。

在arm汇编中。我们使用寄存器进行编程,对数据的操控都要通过寄存器进行。寄存器分为31个通用寄存器和6个状态寄存器,在不同的状态下,我们能使用的寄存器可能会不同。

参考官方手册:

显然,我们开启RTOS第一个任务,肯定要保证第一个任务马上执行,不会受到干扰,所以,

为了能够启动RTOS,FreeRTOS利用了svc中断,也就是系统中断:

于是,在SVC中断中,我们把第一个任务的内容加载到了寄存器中,RTOS开始执行任务。

随后,来到PendSV函数,在这里,我们将会保存前一个任务的状态,并且切换到下一个任务。

 
 PendSV(可悬起的系统调用),它和 SVC 协同使用。一方面,SVC  
异常是必须立即得到响应的,应用程序执行 SVC 时都是希望所需的请求立即得到响
应。另一方面,PendSV 则不同,它是可以像普通的中断一样被悬起的(不像 SVC 那样会上
访)。OS 可以利用它“缓期执行”一个异常——直到其它重要的任务完成后才执行动作。悬
起 PendSV 的方法是:手工往 NVIC 的 PendSV 悬起寄存器中写 1。悬起后,如果优先级不够
高,则将缓期等待执行。
PendSV 的典型使用场合是在上下文切换时(在不同任务之间切换)。例如,一个系统中
有两个就绪的任务,上下文切换被触发的场合可以是:
1. 执行一个系统调用
2.系统滴答定时器(SYSTICK)中断
系统调用也就是优先级抢占,滴答计时器中断也就是时间片轮转。
顺便一提,在FreeRTOS中,创建任务时没有延时,任务的优先级又非常高,那么任务就会一直执行。这是因为没有产生系统调用,优先级太高又导致没有相同优先级的任务在产生滴答计时器时过来抢占。
PendSV中断函数的代码主要是对寄存器的操作,笔者这里就不详细介绍了,会在后面的篇章展示代码并介绍,不过笔者只会进行大概讲解, 有兴趣的可以看看这篇文章,笔者认为讲得相当不错: https://www.cnblogs.com/bathwind/p/18127622
关于任务是如何被保存的, 读者可以参考下文
从arm架构的角度看,RTOS通过SVC中断开启了第一个任务,随后PendSV中断进行任务的保存与切换,这就是FreeRTOS中的任务切换调度部分。
在接下来的几篇博客中,笔者将会讲述FreeRTOS的整体调度策略。
  
  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值