TQ2440开发板学习纪实(10)--- 实现多任务处理,最简单OS模型

本文详细介绍了在TQ2440开发板上实现多任务处理的原理和步骤,包括CPU与多任务的关系,任务切换的必要性和时机,ARMv4核心的任务切换原理,以及任务管理和调度策略。通过测试验证了多任务切换的实现,并提供了完整的源码供参考。
摘要由CSDN通过智能技术生成

Keywords: Mutitasking,Context Switch,Thread

0 多任务(多线程,多进程)基本概念

0.1 CPU与多任务

对于“多任务(Multitasking)”,不同的应用领域有不同术语。在操作系统领域,一般称为“多任务”;在应用程序设计领域,一般称为“多线程”;而在Unix领域,更多的人喜欢用“多进程”来表示相同的意思。本文着眼于OS层,所以使用“多任务”这个术语。

所谓的“多任务”,就是让一个CPU能“同时”运行多个程序。注意这里的“同时”表示的是用户(人)的感觉,实际上是多个程序以很高的频率交替运行,给人一种同时运行的感觉。目前大多数操作系统都是支持多任务的,而且大多数CPU都从硬件级别对多任务进行了特别的支持。

在我们的PC上,边浏览网页,边听歌,同时还可以开着QQ等众多软件,这就是最直观的“多任务”,早就被人们认为是理所当然的事情了。

与“多任务”相对应的是“单任务”。最典型的单任务系统就是DOS了,在DOS下,只能一个任务独占CPU,直到其运行结束为止。

0.2 多任务的必要性

一是提高CPU使用效率。对于大多数应用程序而言,它不可能始终利用CPU进行不断的运算,而是需要消耗很多时间在等待I/O完成。在等待I/O的时候,CPU只能做一些无用的循环,白白浪费了CPU运算能力。而“多任务”则可以完美解决这个问题。

二是实时响应的需要。在多任务普及之前,让CPU运行多个程序通常是通过中断处理程序的方式实现。这种方式也可以实现多个程序的调度,只是程序代码在中断处理的环境下运行,为避免中断嵌套导致的复杂性,运行时同类型中断往往是关闭的。这就会造成运行一个中断处理程序期间,中断不再响应,无法满足实时要求。在嵌入式领域,实时性要求普遍存在,为此出现了一大批实时OS,例如uC/OS,RT-Linux,FreeRTOS等等。

三是简化应用程序软件开发。通过多任务的底层支持,应用层软件可以彼此完全独立的进行开发,大大提高了开发效率。

0.3 何时进行任务切换

“多任务”的根本就是任务切换。这是所有OS所使用的的方式。因为CPU在执行一条指令时(软中断指令)或者执行后(外部中断信号),总会检测中断标志位,并据此跳转到中断处理程序。所以在中断上下文中执行任务切换是最小粒度的切换。伪代码:

MOV r0, r2
/* 这里可能会跳转到中断处理程序,然后进行任务切换 */
LDR r1, [r1]
/* 这里可能会跳转到中断处理程序,然后进行任务切换 */

任务切换时,需要保存当前任务的执行环境(CPU的各个寄存器的当前值),然后把下一个要运行的任务的执行环境恢复。

1 ARMv4核心任务切换原理

1.1 ARMv4核对任务切换的支持

ARMv4支持7种运行模式,任务的执行都是在User模式下。其他模式都是“特权模式”,用于异常处理与系统管理。在发生中断时,自动进入相应的特权模式。

这里写图片描述

本文我们以IRQ中断模式为例,说明任务切换的过程。

1.2 上下文的保存与恢复

用户模式程序执行时,发生IRQ中断后,CPU自动完成:
(1)把当前CPSR复制到SPSR_irq
(2)关IRQ中断
(3)进入IRQ模式
(4)把PC-4存入R14_irq
(5)跳转到中断处理程序

任务上下文环境通常存放到一个称为PCB的区域,PCB里包含了R0-R15以及CPSR的当前值。虽然PCB可以存放到任何内存中,但是为了处理方便,通常把PCB存放到每个任务的Stack上。

1.2.1 PCB的保存

因为涉及到CPU寄存器的直接操作,所以C语言无能为力,必须使用汇编来完成。现在是在IRQ模式下,我们对任务执行环境的每一个寄存器进行分析:

  • R0-R12,这个是User和IRQ模式共享的,所以可以直接读取保存。
  • R13,这个在IRQ模式下不可见。
  • R14,这个同样在IRQ模式下不可见。
  • R15,我们关心的是被中断任务的下一条指令地址,CPU已经自动把下一条指令的地址存入了R14_irq。所以,我们实际要保存的是R14_irq的值。
  • CPSR,CPU已经自动存入了SPSR_irq,所以我们需要保存的是SPSR_irq的值。

显然这里的主要问题就是如何读取保存被中断时,用户模式下的R13,R14。有两种方式:
(1)修改CPSR,让CPU重新进入User模式,从而可以操作R13,R14。
这种方式看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值