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

裸机与操做系统区别(RTOS)

        声明:该系列笔记是参考韦东山老师的视频,链接放在最后!!!

        rtos:这种系统只实现了内核功能,比较简单,在嵌入式开发中,某些情况下我们只需要多任务,而不需要文件功能,相反带上了文件工能反而对内存有限的单片机反而是一种负担。

        裸机开发程序执行流程:如果没有操作系统的的使用称为裸机开发,如果在while()循环里面有两个调度函数需要执行,程序执行顺序是在执行完A函数之后,才会去执行B函数。

int main()
{while(1)
{Mother_Freed();//A函数Mother_Message();//B函数
}
return 0;
}

 

        这就造成了一个问题,那就是,在执行A函数的期间B函数是得不到相应的,只能等待A函数,执行结束,A函数是喂孩子,B函数是回复消息,如果B函数执行时间过长,不执行A函数孩子是不是就饿死了。为了解决这个问题可以加入操作系统,也就是freertos。

        rtos开发程序执行流程:rtos操作系统会将执行函数,封装为任务,每个任务分配时间达到时间切换任务,由于分配时间较短,在外界看来就是同时执行多任务,使用操作系统就可以解决上面的难题。

             

            

void Mother_Freed(void);//声明函数
void Mother_Message(void);//声明函数int main()
{
create_task(喂饭);//创建任务 
create_task(发消息);//创建任务
start_scheduler();//执行任务调度器
while(1)
{
sleep();
}}
void Mother_Freed(void)//封装
{
while(1)
{
Mother_free();//调用函数喂饭
}
}
void Mother_Message(void)//封装
{
while(1)
{
Mother_message();//调用函数发消息
}
}

        rtos互斥操作:在操作系统中,同时执行多个任务的时候,如果多任务访问同一资源,就会发生互斥,这个时候会出现数据混乱,有可能出现死锁,可以通过软件加入变量,互斥使用系统资源。

int g_canuse = 1;
03
04 void uart_print(char *str)
05 {
06     if (g_canuse)
07 {
08     g_canuse = 0;
09     printf(str);
10     g_canuse = 1;
11 }
12 }
13
14 task_A()
15 {
16     while (1)
17 {
18     uart_print("0123456789\n");
19 }
20 }
21
22 task_B()
23 {
24     while (1)
25 { uart_print("abcdefghij");
27 }
28 }
29
30 void main()
31 {
32 // 创建 2 个任务
33     create_task(task_A);
34     create_task(task_B);
35 // 启动调度器
36     start_scheduler();
37 }

       当 g_canuse = 0;这个变量等于0的时候,就可以,对大多数访问同一资源的情况出现互斥,但是只是大部分,因为rtos这个操作系统,在执行任务转换的时候,A执行进入if函数转换,B函数执行printf();执行一般转换,在执行A就会发现打印出来的数字还是乱码的情况,但是可以避免大部分情况。

        出现上面的原因是因为,先变量判断在赋值,如果我们将赋值提前可以避免,出现失误嘛,如果,我们将usart_printf();这个函数重新定义为一下格式,会不会完全避免这种情况。

01 void uart_print(char *str)
02 {
03 g_canuse--; ① 减一
04 if( g_canuse == 0 ) ② 判断
05 {
06 printf(str); ③ 打印
07 }
08 g_canuse++; ④ 加一
09 }

        这里即使将变量赋值提前,但是还是会出现打印出错的情况,语句1的执行可以分为3个步奏,1从内存读取变量的值放入寄存器2修改寄存器的值让变量减1 3把寄存器的值写到内存变量上面如果执行12切换到B任务,此时变量还是1,B任务执行进行printf打印一半进行切换,A任务会从打断地方执行,也能进入if函数,这个时候打印出来也会是混乱的值。

        当我们使用rtos,写多任务程序的时候一定要注意,函数资源互斥问题,任何一种操作系统都会提供相应的函数。

         rtos互斥操作:如果任务之间有依赖关系,比如任务 A 执行了某个操作之后,需要任务 B 进行后续的处理。如果代码如下编写的话,任务 B 大部分时间做的都是无用功。

