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


  • 相关阅读:
    linux常用命令
    mysql 开发基础系列20 事务控制和锁定语句(上)
    sql server 性能调优之 资源等待 CXPACKET
    mysql 开发基础系列19 触发器
    mysql 开发基础系列18 存储过程和函数(下)
    mysql 开发基础系列17 存储过程和函数(上)
    sql server 性能调优之 资源等待PAGEIOLATCH
    mysql 开发基础系列16 视图
    mysql 开发基础系列15 索引的设计和使用
    sql server 性能调优之 当前用户请求分析 (1)
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5373319.html
Copyright © 2011-2022 走看看