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


  • 相关阅读:
    百度之星 1211 题目一
    acdream 1019 Palindrome 字符串hash
    POJ2480 Longge's problem 欧拉函数
    C#为应用程序注册快捷键
    sql跨数据库查询
    嵌入式轻量级数据库 SQLite和 System.Data.SQLite
    经典问题 C#隐藏和显示窗体
    System.Data.SQLite类Dll下载地址和移植C# SQLite
    CMMI5
    两个ComboBox之间Item的移动
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5373319.html
Copyright © 2020-2023  润新知