51系列小型操作系统精髓 简单实现3

31 篇文章 0 订阅
15 篇文章 0 订阅

现在遇到的问题:

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

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黄人软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值