// RTOS 程序
02 int flag = 0;
03
04 void task_A()
05 {
06 while (1)
07 {
08 // 做某些复杂的事情
09 // 完成后把 flag 设置为 1
10 flag = 1;
11 }
12 }
13
14 void task_B()
15 {
16 while (1)
17 {
18 if (flag)
19 {
20 // 做后续的操作
21 }
22 }
23 }
24
25 void main()
26 {
27 // 创建 2 个任务
28 create_task(task_A);
29 create_task(task_B);
30 // 启动调度器
31 start_scheduler();
32 }
上述代码中,在任务 A 没有设置 flag 为 1 之前,任务 B 的代码都只是去判断 flag。而
任务 A、B 的函数是依次轮流运行的,假设系统运行了 100 秒,其中任务 A 总共运行了 50
秒,任务 B 总共运行了 50 秒,任务 A 在努力处理复杂的运算,任务 B 仅仅是浪费 CPU 资源。
如果可以让任务 B 阻塞,即让任务 B 不参与调度,那么任务 A 就可以独占 CPU 资源加快
处理复杂的事情。当任务 A 处理完事情后,再唤醒任务 B。示例代码如下:
// RTOS 程序
02 void task_A()
03 {
04 while (1)
05 {
06 // 做某些复杂的事情
07 // 释放信号量,会唤醒任务 B;
08 }
09 }
10
11 void task_B()
12 {
13 while (1)
14 {
百问网
13
15 // 等待信号量, 会让任务 B 阻塞
16 // 做后续的操作
17 }
18 }
19
20 void main()
21 {
22 // 创建 2 个任务
23 create_task(task_A);
24 create_task(task_B);
25 // 启动调度器
26 start_scheduler();
27 }

相关文章:

裸机与操做系统区别(RTOS)

声明:该系列笔记是参考韦东山老师的视频,链接放在最后!!! rtos:这种系统只实现了内核功能,比较简单,在嵌入式开发中,某些情况下我们只需要多任务,而不需要文件…...

详解 ClickHouse 的分片集群

一、简介 分片功能依赖于 Distributed 表引擎,Distributed 表引擎本身不存储数据,有点类似于 MyCat 之于 MySql,成为一种中间件,通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据 ClickHouse 进行分片集群的…...

AI问答-医疗:什么是“手术报台”

手术报台并不是传统意义上的医疗工具或设备,而是一个与手术耗材追溯管理相关的系统或工具。以下是对手术报台的详细解释: 一、定义与功能 手术报台系统,如医迈德手术报台系统,是一款面向医院跟台人员的微信小程序。 它通过手术耗…...

S-Clustr(影子集群)V3 高并发,去中心化,多节点控制

S-Clustr 项目地址:https://github.com/MartinxMax/S-Clustr/releases/tag/S-Clustr-V3.0 Maptnh Не ограничивайте свои действия виртуальным миром. GitHub: Maptnh Jay Steinberg Man kann die Menschen, die man hasst, in d…...

支持WebDav的网盘infiniCloud(静读天下,Zotero 等挂载)

前言 WebDav是一种基于HTTP的协议,允许用户在Web上直接编辑和管理文件,如复制、移动、删除等。 尽管有一些网盘支持WebDav,但其中大部分都有较多的使用限制。这些限制可能包括:上传文件的大小限制、存储空间的限制、下载速度的限…...

Linux命令行导出MySQL数据库备份并压缩

Linux命令行导出MySQL数据库备份并压缩 导出SQL: 如果使用的是 MySQL 或者 MariaDB 可以使用mysqldump工具进行数据备份的导出; 基本命令: mysqldump -u用户名 -p密码 数据库名称 > 要导出的文件名.sql替换掉你实际的数据库“用户名”…...

二叉树的广度优先搜索(层次遍历)

目录 定义 层序遍历的数据结构 实现过程简述 具体代码 定义 层序遍历就是从左到右一层一层地遍历二叉树。 层序遍历的数据结构 层序遍历需要借用一个辅助数据结构实现,由于队列具有先进先出的特性,符合一层一层遍历的逻辑,而栈先进后出…...

AU音频重新混合音频,在 Adobe Audition 中无缝延长背景音乐,无缝缩短BGM

导入音频,选中音频,并且点 New Multitrack Session 的图标 设计文件名和存储路径,然后点 OK 点 Essential Sound 面板点 Music (如果没有这个面板 点菜单栏 Windows > Essential Sound 调出来) 点 Duration 展…...

11-Django项目--Ajax请求二

