当前位置: 首页 > news >正文

手写嵌入式操作系统(基于stm8单片机)

#include <stc8h.h>
#include <intrins.h>
#define MAX_TASKS 2 //简化方面,我们当前操作系统只有2个task
#define MAX_TASK_DEP 32unsigned char idata task_sp[MAX_TASKS];  // 任务的堆栈指针
unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];// 每个一个task任务的堆栈
unsigned char task_id; //当前任务号, 从0开始。//任务状态
typedef enum{TASK_RUNNING, //运行状态TASK_SUSPENDED  //挂起状态
} TaskStatus;typedef struct{unsigned char id; //任务idTaskStatus status; //任务状态unsigned int delay_count; // 延迟计数器unsigned int delay_duration;//延迟时间
}Task ;Task idata tasks[MAX_TASKS] = {{0, TASK_RUNNING,0,0},{1, TASK_RUNNING,0,0},   //两个任务,都是默认运行状态,不延时,
};void Timer0_init(void); //原型函数 
void sleep(unsigned int , unsigned int );// tid, delay_msvoid sleep(unsigned int task_id , unsigned int delay_ms){tasks[task_id].status = TASK_SUSPENDED;tasks[task_id].delay_count = 0;tasks[task_id].delay_duration = delay_ms;}void Timer0_init(){AUXR |= 0x80;		//定时器时钟1T模式TMOD &= 0xF0;		//设置定时器模式EA = 1; // 全局中断允许ET0 = 1; // 定时器0中断允许TR0 = 1;		//定时器0开始计时TL0 = 0x40;		//设置定时初始值TH0 = 0xA2;		//设置定时初始值}void Delay1000ms()		//@24.000MHz
{unsigned char i, j, k;_nop_();_nop_();i = 122;j = 193;k = 128;do{do{while (--k);} while (--j);} while (--i);
}//定义一个任务切换的函数(任务调度器)
void task_switch(){task_sp[task_id] = SP;// 把当前系统的堆栈指针存入到某个小朋友的task_sp里面。task_id = task_id + 1; //任务加1if(task_id == MAX_TASKS){	 task_id = 0;} SP = task_sp[task_id];
}void task0(){//第0号任务, 代表第0个小朋友做的事情。//static unsigned int a = 3;P5M0 = 0x00;P5M1 = 0x00;P53 = 1;while(1){//a = a + 3;//Delay1000ms();//检查自己的状态。如果自己是睡眠状态,就应该交给别的task去执行if(tasks[0].status == TASK_SUSPENDED){task_switch();continue;}sleep(0,1000);P53 = ~P53;task_switch();}
}void task1(){//第1号任务, 代表第1个小朋友做的事情。//static unsigned int b = 5;P4M1 = 0x00;P4M0 = 0x00;P2M1 = 0x00;P2M0 = 0x00;P27 = 0;while(1){//检查自己的状态。如果自己是睡眠状态,就应该交给别的task去执行if(tasks[1].status == TASK_SUSPENDED){task_switch();continue;}//b = b + 5;//Delay1000ms();sleep(1,1000);P27 = ~P27;	task_switch();}
}void Timer0_ISR(void) interrupt 1 {//系统的定时器中断, 每隔1毫秒就执行一下中断函数unsigned char i;for(i =0 ;i<MAX_TASKS;i++){if(tasks[i].status == TASK_SUSPENDED){tasks[i].delay_count++;}if(tasks[i].delay_count >= tasks[i].delay_duration){tasks[i].status = TASK_RUNNING; //睡眠结束		 tasks[i].delay_count = 0;}}}void Timer1_Init(void)		//100微秒@24.000MHz
{AUXR |= 0x40;			//定时器时钟1T模式TMOD &= 0x0F;			//设置定时器模式TL1 = 0xA0;				//设置定时初始值TH1 = 0xF6;				//设置定时初始值TF1 = 0;				//清除TF1标志TR1 = 1;				//定时器1开始计时
}void Timer1_ISR(void) interrupt 3{task_switch();// 在timer1中的中断,进行任务切换。
}//幼儿园老师(操作系统,加载任务的函数)
//fn fn是一个函数的指针,注意数据类型是int 16位的。
//tid task id, 是8位的, 0,1 
//下面函数的作用就是把一个task的函数指针放入对应的堆栈空间里面。
void task_load(unsigned int fn, unsigned char tid){task_sp[tid] =  task_stack[tid] + 1; // 把任务的指针往下一个空间挪一格,两个char了task_stack[tid][0] = fn& 0xff;task_stack[tid][1] = fn>>8;	
}void main(){Timer0_init();Timer1_Init();task_load(task0,0);// 把task0 装载到内存中。task_load(task1,1);// 把task1 装载到内存中。task_id = 0;   SP = task_sp[0];
}

相关文章:

手写嵌入式操作系统(基于stm8单片机)

#include <stc8h.h> #include <intrins.h> #define MAX_TASKS 2 //简化方面,我们当前操作系统只有2个task #define MAX_TASK_DEP 32unsigned char idata task_sp[MAX_TASKS]; // 任务的堆栈指针 unsigned char idata task_stack[MAX_TASKS][MAX_TASK_DEP];// 每个…...

vue3.3 ~

defineModel 原本&#xff1a; // 1 defineProps({modelValue: {type: Number,required: true,default: 0} })defineProps([modelValue]) // 2 const emit defineEmits([update:modelValue])现在&#xff1a; const value defineModel<number>({ default: 0 })defin…...

滑动窗口实例4(将x减到0的最小操作数)

题目&#xff1a; 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 &#xff0c;返回 …...

数据库原理及应用(MySQL)

建议大屏观看&#xff0c;避免格式错误&#xff0c;影响观感 目录 第一章 数据库系统概述 1.数据库系统概述 1.1.信息 1.2.数据 1.3.信息和数据之间的联系 1.4.数据库&#xff08;DB&#xff09; 1.5.数据库管理系统&#xff08;DBMS&#xff09; 1.6.数据库管理系统的…...

初识Maven(一)命令行操作和idea创建maven工程

Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供**构建**和**依赖**管理支持的工具。 构建过程包含的主要的环节&#xff1a;- 清理&#xff1a;删除上一次构建的结果&#xff0c;为下一次构建做好准备 - 编译&#xff1a;Java 源程序编译成 *.class 字节码文件…...

MHA高可用配置及故障切换

1&#xff0e;什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过…...

FPGA/IC秋招面试题 1(解析版)

分享个人觉得遇到还不错的题&#xff0c;后续有会继续补充。。。 以下题目均来自网络平台&#xff0c;用于学习交流如有侵权立马删除!!! 1. Verilog语言中&#xff0c;下面哪些语句不可被综合() A. #delay语句 B. initial语句 C. always语句 D. 用gen…...

华为云 异构数据迁移

数据库和应用迁移 UGO&#xff08;Database and Application Migration UGO&#xff0c;以下简称为UGO&#xff09;是专注于异构数据库结构迁移的专业服务。可将源数据库中的DDL、DML和DCL一键自动转换为华为云GaussDB/RDS的SQL语法&#xff0c;通过数据库评估、对象迁移两大核…...

wininet,winhttp,xmlhttprequest,各版本区别 《转》

一、标准API接口WinINet(Microsoft Windows Internet)和WinHTTP(Microsoft Windows HTTP) 实现Http访问&#xff0c;微软提供了二套API&#xff1a;WinINet, WinHTTP&#xff08;分别封装于system32目录下的wininet.dll和winhttp.dll内&#xff09; 二者主要区别在于后者更为安…...

朴素,word,任何参考文献导入endnote

朴素&#xff0c;word&#xff0c;任何参考文献导入endnote 注意&#xff1a;对于以下这几种不做阐述&#xff0c;看其他帖子都有讲述&#xff1a; 这里的参考文献指的是类似于&#xff1a; [1]. Li Y, Lu Y, Huo X, et al. Bandgap tuning strategy by cations and halide io…...

数学建模--三维图像绘制的Python实现

目录 1.绘制三维坐标轴的方法 2.绘制三维函数的样例1 3.绘制三维函数的样例2 4.绘制三维函数的样例3 5.绘制三维函数的样例4 6.绘制三维函数的样例5 1.绘制三维坐标轴的方法 #%% #1.绘制三维坐标轴的方法 from matplotlib import pyplot as plt from mpl_toolkits.mplot3…...

Spring Cloud Alibaba-Feign整合Sentinel

第1步: 引入sentinel的依赖 <!--sentinel客户端--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> 第2步: 在配置文件中开启Feign对Sentinel的…...

zabbix配置钉钉告警、和故障自愈

钉钉告警python脚本 cat python20 #!/usr/bin/python3 #coding:utf-8 import requests,json,sys,os,datetime # 机器人的Webhook地址 webhook"钉钉" usersys.argv[1] textsys.argv[3] data{"msgtype": "text","text": {"conten…...

Web安全测试(五):XSS攻击—存储式XSS漏洞

一、前言 结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬! 全部文章请访问专栏:《全栈安全测试教程(0基…...

本地PC机通过SSH方式远程Jetson

1. 检测电脑是否安装openSSH 以管理员身份运行powershell终端输入以下命令&#xff1a; Get-WindowsCapability -Online | ? Name -like OpenSSH*若没有安装OpenSSH&#xff0c;会出现如下图提示&#xff1a; 输入Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.…...

面向对象 学习黑马视频(03)

1.内存分区模型 /* 面向对象编程** 内存分区模型* 1.代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统进行管理的* 2.全局区&#xff1a;存放全局变量和静态变量以及常量* 3.栈区&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值…...

FinClip 支持创建 H5应用类小程序;PC 终端 优化升级

FinClip 的使命是使您能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型。不妨让我们看看本月产品与市场发布亮点&#xff0c;是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f447;&#x1f447; FinClip 支持创建 H5应用类小程序 近期我们…...

YOLOV8实例分割——详细记录环境配置、自定义数据处理到模型训练与部署

前言 Ultralytics YOLOv8是一种前沿的、最先进的&#xff08;SOTA&#xff09;模型&#xff0c;它在前代YOLO版本的成功基础上进行了进一步的创新&#xff0c;引入了全新的特性和改进&#xff0c;以进一步提升性能和灵活性。作为一个高速、精准且易于操作的设计&#xff0c;YO…...

2309ddocx02文档

风格,页眉和页脚等内容与主要分开,允许在起始文档中放大量自定义,然后在生成文档中显示. 打开文档 from docx import Document document Document() document.save("test.docx")真正打开文档 要用文件名打开文档: document Document("existing-document-f…...

第一章初识微服务

文章目录 认识微服务单体架构分布式架构需要考虑的问题 微服务微服务的具体架构微服务技术对比企业中的技术需求 总结 服务拆分注意事项 认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...