1、多任务的引入
之所以引入多任务,主要在于提高程序运行的效率。多任务的过程,能够有效地发挥交换式任务的运作效率。类似的,由于一个任务里面也有瓶颈的地方,为了把瓶颈的地方抠出来,让它不影响整体效果,引入线程概念,各自为政,充分发挥各自效能;然而为了让各自协调执行,必须管理各个线程;概念引入只是其一,如何管理是其二(宝马车快,必须有好的刹车作保障)。
2、切换机制
需要任务切换时,就必须尽快切换(虽然由于优先级问题,仍然是本任务,但仍需相应一下);而一些处理器提供的中断机制就刚好满足这个需求,从而奠定了切换的基础。中断分为软中断和硬中断。所谓的软中断就是可有程序自身触发的中断(例如,SWI);而硬中断则是硬件本身检测到中断触发信号而强制触发中断。众所周知,任务就是一个个死循环,没有切换则一直执行程序。而切换又分为两类:自身切换(类似于自废武功)和强制切换(类似于暴力实施)。任务的自身切换是由程序自身触发的,从而使用软中断;强制切换则是达到允许执行时间后,而由硬件强制切换的,从而使用硬中断。
任务的自身切换则是因为任务本身知道自身在等待某个消息,而不想让CPU在自己身上空运行而触发中断;从而任务切换程序里面 OS_Sched() 就是调用的软中断OS_TASK_SW();
任务的强制切换则是因为任务本身的运行寿命到达限制,CPU强制切换到别的任务,让其他任务有执行的机会。从而负责强制切换的为定时器中断( interrupt 66 void OSTickISR(void)),其内部调用函数(void OSTimeTick (void))便负责任务切换的具体事务。
然而,不管软中断也好硬中断也罢,它们只是手段;最根本的就是任务堆栈的切换(改变SP的指向)。