资源简介

基于 51 单片机 多进程 多任务 纯 C语言 实现 死循环 调度 多任务 调度程序

资源截图

代码片段和文件信息

/* 程序仅供参考  禁止非法使用
若有疑问请联系:
邮箱:niewenli.2007@163.com
联系方式:13572614184
联系人:聂先生
QQ:723992349
本人于 2009.8.28
*/
/*
1.本程序不使用任何汇编指令
2.由定时器T0产生中断,切换进程
3.由于中断或调用子程序,要把PC堆栈,故可以以SP为基址的地方找到PC
4.中断或子程序返回,要把SP出栈给PC,故可以操作SP改变程序入口
5.本程序经调试运行  电路图已上传
*/
//头文件
#include
#include 
//宏定义
#define uchar unsigned char
#define uint unsigned int   
#define TN  65436
//进程1,2,3执行时间之比为  T1:T2:T3  (时间单位us)
#define TN1  62536   //1个进程循环周期内进程1执行的时间T1us  TN1=(65536-T1)
#define TN2  55536   //1个进程循环周期内进程2执行的时间T2us  TN2=(65536-T1)
#define TN3  60536   //1个进程循环周期内进程3执行的时间T3us  TN3=(65536-T1)
//
#define N1  10   // 进程1的延时参数  邮箱:niewenli.2007@163.com
#define N2  10   // 进程2的延时参数  联系方式:13572614184
#define N3  10   // 进程3的延时参数  QQ:723992349

//定义全局变量
uint address1address2address3;
uchar test1_1=0test2_1=0test3_1=0PID=1;
//各进程的标志位,是否为第一次执行;PID进程号;
uint ac1ac2ac3; // PC_Next; 各进程的初始地址寄存器.
//test1   的参数  由于进程切换时 没有保存普通变量,
//所以各进程的普通参数需要定义成全局变量.
uint m1i1j1k1;
uchar table1[4];
//test2   的参数   邮箱:niewenli.2007@163.com
int m2i2j2k2;
uchar table2[4];
//test3   的参数 联系方式:13572614184
int m3i3j3k3;    // QQ:723992349
uchar table3[4];

//声明
//unsigned int Get_Next_PC(void);//调用子程序,获取PC
void chushihua(void);   //初始化函数
void test1(void);   //进程一
void test2(void);
void test3(void);

//main函数
void main(void)

// PC_Next=Get_Next_PC();
 chushihua();
 ac1=(unsigned int)(test1);  //获取进程1的入口地址
 ac2=(unsigned int)(test2); //获取进程2的入口地址
 ac3=(unsigned int)(test3);  //获取进程3的入口地址
 //常规任务
 while(1);
}

//初始化时钟
void chushihua(void)
{
    TMOD=0x01; // 邮箱:niewenli.2007@163.com
EA=1; // 联系方式:13572614184
ET0=1; // QQ:723992349
TH0=TN/256;
TL0=TN%256;
TR0=1;
}

//中断处理,进程调度
void time0() interrupt 1 using 0
{
TR0=0;
//进程顺序分配
PID++;
if(PID==4)
   {PID=1;}
 //进程调度
switch(PID)
{
  case 1:  
if(test3_1!=0)
    { //保存现场,还回地址
   address3=*((unsigned char *)(SP-4)); //PC的高字节
           address3 <<= 8;
           address3+=*((unsigned char *)(SP-5));   //PC的低字节
   table3[0]=*((unsigned char *)(SP));  //现场保护
   table3[1]=*((unsigned char *)(SP-1));  //现场保护
   table3[2]=*((unsigned char *)(SP-2));  //现场保护
   table3[3]=*((unsigned char *)(SP-3));  //现场保护
}
    if(test1_1==0)
{ //执行新进程
test1_1=1;
    *((unsigned char *)(SP-4))=ac1>>8;  //PC的高字节
        *((unsigned char *)(SP-5))=ac1 & 0x00ff;  //PC的低字节
}
else
{ //执行新进程,恢复现场
*((unsigned char *)(SP-4))=address1>>8;    //PC的高字节
        *((unsigned char *)(SP-5))=address1 & 0x00ff;  //PC的低字节
*((unsigned char *)(SP))=table1[0];    //现场恢复
*((unsigned char *)(SP-1))=table1[1];    //现场恢复
*((unsigned char *)(SP-2))=table1[2];    //现场恢复
*((unsigned char *)(SP-3))=table1[3];    //现场恢复
}
   TH0=TN1/256;
   TL0=TN1%256;
       TR0=1;
   break;

  case 2:
    if(test1_1!=0)
    {  //保存现场,还回地址
 

评论

共有 条评论