基于网上网友的代码,自己在单片机上实现, 特此记录分享之。
基于https://blog.csdn.net/yyx112358/article/details/78877523
//使用KEIL C51实现的简单合作式多任务操作系统内核
#include <regx52.H>
#include <INTRINS.H>
typedef unsigned char u8;
typedef unsigned int u16;
sbit LED1 = P2 ^ 0;
sbit LED2 = P2 ^ 1;
sbit LED3_idle = P2 ^ 3;
//两个宏定义是为了保护现场,不被定时中断打乱。
//主要用于需要一次性运行完毕的代码中。
#define OPEN_SYS_ISR() {EA=1;TR2=1;}
#define CLOSE_SYS_ISR() {EA=0;TR2=0;TF2=0;}
#define OS_TASK_STACK_SIZE (2+13+2*3)//存放断点2B,中断函数可能压栈13B,子程序每嵌套一层2B
#define OS_TASK_NUM 2
typedef struct OS_TASK_ST
{
u8 delay; //当前延时剩余时间
u8 stack[OS_TASK_STACK_SIZE]; //私有堆栈
u8 sp; //私有堆栈指针
} OS_TASK; //任务工作块。
data OS_TASK os_task[OS_TASK_NUM]; //必须定义为data(因堆栈只能在data区)
data u8 os_idle_stack[15];
void os_switch(void);
void os_idl