首页 > 代码库 > 51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图)
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个字节task_stack[][0]L task_stack[][1]H。unsigned char idata task_time[MAX_TASKS]; //定时时间unsigned char task_id=0; //当前活动任务号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 rtos_wait(unsigned char time){ static unsigned char i; 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--; // 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;// } }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(); //任务时间是否到,任务时间到 实时切换回}//****************************************************************示例unsigned char a=0;unsigned char b=0;unsigned char c=0;unsigned char d=0;void task_test(){ while(1) { a++; rtos_wait(1); //执行完后,记录下一步地址,返回 a++; }}void task_test2(){ while(1) { b++; rtos_wait(2); //执行完后,记录下一步地址,返回 b++; }}void task_test3(){ while(1) { c++; rtos_wait(3); //执行完后,记录下一步地址,返回 c++; }}void task_test4(){ while(1) { d++; rtos_wait(4); //执行完后,记录下一步地址,返回 d++; }}void main(){ Timer0Init(); task_test(); task_test2(); task_test3(); task_test4(); while(1);}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。