码迷,mamicode.com
首页 > 编程语言 > 详细

51系列小型操作系统精髓 简单实现8 C语言版待改进

时间:2014-05-24 22:13:10      阅读:318      评论:0      收藏:0      [点我收藏+]

标签:操作系统   源码   任务调度   数据   c语言   

使用keil4  ,代码Code Optimization:0   运行OK

可运行8个任务

Program Size: data=21.0 xdata=0 code=401  (包括2个示例变量,未优化)

任务从中断处切换,在定时时间到后从定时中断中切换回来。



待改进地方

1.手动优化汇编程序

2. 重入问题

3.参数进函数和时中断的保护问题


#include "STC12C5A.H"



#define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C 初始10ms


#define MAX_TASKS 2 //任务槽最大个数.
unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节task_stack[][0]L  task_stack[][1]H。
unsigned char idata task_time[MAX_TASKS]; //定时时间
unsigned char task_id=0; //当前活动任务号


void rtos_wait(unsigned char time)
{
static unsigned char i;
//保存当前任务时间
task_time[task_id]=time;
//保存当前断点 并把SP=SP-2,任务切换到下一任务;
task_stack[task_id][1] =*((unsigned char data* )(SP));
SP--;
task_stack[task_id][0] =*((unsigned char data*)(SP));
SP--;

/* //任务号
if(++task_id == MAX_TASKS)
task_id = 0;
 */
//任务号设为最大,越过最大则回到0
for(i=0;i<MAX_TASKS;i++)
{
if(task_time[i]==0)//根据定时时间判断
{
task_id=i;
break;
}
}
// if(i==MAX_TASKS) //任务满 超出则回到0
// {
// task_id=0;
// }

}
unsigned char a=0;
unsigned char b=0;
void task_test()
{
while(1)
{
a++;
rtos_wait(100);//执行完后,记录下一步地址,返回
a++;


}
}
void task_test2()
{
while(1)
{
b++;
rtos_wait(10);//执行完后,记录下一步地址,返回
b++;
}
}
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_test();
task_test2();
while(1);
}
void rwcl() //任务时间是否到,任务时间到 实时切换回
{
//从把定时时间减1 ,找看哪个任务到,任务时间到 实时切换回
static unsigned char i;
for(i=0;i<MAX_TASKS;i++)
{
if(task_time[i])
{
task_time[i]--;
if(task_time[i]==0)//多个定时时间同时到,任务越靠后,越优先执行。
{
task_id=i; //当前任务号
//保存的PC指针调出来
SP++;
(*((unsigned char data*)(SP)))=task_stack[i][0];
SP++;
(*((unsigned char data*)(SP)))=task_stack[i][1] ;
}
}
}
}
void tm0_isr() interrupt 1 //using 1
{
  //定时时间重载
TIMER_RELOAD();


rwcl(); //任务时间是否到,任务时间到 实时切换回
}

51系列小型操作系统精髓 简单实现8 C语言版待改进,布布扣,bubuko.com

51系列小型操作系统精髓 简单实现8 C语言版待改进

标签:操作系统   源码   任务调度   数据   c语言   

原文地址:http://blog.csdn.net/chenhao0568/article/details/26580925

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!