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

/*

CRTOS 实时可剥夺型内核

1.任务不用预加载,不用预定义。任务调用时加载,可删除(退出死循环即可)

2.单位轮转查询时间由晶振和定时器初始化决定。在这里为10ms

3.定时时间为【 time*单位轮转查询时间 】 ,其中time为 rtos_wait(time)中time.

4.可运行多个任务【自定义】

5.任务从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个字节task_stack[][0]L  task_stack[][1]H。

unsigned char idata task_time[MAX_TASKS]; //定时时间

unsigned char data task_id=0; //当前活动任务号

void Timer0Init() //@18.432MHz

{

AUXR &= 0x7F;
//定时器时钟12T模式

TMOD &= 0xF0;
//设置定时器模式

TMOD |= 0x01;
//设置定时器模式

TIMER_RELOAD()

TF0 = 0;
//清除TF0标志

TR0 = 1;
//定时器0开始计时

ET0=1;

EA=1;

}

void rtos_wait(unsigned char time)

{

task_time[task_id]=time;  
//保存当前任务时间

task_stack[task_id][1] =*((unsigned char data* )(SP));
  //保存当前断点 并把SP=SP-2,任务切换到下一任务;

SP--;

task_stack[task_id][0] =*((unsigned char data*)(SP));

SP--;

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

if(task_id==MAX_TASKS) //任务满 超出则回到0

task_id=0;

}

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

{

//从把定时时间减1 ,找看哪个任务到
,任务时间到 实时切换回

unsigned char data i;

for(i=0;i<MAX_TASKS && task_time[i];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

{

#pragma asm

JB PSW.3,RTOS1

JB PSW.4,RTOS2

PUSH 0

PUSH 1

PUSH 2

PUSH 3

PUSH 4

PUSH 5

PUSH 6

PUSH 7

JMP RTOS0

RTOS1: JB
PSW.4,RTOS3

PUSH 8

PUSH 9

PUSH 10

PUSH 11

PUSH 12

PUSH 13

PUSH 14

PUSH 15

JMP RTOS0

RTOS2:

PUSH 10H

PUSH 11H

PUSH 12H

PUSH 13H

PUSH 14H

PUSH 15H

PUSH 16H

PUSH 17H

JMP RTOS0

RTOS3: PUSH
18H

PUSH 19H

PUSH 1AH

PUSH 1BH

PUSH 1CH

PUSH 1DH

PUSH 1EH

PUSH 1FH

RTOS0:

#pragma endasm

TIMER_RELOAD();
//定时时间重载

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

#pragma asm

JB PSW.3,RTOS01

JB PSW.4,RTOS02

POP 7

POP 6

POP 5

POP 4

POP 3

POP 2

POP 1

POP 0

JMP NEXT

RTOS01: JB
PSW.4,RTOS3

POP 15

POP 14

POP 13

POP 12

POP 11

POP 10

POP 9

POP 8

JMP NEXT

RTOS02:

POP 17H

POP 16H

POP 15H

POP 14H

POP 13H

POP 12H

POP 11H

POP 10H

JMP NEXT

RTOS03: POP
1FH

POP 1EH

POP 1DH

POP 1CH

POP 1BH

POP 1AH

POP 19H

POP 18H

NEXT:

#pragma endasm

}

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

时间: 2024-08-05 02:32:01

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

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

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

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系列小型操作系统精髓 简单实现11 C语言版优化后说明(有图)

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

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_tim

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

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

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

#include <REG52.H> #define MAX_TASKS 2 //任务槽个数.必须和实际任务数一至 #define MAX_TASK_DEP 12 //最大栈深.最低不得少于2 个,保守值为12. unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];//任务堆栈. unsigned char idata task_sp[MAX_TASKS]; unsigned char task_id; //当前活动任务号 //任务切