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 2 //任务槽最大个数.
unsigned char data task_stack[MAX_TASKS][2];//任务堆栈.  PC指针为16位,需2个字节task_stack[][0]L  task_stack[][1]H。
unsigned char data task_time[MAX_TASKS];	//定时时间
unsigned char data 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)
{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
{ 	TIMER_RELOAD();	 //定时时间重载rwcl();			 //任务时间是否到,任务时间到 实时切换回
}//****************************************************************示例
unsigned char a=0;
unsigned char bb=0;
void task_test()
{while(1){									  a++;rtos_wait(10);		 //执行完后,记录下一步地址,返回a++;}
}
void task_test2()
{while(1){bb++;rtos_wait(10);		//执行完后,记录下一步地址,返回bb++;}
}
void main()
{Timer0Init();task_test();task_test2();while(1);
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-6488106.html

如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网进行投诉反馈,一经查实,立即删除!


相关文章:

  • 51系列小型操作系统精髓 简单实现12 C语言版加保护参数
  • VC 画坐标 方法
  • VC 画坐标 方法2
  • 51系列小型操作系统精髓 简单实现12 C语言版未加保护参数
  • 轻松学霸 (程序员思考方式)——1 十种有效的学习方法
  • android button按键按下和抬起 长按一直发送
  • android 蓝牙 这个createRfcommSocketToServiceRecord 是安卓2.3系统及以下用的,新的安卓要用createInsecureRfcommSocketToSer
  • android不想覆盖原来apk的方法
  • 对话框android
  • Android开发者版权时间限制 定时在哪段时间可以用。
  • 队列 句句分析 精辟解释 有图
  • 关于 威客,创客,极客,黑客的哲学理解(简单)
  • 程序员的困境 烦恼 内忧外患 穷忙出路
  • 关于助学货款:名牌大学的学生不良信用率是否比普通高校的要高?不是。
  • 超级论工程 超级学习方法 高效简单易行
  • 明日工作安排及今天工作总结-----日志
  • app store生存之道
  • 瘾、热情、兴趣的起源与研究
  • 从每条信息中挖掘利润
  • 数据库rac启停步骤.txt
  • Oracle数据库泵的备份与恢复
  • Android数据保存的3种方式 SharedPreferences存储、文件存储、数据库存储SQLite 未完
  • 今日总结------------既然技术是最不值钱,那就认识所有人吧。
  • VUE3/TS/TSX入门手册指北
  • 1.任何异常及时上报 2.严格按操作手册执行 3.操作谨慎
  • Note: This element has no attached Javadoc and the Javadoc could not be found in the attached source
  • 吸取无数的教训才成为规则,谁还敢轻易破坏它?
  • 今天有一个人退款
  • 今日传奇
  • 好几天来没写了。不知道该说什么好。
  • VC版本限制
  • 用定时器中断,单片机中断处理时间大于定时器定时时间会怎样?
  • 做了一个邮件群发机
  • 2015年年结
  • 想取个店名叫“G点”“G杯”
  • say what
  • 今日目标:学完它。意志+极限
  • 桃花劫
  • 戴眼镜最近眼睛很累,感觉有压力一样,眼压过大;摘掉眼镜后,感觉又好一些,求专业人士原因?
  • 昨天研究了一下,语音技术。
  • 当把目标定为买一栋楼时,买一套房就变得轻而易举,有朋友时,一起疯一起乐一起干活;一个人时,刻苦学习,攻读我的圣经。 不管你身处何方,小黄人软件都是你强大的后盾。
  • 做一个海纳百川的方外之人------我的极乐世界观
  • 程序员的吵架,跟女朋友能讲理吗?
  • 蓝牙通讯程序定制5000元
  • 打卡挂机功能 显示推广帐号 等个人信息 定制需多少钱?
  • 软件有打印按钮,能够直接打印出来。手机上有三星的共享打印组件。
  • 定制 蓝牙开关软件需求说明书 500元
  • 服务器转发软件设计100元
  • 上位机软件需求说明书100元
  • 【计算机基础】操作系统