系列一:微型操作系统内核源码详解系列一: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函数,在这里,我们将会保存前一个任务的状态,并且切换到下一个任务。