51单片机基于时间片轮转的简单rtos

这篇具有很好参考价值的文章主要介绍了51单片机基于时间片轮转的简单rtos。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

早就想写写这个了,正好赶上有点时间,写了一下基于51单片机的时间片轮转调度系统,简单的rtos,呵呵。直接上代码。


//基于51单片机时间片轮转的简单rtos。
#include"reg52.h"
sbit led1 = P2^7;
sbit led2 = P2^0;
sbit key = P1^0;
#define MAX_TASKS     3       //定义任务个数.必须和实际任务数一至 
#define PUSH_TIMES    3 	  //时间中断中push使用的次数用debug看进入时间中断时的次数。
#define MAX_TASK_DEP  (PUSH_TIMES+4)  //任务槽深度;
//经过实验,看debug的push次数,加上4就行了。//没有考虑中断嵌套。有嵌套的再大。
unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];      //任务堆栈.
unsigned char current_id;         //当前活动任务号 
unsigned char task_sp[MAX_TASKS];	//堆栈指针组,每个任务一个字节,任务调度前指向入栈的pc高字节。
unsigned int cicle1,cicle2;
void Timer0_Init(void)		//10毫秒@11.0592MHz
{
	AUXR &= 0x7F;			//定时器时钟12T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x00;				//设置定时初始值
	TH0 = 0xDC;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	ET0 = 1;				//使能定时器0中断
	EA=1;					//开总中断
}

//任务装入函数,将任务的首地址(参数1)装入(参数2)指定的任务槽中.
void task_load(unsigned int func, unsigned char taskid)
{ 
        
        task_stack[taskid][0] = (unsigned int)func & 0xff;  //把任务地址的低八位装入任务槽0号地址。
        task_stack[taskid][1] = (unsigned int)func >> 8;    //把任务地址的高八位装入任务槽1号地址
        task_sp[taskid] = (unsigned char)&task_stack[taskid][0]; //把堆栈的首地址送给sp数组。
        task_sp[taskid]++;//先把保存的数组sp值加1,使它指向堆栈入栈pc的高位
//这里模拟了入栈过程,先把任务地址放在任务槽的最低位置,下次切换的时候就直接来这里找。
		   
		if(taskid!=0)									   //如果不是0号任务;
		{
		task_sp[taskid]+= PUSH_TIMES;					   //给push和pop语句留下空间,用debuge看汇编进入中断后的push
		                                               //次数,在文件首部改数字值;
		}
} 

void  os_start() 	 //启动程序
 {
 current_id = 0;	 //把0号sp当作当前的首个sp
 SP = task_sp[0];

 } 
void task1()	//任务1,循环够5万次灯闪动一次
{ 
        while(1)
		{ 
			cicle1++;
				 if (cicle1>50000)
				 {
				  cicle1=0;
				  led1=!led1;
				 }
        } 
} 
void task2()  	//任务2,循环够5万次灯闪动一次
{ 
        while(1)
		{ 
		 	cicle2++;
				 if (cicle2>30000)
				 {
				  cicle2=0;
				  led2=!led2; 
				 }
        } 
} 

void task3()
{ 
        while(1)
		{ 
		  if(key==0)
		   cicle2=10000;
	   //  cicle1=10000;
        } 
} 

void Timer0_Isr(void) interrupt 1	 //时间中断。调度任务。
{
         EA=0; //进入核心临界区关中断
         task_sp[current_id] = SP; 		//将进入时钟中断时的sp存入任务槽。
         if(++current_id == MAX_TASKS) 	//当前任务指向下一个任务号。如果任务号超过任务总数
			current_id=0;				//指向任务0;
		    SP = task_sp[current_id];	//把新任务的pc地址给sp,这样在时间中断出函数的时候系统自动把sp指向的值作为pc高8位;并出栈。
		 EA=1; //开中断。
}
void main()
{
	  
        //这里装载了三个个任务,因此在文件首部定义MAX_TASKS时也必须定义为3 
        task_load(task1, 0);//将task1函数装入0号槽,任务可以装入任意槽。 
        task_load(task2, 1);//将task2函数装入1号槽 
		task_load(task3, 2);//将task3函数装入2号槽 
	    Timer0_Init();		//定时器0初始化
	    key=1;				//口线置位。
		TR0 = 1;			//开始计时
        os_start();         //必须从任务在0号槽的任务开始;
		
 

}

