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当作当前的首个spSP = 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号槽的任务开始;}

虽然简单,也可以继续学习了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux学习(1)——初识Linux

目录 一、Linux的哲学思想 1.1 基础知识 1.2 根目录下的文件夹 二、Shell 1、Shell的定义 2、Shell的作用 三、Linux命令行 1、Linux通用命令行使用格式 四、Linux命令的分类 1、内部命令和外部命令的理解 2、内部命令和外部命令的区别 3、命令的执行过程 五、编辑…

[每周一更]-(第31期):Mysql安装汇总

写自:20230204 23:25 一. mysql rpm二进制包 rpm -Uvh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm yum install mysql-community-server service mysqld start set password password(“123456”)二. mysql yum安装 1、安装查看有没有安装…

面试题总结(十二)【Qt】【华清远见西安中心】

Qt是什么? Qt是一个跨平台的应用程序开发框架,最初由挪威的Trolltech公司开发。它提供了一套丰富的工具和类库,用于开发图形用户界面(GUI)应用程序、网络应用程序和嵌入式应用程序等。 Qt框架基于C语言编写&#xff0c…

DRF-流量控制-配置: 实现可以使用1/5m等限制规则,drf配置流量控制,drf重写流量控制类

一、base/throttle.py 在drf原生的流量控制中,只能支持1/m,1/s,1/h,1/d 等控制规则,不能实现1/5m,1/10s 等更加精细的控制。要是5分钟访问一次或多次,只能是通过12/h 这种来控制,不太友好。 重写SimpleRateThrottle 类的parse_r…

开源高星精选,10个2023企业级Python测试项目,再不学习今年没了

纸上得来终觉浅,光学习理论知识是不够的。 想要学好软件测试必须要结合实战项目深入掌握,今天给大家分享十个2023最新企业级Python软件测试项目: ▌Rank 1:Requests-HTML v0.9(7385 stars on Github,来自K…

Python-基于fastapi实现SSE流式返回(类似GPT)

最近在做大模型对话相关功能,需要将对话内容流式返回给前端页面(类似GPT的效果)。下面直接说下如何实现: 1.首先导入fastapi和sse流式返回所需要的包 from fastapi import APIRouter, Response, status from sse_starlette.sse …

Vue2+Vue3组件间通信方式汇总(1)------props

目录 一、props (父传子&#xff0c;子传父) ------Vue2 ------Vue3 从Vue2(组合式API)和Vue3&#xff08;选择式API&#xff09;两个版本对每个组件间通信方式进行讲解&#xff1a; 一、props (父传子&#xff0c;子传父) ------Vue2 父组件&#xff1a; <template>&…

以太网的数据速率、互连介质和物理层规范

以太网协议连接已经广泛应用于我们周围的大量事物或设备中。过去&#xff0c;以太网用在局域网 (LAN) 和城域网 (MAN) 中&#xff0c;而如今&#xff0c;由于以太网的普及和多种优势&#xff0c;例如巨大的生态体系和日益增长的规模经济&#xff0c;它越来越多地用在存储和汽车…

鉴赏 tcp vegas

优秀的 vegas 之后&#xff0c;再鉴赏一下迄今唯一像那么回事的拥塞控制算法 vegas。 从下图可看出所有的(对&#xff0c;所有的) aimd 都毫无伸缩性(z:吞吐&#xff0c;x:rtt&#xff0c;y:丢包率&#xff0c;由 buffer_size 直接决定)&#xff1a; 一下就可看出 rtt 和 bu…

JavaSE 内部类

目录 1 实例内部类2 静态内部类3 匿名内部类4 本地内部类 1 实例内部类 内部类&#xff1a; 外部类有一个…或外部类是由什么什么组成的。 实例内部类: 定义在类的内部的一个类。 如何实例化内部类对象&#xff1f; OuterClass.InnerClass innerClass2 out.new InnerClass()…

(四)pytorch图像识别实战之用resnet18实现花朵分类(代码+详细注解)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、关于这个实战的一些知识点Q1&#xff1a;图像识别实战常用模块解读Q2:数据增强Q3:迁移学习Q4&#xff1a;平均全局池化Q5&#xff1a;设置哪些层需要训练时…

大一C语言查缺补漏1 12.2

学习方向非C语言方向&#xff0c;但是专业是。。 仅供参考&#xff0c;&#xff0c;祝大家期末考试顺利。 对于二维数组定义&#xff0c;要给出明确的定义 eg&#xff1a;double a [21][4] int a [ ][3] {1,2,3,4,5,6} 不可以是&#xff1a;int a [ ][3]&#xff1b; 在c…

Unity3d C#利用Editor编辑器拓展实现配置UI背景样式一键设置UI背景样式功能(含源码)

前言 在开发UI滚动列表的时候&#xff0c;经常会有每项的背景图不统一的情况&#xff0c;会间隔重复的情况居多。这种情况下&#xff0c;手动去设置间隔一行的背景图或者颜色是比较麻烦的。在此背景下&#xff0c;笔者尝试写个小工具&#xff0c;在搭建UI时配置一下循环背景的…

《数据结构、算法与应用C++语言描述》- 最小赢者树模板的C++实现

赢者树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_30winnerTree 比赛规则 假定有 n 个选手参加一次网球比赛。比赛规则是“突然死亡法”(sudden-death mode)&#xff1a;一名选手只要输掉一场球&#xff0c;就被淘汰。一对一对…

fill-in-the-middle(FIM) 实现与简单应用

1 背景 传统训练的 GPT 模型只能根据前文内容预测后文内容&#xff0c;但有些应用比如代码生成器&#xff0c;需要我们给出上文和下文&#xff0c;使模型可以预测中间的内容&#xff0c;传统训练的 GPT 就不能完成这类任务。 传统训练的 GPT 只能根据上文预测下文 使用 FIM…

vue-element安装富文本编辑器vue-quill-editor教程

在vue ui面板中安装vue-quill-editor依赖 命令安装 npm install vue-quill-editor --save # or yarn add vue-quill-editor 使用方法 在main.js导入富文本编辑器 import VueQuillEditor from vue-quill-editor import quill/dist/quill.core.css // import styles import…

技术博客:市面上加密混淆软件的比较和推荐

技术博客&#xff1a;市面上加密混淆软件的比较和推荐 引言 市面上有许多加密混淆软件可供开发者使用&#xff0c;但哪些软件是最好用的&#xff1f;哪些软件受到开发者的喜爱&#xff1f;本文将根据一次在CSDN上的投票结果&#xff0c;为大家介绍几款在程序员中普及度较高的…

CEC2013(python):五种算法(ABC、PSO、CSO、OOA、DBO)求解CEC2013(python代码)

一、五种算法简介 1、人工蜂群算法 &#xff08;Artificial Bee Colony Algorithm, ABC&#xff09; 2、粒子群优化算法PSO 3、鸡群优化算法CSO 4、鱼鹰优化算法OOA 5、蜣螂优化算法DBO 二、5种算法求解CEC2013 &#xff08;1&#xff09;CEC2013简介 参考文献&#xff…

机器学习 项目结构 数据预测 实验报告

需求&#xff1a; 我经过处理得到了测试值&#xff0c;然后进一步得到预测和真实值的比较&#xff0c;然后再把之前的所有相关的参数、评估指标、预测值、比较结果都存入excel,另外我还打算做测试报告模板&#xff0c;包括敏感性分析等。您建议我这些功能如何封装这些功能&…

源码部署MySQL

MySQL 1.准备环境 关闭防火墙 [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#systemctl disable firewalld 关闭selinux [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#sed -i %s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config 验证是否通网 …