zoukankan      html  css  js  c++  java
  • 51系列小型操作系统精髓 简单实现3

    如今遇到的问题:

    1.任务不用预载入,进入一个任务。载入一个任务。

    没有任务时。定时器怎么处理?当仅仅有一个任务时,怎么处理?多个任务怎么轮转或按优先级切换?

       2.关于各任务定时时间,一个一个地减是否麻烦,有没有更好的方法?

    3.没有保护寄存,这样切换,是否对?当任务函数有多个层嵌套时。有没有问题?

    #include "STC12C5A.H"
    
    #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C	  初始10ms
    
    #define MAX_TASKS 8 //任务槽个数.必须和实际任务数一至
    #define MAX_TASK_DEP  //最大栈深.最低不得少于2 个,保守值为12.
    unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.
    unsigned char idata task_time[MAX_TASKS];
    unsigned char task_id=0; //当前活动任务号
    bit akg=0,bkg=0;
    /*
    //任务切换函数(任务调度器)
    void task_switch(){
    	task_sp[task_id] = SP;
    	if(++task_id == MAX_TASKS)
    		task_id = 0;
    	SP = task_sp[task_id];
    }	*/
    /*
    //任务装入函数.将指定的函数(參数1)装入指定(參数2)的任务槽中.假设该槽中原来就有任
    //务,则原任务丢失,但系统本身不会错误发生.
    void task_load(unsigned int fn, unsigned char tid){
    	task_sp[tid] = task_stack[tid] + 1;
    	task_stack[tid][0] = (unsigned int)fn & 0xff;	 //低字节
    	task_stack[tid][1] = (unsigned int)fn >> 8;	     //高字节
    }  */
    
    void task_switch_wait(unsigned char time)
    {
    	//任务装入,保存当前位置与数据。
    	//task_load();
    	
    	//任务时间
    	task_time[task_id]=time;
    
    	//保存当前断点 并把SP=SP-2;
    	task_stack[task_id][0] =*(SP--);
    	task_stack[task_id][1] =*(SP--); 
    	
    	if(++task_id == MAX_TASKS)
    		task_id = 0;
    
    	//任务切换到下一任务
    //	task_switch();
    }
    void task_a()
    {
    	while(1)
    	{
    		akg=0;	
    		task_switch_wait(1);  //
    		akg=1;
    	}
    }
    void task_b()
    {
    	while(1)
    	{
    		bkg=0;
    		task_switch_wait(1);
    		bkg=1;
    	}
    }
    void Timer0Init()		//@18.432MHz
    {
    	AUXR &= 0x7F;		//定时器时钟12T模式
    	TMOD &= 0xF0;		//设置定时器模式
    	TMOD |= 0x01;		//设置定时器模式
    	TL0 = 0x00;		//设置定时初值
    	TH0 =0xC4;		//设置定时初值 10ms
    	TF0 = 0;		//清除TF0标志
    	TR0 = 1;		//定时器0開始计时
    
    	ET0=1;
    	EA=1;
    }
    void main()
    {
    	Timer0Init();
    	task_a(); 
    	while(1)
    	{
    		task_b();
    	}
    }
    void tm0_isr() interrupt 1 using 1
    {
    
    	//任务时间是否到。任务时间到 实时切换回
    
    	// 实时切换回
    	SP=task_stack[task_id]+1;	
    
    	//定时时间重载
    	TIMER_RELOAD();
    
    }
    


  • 相关阅读:
    判断回溯法中的标记数组vis在回溯的时候是否要取消标记?
    Linux多线程开发I
    答题小程序开发
    答题活动小程序
    今天来谈谈答题小程序的上下游生态
    挑战答题小程序V2.0
    可以免费出题的答题小程序
    挑战答题小程序上线了
    通过小程序反编译来谈谈小程序的分包加载机制?
    本文介绍下答题小程序V6.0
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5373319.html
Copyright © 2011-2022 走看看