虽然简单,也可以继续学习了。文章来源地址https://www.toymoban.com/news/detail-784015.html

到了这里,关于51单片机基于时间片轮转的简单rtos的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【51单片机】利用【时间延迟】的原理规避【按键抖动问题】

    前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 本章是51LCD单片机设计的一个环节,完整可前往相应博客查看完整 传送门 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Lin

    2024年02月20日
    浏览(59)
  • 51单片机项目(9)——基于51单片机的电子琴设计

    简易电子琴设计设计内容: 1.用矩阵键盘代表琴键,至少能弹出8个音符,分别是:音符1.23.4.,5,6,  2.键按下的时间长短表征节拍的长短,用蜂鸣器发出声音 3.数码管显示出当前音符 4.音量可调 (代码及其工程文件放在最后) 电路图如下: 51单片机电子琴是一种基于51单片机(

    2024年02月09日
    浏览(45)
  • 51单片机项目(7)——基于51单片机的温湿度测量仿真

    本次做的设计,是利用DHT11传感器,测量环境的温度以及湿度,同时具备温度报警的功能:利用两个按键,设置温度阈值的加和减,当所测温度大于温度阈值的时候,蜂鸣器就会响起,进行报警提示。 同时系统还有一个LCD1602屏幕,用于显示实时的温度湿度,还可以显示温度阈

    2024年02月10日
    浏览(47)
  • 单片机和RTOS

    单片机是一种集成了处理器、内存、输入输出接口和外围设备控制器等功能的微型计算机系统。它通常用于控制简单的嵌入式系统,如家电、汽车电子、工业控制等。单片机具有低功耗、低成本和高可靠性等特点。 而RTOS(Real-Time Operating System)是一种实时操作系统,专门设计

    2024年02月20日
    浏览(36)
  • 51单片机实验三:数码管显示时钟 按键调节时间时闪烁提示

    功能效果:1.时分秒的动态显示。2.用三个按键实现时分秒的修改,调节的数字闪烁提示。  

    2024年02月11日
    浏览(36)
  • 51单片机简单计算器实现(100行)附源码

     不引流,项目最后附上本项目百行源码!! 如果对你有帮助不妨点个赞! 本项目使用: 51单片机 , 矩阵键盘 , 四位数码管 使用LCD显示的思路相差不大,由于是仿真,包容性比较强,所以还有很大优化空间         实际上有一定编程基础的同学借助代码里的注释应该

    2024年02月03日
    浏览(46)
  • 基于51单片机的单片机倒车雷达报警系统

      前言 至今世界汽车工业通过了近122年的进展,今世汽车已经超级成熟和普遍了。汽车已经渗透于国防建设、国民经济和人类生活的各个领域当中,成为人类生存必不可少的、最要紧的交通工具,尽管每辆车都有后视镜,但不可幸免地都存在一个后视盲区,倒车雷达那么能够

    2024年02月04日
    浏览(49)
  • 简单的C51单片机项目之LCD1602时钟

    一,实验现象 实验项目现象如下:     这个项目需要用到51单片机板上的功能如下: 1.独立按键 2.LCD1602 3.定时器中断 功能介绍 1.独立按键实现三个功能,选择键,增大键,减小键。 2.lcd1602显示时间 3.定时器中断确定时间 代码如下:    

    2024年02月11日
    浏览(44)
  • C51单片机 简单的交通红绿灯设计一

    各位读者朋友们你们好,感谢你们能点开这篇文章,作为一个非硬件专业的学生,我没有扎实的硬件基础,很担心自己所写内容没有理论基础或者存有漏洞,如果有不对的地方,期待您能指正,一起学习。交通红绿灯的设计算是51的小入门。涉及仅有数码管,LED交通灯,Dela

    2023年04月27日
    浏览(40)
  • 51单片机实现简单的洗衣机控制系统设计

    (1)设计一个洗衣机控制系统,用直流电机的转速表征三种不同洗衣方式:弱洗、强洗、漂洗; (2)用三个独立按键设置待洗衣物的不同洗涤方式,实现最长10分钟定时:     丝质衣服: 漂洗 定时3分钟 棉质衣服:弱洗 2分钟;强洗 5分钟;漂洗 3分钟; 化纤衣服: 强洗

    2023年04月19日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包