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();
    
    }
    


  • 相关阅读:
    《集体智慧编程》第7章代码 Python3执行出错
    pymysql.err.IntegrityError: (1062, "Duplicate entry 'roxml-ROXML' for key 'PRIMARY'")
    Linux下MariaDB 安装及root密码设置(修改)
    Excel VBA入门(九)操作工作薄
    Excel VBA入门(八)单元格边框
    Excel VBA入门(七)注释、宏按钮及错误处理
    Excel VBA入门(六)过程和函数
    Excel VBA入门(五)Excel对象操作
    Excel VBA入门(四)流程控制2-循环控制
    Excel VBA入门(三) 流程控制1-条件选择
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5373319.html
Copyright © 2011-2022 走看看