操作系统:
操作系统:解决计算机争抢资源而编写的程序。
系统资源:执行当前指令
任务:计算机要完成的某一项工作。
进程:正在进行的任务。
顺序执行:顺序执行任务。
多任务并行:
任务优先级:
任务切换:当前任务切换到下一个任务,保存当前任务状态。
时间片:分配一段固定的时间,执行任务。
中断系统:
突发事件,OS立刻响应处理。
非实时操作系统:没有严格时间限制的OS。
实时操作系统:硬实时:严格时间内完成,执行不完则任务挂起。
软实时:
idata 访问最快的、内部、internode、内存空间。
上下文切换
1、先把cpu从R0到R7寄存器压栈然后再出栈。
2、加static关键字,编译系统设计一款存储空间RAM中,避免cpu搞同一个寄存器。
#include <stc8h.h>
#define MAX_TASK 2 //简化当前os只有2个task
#define MAX_TASK_DEP 32
//sp 堆栈指针寄存器 把现场地址压栈,出去时就把现场地址出栈
unsigned char idata task_sp[MAX_TASK]; //任务的堆栈指针
unsigned char idata task_stack[MAX_TASK][MAX_TASK_DEP]; //每一个task任务的堆栈
unsigned char task_id; //当前任务号,从0开始。
//任务状态
typedef enum{
TASK_RUNNING, //运行状态
TASK_SUSPENDED //挂起状态
}TaskStatus;
typedef struct{
unsigned chat id; //任务id
TaskStatus status; //任务状态
unsigned int delay_count; //延迟计数器
unsigned int delay_duration //延迟时间
}Task;
Task idata Task[MAX_TASK] = {
{0,TASK_RUNNING,0,0},
{1,TASK_RUNNING,0,0}, //两个任务,默认运行状态,不延迟
};
void Timer0_init(void); //原型函数
void sleep(unsigned int, unsigned int); //tid,delay_ms
void sleep(unsigned int task_id,unsigned int delay_ms)
{
tasks[task_id].status = TASK_SUSPENDED;
tasks[task_id].delay_count = 0;
tasks[task_id].delay_duration = delay_ms;
}
//定义一个任务切换的函数(任务调度器)
void task_switch()
{
//交换两个数字
task_sp[task_id] = SP; //把当前的堆栈指针存入到某个小朋友的task_sp里面
task_id = task_id + 1; //任务+1 (切换任务)
if(task_id == MAX_TASKS)
{
task_id = 0;
}
SP = task_sp[task_id];
}
void task0()
{
//第0号任务,代表第0个小朋友做的事情
static unsigned int b = 5;
while(1)
{
b = b+3;
}
}
void task1()
{
//第1号任务,代表第1个小朋友做的事情
static unsigned int b = 5;
while(1)
{
b = b+3;
}
}
//操作系统加载任务
//fn fn是一个函数的指针,数据类型是int(16bit)
//tid takd id 是8位的,0,1
//函数的作用就是把一个task的函数指针放入对应的堆栈空间里面
void task_load(unsigned int fn,unsigned char tid)
{
task_sp[tid] = task_stack[tid] + 1; //把任务的指针往下一个空间挪一格,,两个char
task_stack[tid][0] = fn & 0xff;
task_stack[tid][1] = fn >> 8;
}
int main()
{
task_load(task0,0); //把task0装载到内存中。
task_load(task1,1); //把task1装载到内存中。
SP=task_sp[0]; //
}