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

#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();
//任务时间是否到,任务时间到 实时切换回

}

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

时间: 2024-08-03 19:25:02

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

51系列小型操作系统精髓 简单实现8 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

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

#include "STC12C5A.H" #define TIMER_RELOAD()  {TL0=0x00;TH0=0xC4;}//使能T/C  初始10ms #define MAX_TASKS 8 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节. unsigned char idata task_time[MAX_TASKS]; //定时时间 unsigned char

51系列小型操作系统精髓 简单实现11 C语言版优化后说明(有图)

/* CRTOS 实时可剥夺型内核 1.任务不用预加载,不用预定义.任务调用时加载,可删除(退出死循环即可) 2.单位轮转查询时间由晶振和定时器初始化决定.在这里为10ms 3.定时时间为[ time*单位轮转查询时间 ] ,其中time为 rtos_wait(time)中time. 4.可运行多个任务[自定义] 5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序. */ #include "STC12C5A.H" #d

51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图)

4个任务 /* 使用keil4 可运行8个任务 任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来. */ #include "STC12C5A.H" #define TIMER_RELOAD() {TL0=0x00;TH0=0xC4;}//使能T/C 初始10ms #define MAX_TASKS 8 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈. PC指针为16位,需2个字节tas

51系列小型操作系统精髓 简单实现12 C语言版加保护参数

/* CRTOS 实时可剥夺型内核 1.任务不用预加载,不用预定义.任务调用时加载,可删除(退出死循环即可) 2.单位轮转查询时间由晶振和定时器初始化决定.在这里为10ms 3.定时时间为[ time*单位轮转查询时间 ] ,其中time为 rtos_wait(time)中time. 4.可运行多个任务[自定义] 5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序. */ #include "STC12C5A.H" #d

51系列小型操作系统精髓 简单实现9 C语言版优化后发布(有图)

Program Size: data=20.0 xdata=0 code=360 creating hex file from "WK1C_T"... "WK1C_T" - 0 Error(s), 0 Warning(s). /* 使用keil4 可运行8个任务 任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来. */ #include "STC12C5A.H" #define TIMER_RELOAD() {TL0=0x0

51系列小型操作系统精髓 简单实现12 C语言版再优化

/* CRTOS 实时可剥夺型内核 1.任务不用预加载,不用预定义.任务调用时加载,可删除(退出死循环即可) 2.单位轮转查询时间由晶振和定时器初始化决定.在这里为10ms 3.定时时间为[ time*单位轮转查询时间 ] ,其中time为 rtos_wait(time)中time. 4.可运行多个任务[自定义] 5.任务从rtos_wait()处切换,在定时时间到后从定时中断中切换回来,任务执行后,回到中断,再从中断回到主程序. */ #include "STC12C5A.H" #d

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

在51单片机中,不能直接修改PC,但有一种方法是可以改变PC的.函数调用里会把PC值压入堆栈中,调用结束后,会把PC值弹出到PC中. 能改变PC就可以控制程序流程. 1.在任务中切换出去 #define MAX_TASKS 8 //任务槽最大个数. unsigned char idata task_stack[MAX_TASKS][2];//任务堆栈. //保存当前断点 并把SP=SP-2; task_stack[task_id][0] =*(SP--); task_stack[task_id]

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

现在遇到的问题: 1.任务不用预加载,进入一个任务,加载一个任务.没有任务时,定时器怎么处理?当只有一个任务时,怎么处理?多个任务怎么轮转或按优先级切换? 2.关于各任务定时时间,一个一个地减是否麻烦,有没有更好的方法? 3.没有保护寄存,这样切换,是否对?当任务函数有多个层嵌套时,有没有问题? #include "STC12C5A.H" #define TIMER_RELOAD() {TL0=0x00;TH0=0xC4;}//使能T/C 初始10ms #define MAX_TASK