目录 模版: demo_list.html perform_list.html 数据库操作: 路由: 视图函数: Ajax_data.py perform.py 模版: demo_list.html {% extends "index/index.html" %} {% load static %} # 未实现修改,删除操作{% block content %}<div class"container…...

代码评审——Java占位符%n的处理

问题描述 在软件开发项目中&#xff0c;特别是在处理动态内容生成与呈现至前端界面的过程中&#xff0c;正确运用占位符以确保文本完整性和数据准确性显得尤为重要。不当的占位符管理不仅可能导致语法错误或逻辑混乱&#xff0c;还会引发一系列隐蔽的问题&#xff0c;这些问题…...

超低排放标准

据朗观视觉小编了解发现&#xff0c;超低排放标准作为衡量一个行业或企业环保水平的重要指标&#xff0c;越来越受到社会各界的关注。本文将深入探讨超低排放标准的内涵、实施意义以及未来展望。 一、超低排放标准的定义 超低排放标准&#xff0c;是指在特定工业生产过程中&am…...

Day15 —— 大语言模型简介

大语言模型简介 大语言模型基本概述什么是大语言模型主要应用领域大语言模型的关键技术大语言模型的应用场景 NLP什么是NLPNLP的主要研究方向word2vecword2vec介绍word2vec的两种模型 全连接神经网络神经网络结构神经网络的激活函数解决神经网络过拟合问题的方法前向传播与反向…...

使用了CDN,局部访问慢,如何排查

如果是局部访问慢&#xff0c;则可从如下角度查看 是否DNS设置错误导致&#xff1f; 个别用户可能存在local DNS设置错误&#xff0c;导致出现跨地域或跨运营商访问。因为CDN的权威DNS是基于用户请求的localDNS来判断所属的地区和运营商&#xff0c;从而将请求引导至对应最近…...

谈谈SQL优化

SQL优化是数据库性能优化中的关键环节&#xff0c;旨在提高查询执行的效率和响应速度。下面是一些常见的SQL优化技巧和策略&#xff0c;涵盖索引、查询设计、表结构设计等方面&#xff1a; 1. 索引优化 创建索引&#xff1a;为常用查询的过滤条件&#xff08;WHERE 子句&…...

力扣随机一题 6/26 哈希表 数组 思维

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 题目一&#xff1a; 2869.收集元素的最少操作次数【简单】 题目&#xff…...

自动化办公04 使用pyecharts制图

目录 一、柱状图 二、折线图 三、饼图 四、地图 1. 中国地图 2. 世界地图 3. 省会地图 五、词云 Pyecharts是一个用于数据可视化的Python库。它基于Echarts库&#xff0c;可以通过Python代码生成各种类型的图表&#xff0c;如折线图、柱状图、饼图、散点图等。 Pyecha…...

【Elasticsearch】在es中实现mysql中的FIND_IN_SET查询条件

需求场景: 有个文章表里面有个type字段,它存储的是文章类型,有 1头条、2推荐、3热点、4图文等等 。 商品表中有一个type字段,储存的事商品类型例如:1.热销单品,2.品类TOP10,3.销量榜TOP10等等 它的type字段值很有可能是1,2,3,4 在mysql中实现语句 select * from produc…...

内网一键部署k8s-kubeshpere,1.22.12版本

1.引言 本文档旨在指导读者在内网环境中部署 Kubernetes 集群。Kubernetes 是一种用于自动化容器化应用程序部署、扩展和管理的开源平台&#xff0c;其在云原生应用开发和部署中具有广泛的应用。然而&#xff0c;由于一些安全或网络限制&#xff0c;一些组织可能选择在内部网络…...

Python数据分析第一课:Anaconda的安装使用

Python数据分析第一课&#xff1a;Anaconda的安装使用 1.Anaconda是什么&#xff1f; Anaconda是一个便捷的获取包&#xff0c;并且对包和环境进行管理的虚拟环境工具,Anaconda包括了conda、Python在内的超过180多个包和依赖项 简单来说&#xff0c;Anaconda是包管理器和环境…...

数据结构——

1. 什么是并查集&#xff1f; 在计算机科学中&#xff0c;并查集&#xff08;英文&#xff1a;Disjoint-set data structure&#xff0c;直译为不数据结构交集&#xff09;是一种数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint sets&#xff0c;一系列没有重复元…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...