首页 > 代码库 > 51系列小型操作系统精髓 简单实现3
51系列小型操作系统精髓 简单实现3
现在遇到的问题:
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(); }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。