ZmjOS单片机裸机编程风格 > ZOS(STC系列的PC方式的任务调度示例)


这是基于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);
			}
		}