这是基于STC系列的强制任务调度演示,可以修改PC寄存器从而实现多个任务之间的强制任务调度,没有实现任何别的东西,只是作为一个演示,代码如下:
//以下是main.c文件部分
#include "zos.h"
int main()
{
//B = 0x09;
ZOS_Init();//初始化程序并允许操作系统
while(1);//运行服务
}
//以下是zos.H正文文件部分
#include <reg52.h>
/*******************************************************************************
时间:2017.9.14
作者:钟国庆
解释:
简单操作系统头文件
纯c语言打造
*******************************************************************************/
//外部接口:
void ZOS_Init(void);//初始化操作系统
//函数描述结构体
typedef idata unsigned char* ichar;
typedef struct _Funs{
unsigned char PC_L;//程序指针寄存器低8位
unsigned char PC_H;//程序指针寄存器高8位
unsigned char A;//A寄存器
unsigned char B;//B寄存器
unsigned char DPTR_H;//PTSR高8寄存器
unsigned char DPTR_L;//PTSR低8寄存器
unsigned char PSW;//PTSR高8寄存器
} Funs, *pFuns;
typedef void (*ThreadFun)(void);
#define RESULT char
#define SP_PSW *(ichar)(SP - 0)
#define SP_DPTRL *(ichar)(SP - 1)
#define SP_DPTRH *(ichar)(SP - 2)
#define SP_B *(ichar)(SP - 3)
#define SP_A *(ichar)(SP - 4)
#define SP_PCH *(ichar)(SP - 5)
#define SP_PCL *(ichar)(SP - 6)
//函数说明格式:
/*******************************************************************************
名:
说明:
参数:
返回值:
任务:
*******************************************************************************/
//以下是zos.c正文文件部分
#include <stm32f10x.h>
/*******************************************************************************
时间:2017.9.14
作者:钟国庆
解释:
简单操作系统实现文件
*******************************************************************************/
//相关头文件:
#include "zos.h"
void Thread2(void);
void Thread1(void);
RESULT CreatThread(ThreadFun newFun);
//操作系统标记等变量:
//static int Time_ms = 0;
static Funs Fun_s[2];
static char Fun_c,Fun_n;//记录线程总数
/*******************************************************************************
名:ZOS_Init
说明:zos操作系统初始化函数
参数:void
返回值:void
任务:初始化zos操作系统
********************************************************************************/
void ZOS_Init()
{
//此定时器将时操作系统的核心
TMOD = 0x21;//t0 16位定时器
TH0 = 0xfA;
TL0 = 0x36;//用来产生1s定时
TH1 = 0xfA;
TL1 = 0xAD;//用来产生9600波特率
PT0 = 1;
TR0 = 0;
TR1 = 0;
SM0 = 0;
SM1 = 1;//配置串口工作方式10位异步
REN = 1;//使能串口接收
ET0 = 1;
EA = 0;
//ES = 1;//中断配置
//Thread1();
Fun_c = 1;
Fun_n = 0;//当前线程
CreatThread(Thread1);
CreatThread(Thread2);
}
/*******************************************************************************
名:Timer0Seriver
说明:定时器0中断服务函数
参数:void
返回值:void
任务:定时器t0产生1ms的定时,用来更新基础时间以及
*******************************************************************************/
RESULT CreatThread(ThreadFun newFun)
{
Fun_s[Fun_c].A = 0;
Fun_s[Fun_c].B = 0;
Fun_s[Fun_c].PSW = 0;
Fun_s[Fun_c].PC_L = (unsigned int)(newFun);
Fun_s[Fun_c].PC_H = (unsigned int)(newFun) >> 16;
Fun_s[Fun_c].DPTR_H = 0;
Fun_s[Fun_c].DPTR_L = 0;
Fun_c++;
return 0;
}
/*******************************************************************************
名:Timer0Seriver
说明:定时器0中断服务函数
参数:void
返回值:void
任务:定时器t0产生1ms的定时,用来更新基础时间以及
*******************************************************************************/
void Timer0Seriver() interrupt 1 using 1
{
//ichar pSpL,pSpH;
TH0 = 0xf1;
TL0 = 0x37;
Fun_s[Fun_n].PC_L = SP_PCL;
Fun_s[Fun_n].PC_H = SP_PCH;
Fun_s[Fun_n].A = SP_A;
Fun_s[Fun_n].B = SP_B;
Fun_s[Fun_n].DPTR_H = SP_DPTRH;
Fun_s[Fun_n].DPTR_L = SP_DPTRL;
Fun_s[Fun_n].PSW = SP_PSW;
Fun_n = !Fun_n;
SP_PCL = Fun_s[Fun_n].PC_L;
SP_PCH = Fun_s[Fun_n].PC_H;
SP_A = Fun_s[Fun_n].A;
SP_B = Fun_s[Fun_n].B;
SP_DPTRH = Fun_s[Fun_n].DPTR_H;
SP_DPTRL = Fun_s[Fun_n].DPTR_L;
SP_PSW = Fun_s[Fun_n].PSW;
// Time_ms++;
// if (Time_ms > 999)
// {//切换线程:
// Fun_s[Fun_n].PC_L = SP_PCL;
// Fun_s[Fun_n].PC_H = SP_PCH;
// Fun_s[Fun_n].A = SP_A;
// Fun_s[Fun_n].B = SP_B;
// Fun_s[Fun_n].DPTR_H = SP_DPTRH;
// Fun_s[Fun_n].DPTR_L = SP_DPTRL;
// Fun_s[Fun_n].PSW = SP_PSW;
// Fun_n = !Fun_n;
// SP_PCL = Fun_s[Fun_n].PC_L;
// SP_PCH = Fun_s[Fun_n].PC_H;
// SP_A = Fun_s[Fun_n].A;
// SP_B = Fun_s[Fun_n].B;
// SP_DPTRH = Fun_s[Fun_n].DPTR_H;
// SP_DPTRL = Fun_s[Fun_n].DPTR_L;
// SP_PSW = Fun_s[Fun_n].PSW;
// Time_ms = 0;
// }
}
/*******************************************************************************
名:Uart1Seriver
说明:串口中断服务函数
参数:void
返回值:void
任务:串口中断服务,控制通讯
*******************************************************************************/
void Uart1Seriver() interrupt 4 using 2
{
if (RI)
{
RI = 1;
}
if (TI)
{
TI = 1;
}
}
//两个线程:
void Thread1()
{
while(1)
{
TI = 1;
SBUF = 0X11;
while(!TI);
}
}
void Thread2()
{
while(1)
{
TI = 1;
SBUF = 0X22;
while(!TI);
}
}