51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图)
来源:互联网 发布:中国版bpa软件 编辑:程序博客网 时间:2024/06/03 02:10
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;//设置定时初值 10msTF0 = 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; //任务号设为最大,越过最大则回到0for(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);}
0 0
- 51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图)
- 51系列小型操作系统精髓 简单实现9 C语言版优化后发布(有图)
- 51系列小型操作系统精髓 简单实现11 C语言版优化后说明(有图)
- 51系列小型操作系统精髓 简单实现12 C语言版再优化
- 51系列小型操作系统精髓 简单实现6 C语言版待改进
- 51系列小型操作系统精髓 简单实现7 C语言版待改进
- 51系列小型操作系统精髓 简单实现8 C语言版待改进
- 51系列小型操作系统精髓 简单实现12 C语言版加保护参数
- 51系列小型操作系统精髓 简单实现12 C语言版未加保护参数
- 51系列小型操作系统精髓 简单实现
- 51系列小型操作系统精髓 简单实现2
- 51系列小型操作系统精髓 简单实现3
- 51系列小型操作系统精髓 简单实现4
- 51系列小型操作系统精髓 简单实现5 执行流程
- WinXP操作系统优化精髓
- sms4的简单实现(C语言版)
- skiplist的简单实现(c语言版)
- Win XP操作系统优化精髓
- Android 动画学习笔记
- 如何选购玉雕之选购玉雕的小技巧
- lua 多国语言文本解决方案
- session过滤单个用户登录
- MongoDB---2.6.0的一些改动---认证机制
- 51系列小型操作系统精髓 简单实现10 C语言版优化后发布(有图)
- ScrollView里面嵌套Listview调整listview的高度
- C++习题 对象转换
- Java中的Properties类
- insmod 和modprobe的区别
- Linux 下编译、安装、配置 QT
- 倪光南:政府不宜采购Win8 国产软件筹划接管XP用户
- AJAX的刷新和前进后退问题解决
- js,正则表达式