![](https://csdnimg.cn/release/download_crawler_static/86352834/bg1.jpg)
则完整的系统为
#include <reg51.h>
#define MAX_TASKS 2 //任务槽个数.必须和实际任务数一至
#define MAX_TASK_DEP 12 //最大栈深.最低不得少于 2 个,保守值为 12.
unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];//任务堆栈.
unsigned char task_id; //当前活动任务号
unsigned char idata task_sp[MAX_TASKS];//堆指针的保存处
//任务切换函数(任务调度器)
void task_switch(){
task_sp[task_id] = SP;
if(++task_id == MAX_TASKS)
task_id = 0;
SP = task_sp[task_id];
}
//任务装入函数.将指定的函数(参数 1)装入指定(参数 2)的任务槽中.如果该槽中原来就有任
务,则原任务丢失,但系统本身不会发生错误.
void task_load(unsigned int fn, unsigned char tid){
task_sp[tid] = task_stack[tid] + 1;
task_stack[tid][0] = (unsigned int)fn & 0xff;
task_stack[tid][1] = (unsigned int)fn >> 8;
}
//从指定的任务开始运行任务调度.调用该宏后,将永不返回.
#define os_start(tid) {task_id = tid,SP = task_sp[tid];return;}
看看这个多任务系统的原理:
这个多任务系统准确来说,叫作"协同式多任务".
所谓"协同式",指的是当一个任务持续运行而不释放资源时,其它任务是没有任何机会和方式
获得运行机会,除非该任务主动释放 CPU.
在本例里,释放 CPU 是靠 task_switch()来完成的.task_switch()函数是一个很特殊的函数,我
们可以称它为"任务切换器".
要清楚任务是如何切换的,首先要回顾一下堆栈的相关知识.
有个很简单的问题,因为它太简单了,所以相信大家都没留意过: