您的位置:首页 > 编程语言 > C语言/C++

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

2014-05-21 17:41 155 查看
#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 *)(SP));

SP--;

task_stack[task_id][0] =*((unsigned char *)(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 *)(SP))=task_stack[i][0];

SP++;

*((unsigned char *)(SP))=task_stack[i][1] ;

}

}

}

}

void tm0_isr() interrupt 1 using 1

{

//定时时间重载

TIMER_RELOAD();

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: