裸机与操做系统区别(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 }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

49-3 内网渗透 - MSI安 装策略提权

靶场环境搭建: 这里还是用我们之前的windows2012虚拟机进行搭建 1)打开一些设置让靶场存在漏洞 打开组策略编辑器(gpedit.msc) 使用运行命令打开: 按下 Win + R 组合键来打开运行对话框。输入 gpedit.msc,然后按下 Enter 键。使用搜索打开: 点击任务栏上的搜索框(W…

简单的text/html无法解析解决记录

简单的text/html无法解析解决记录 1. bug发现 我们所有的服务都是微服务,服务间调用都是使用feign接口进行调用,正常调用都没有问题,但是某一天发现部分从esb服务调用过来到我们本地的服务,本地服务再使用feign接口调用其他微服…

Java洗鞋小程序预约系统源码

💥洗鞋神器来袭!轻松预约,让你的鞋子焕然一新👟 🎉 告别洗鞋烦恼,洗鞋预约小程序来啦! 你是不是常常为洗鞋而烦恼?手洗太累,送去洗衣店又贵又麻烦。现在,好…

js计算某个时间距离当前时间多少天,少于7天红色展示

效果图 后端返回数据格式 info:{vip_validity:"2027-09-07" }<div>到期时间&#xff1a;{{ info.vip_validity }}, 剩余<span :class"countdownDays(info.vip_validity) < 7 ? surplus : ">{{ !!info.vip_validity ? countdownDays(inf…

【ARM-Linux篇】项目:智能家居

一、项目概述 •项目功能 通过语音控制客厅灯、卧室灯、风扇、人脸识别开门等,可以进行火灾险情监测,可以并且实现Sockect发送指令远程控制各类家电等 •项目描述 全志H616通过串口连接各模块硬件,检测语音的识别结果,分析语音识别的结果来对家电设备进行控制。摄像头拍…

Superagent:一个开源的AI助手框架与API

在人工智能日益普及的今天,如何将AI助手无缝集成到应用中成为了开发者们关注的焦点。今天,我们要介绍的Superagent正是一个为这一需求量身打造的开源框架与API。它结合了LLM、检索增强生成(RAG)和生成式AI技术,为开发者们提供了一个强大而灵活的解决方案。 一、Superagen…

PID原理及控制算法详解

文章目录 1. 概念 1.1 PID框图 1.2 具体示例&#xff1a;无人机高度控制 2. PID原理 3. 常用术语 4. 计算过程 4.1 比例控制&#xff08;Proportional&#xff09; 4.2 积分控制&#xff08;Integral&#xff09; 4.3 微分控制&#xff08;Derivative&#xff09; 5.…

6.18-6.26 旧c语言

第一章 概述 32关键字 9种控制语句 优点&#xff1a;能直接访问物理地址&#xff0c;位操作&#xff0c;代码质量高&#xff0c;执行效率高 可移植性好 面向过程&#xff1a;以事件为中心 面向对象&#xff1a;以实物为中心 printf&#xff1a;系统定义的标准函数 #include&l…

[图解]建模相关的基础知识-19

1 00:00:00,640 --> 00:00:04,900 前面讲了关系的这些范式 2 00:00:06,370 --> 00:00:11,570 对于我们建模思路来说&#xff0c;有什么样的作用 3 00:00:12,660 --> 00:00:15,230 我们建模的话&#xff0c;可以有两个思路 4 00:00:16,790 --> 00:00:20,600 一个…

《Redis设计与实现》阅读总结-3

第 12 章 事件 Redis服务器是一个事件驱动程序&#xff0c;服务器需要处理两类事件&#xff1a;文件事件和时间事件 一、文件事件 1. 文件处理器&#xff1a;Redis基于Reactor模式开发了自己的网络事件处理器被称为文件处理器 文件事件处理器使用I/O多路复用程序来同时监听多…

electron线上跨域问题

一、配置background.js win new BrowserWindow({webPreferences: {nodeIntegration: true, // 使渲染进程拥有node环境//关闭web权限检查&#xff0c;允许跨域webSecurity: false,// Use pluginOptions.nodeIntegration, leave this alone// See nklayman.github.io/vue-cli-p…

win11系统重装?正版系统Windows11安装重启!保姆级重装系统攻略!

随着科技的不断发展&#xff0c;Windows 11系统已经逐渐成为了众多电脑用户的新选择。然而&#xff0c;当当电脑出现严重故障、受到病毒攻击、软件冲突、系统升级失败、硬件更换或升级、系统性能下降或个性化需求等情况时&#xff0c;重装系统可能是一个有效的解决方案。本文将…

江协科技51单片机学习- p16 矩阵键盘

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

武汉星起航:跨境电商浪潮下,中国卖家扬帆出海,书写国际新篇章

随着全球化进程的加速和互联网技术的飞速发展&#xff0c;跨境出口电商模式已成为中国卖家海外拓展的重要渠道。这一模式不仅为商家带来了巨大的市场机遇&#xff0c;更为中国卖家在全球舞台上展示其独特魅力和竞争力提供了宝贵平台。武汉星起航将从多个维度探讨中国卖家海外发…

基于 GD32F450 的Zephyr 的基本测试-编译工程

一、cmake 编译 hello world 测试 打开示例工程 hello world cd ~/zephyrproject/zephyr/samples/hello_world新建 build 目前&#xff0c;用于存放临时文件目录&#xff0c;并进入该目录 mkdir -p build && cd build通过 cmake 指令 生成 gd32f450z 工程的 makefil…

聚观早报 | 小鹏MONA M03曝光;iPhone 16系列电池改进

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 6月25日消息 小鹏MONA M03曝光 iPhone 16系列电池改进 一加Ace 3 Pro三款配色 字节跳动与博通合作开发AI芯片 蚂…

【efinix】efinity如何安装官方补丁patch

efinix官网可以下载efinity的官方补丁。 下载 efinity-2023.2.307.5.10-windows-x64-patch.zip 解压缩补丁zip 压缩包内容 files/ : updated files to be copied into the Efinity installation run.sh : patch installation script (Linux on…

Open3D 显示带有强度的点云数据

目录 一、概述 1.1强度信息的意义 1.2应用场景 二、代码实现 三、实现效果 一、概述 在点云数据中&#xff0c;强度&#xff08;Intensity&#xff09;指的是激光雷达传感器在扫描环境时&#xff0c;每个点返回的反射强度值。这些强度值代表了激光脉冲返回的能量&#xff…

python目录树生成器

代码如下&#xff1a; import os from colorama import Fore, Style, init from tkinter import Tk, Label, Entry, Button, Text, Scrollbar, RIGHT, Y, END# 初始化 colorama init(autoresetTrue)def print_directory_tree(root_dir, text_widget, indent, lastTrue):"…

Qt Quick Effect Maker 工具使用介绍

一、介绍 随着 Qt 版本的不断升级,越来越多的功能被加入 Qt,一些新的工具也随之应运而生,Qt Quick Effect Maker 工具是 Qt 6.5 之后才新添加的工具,之前的名字应该是叫做 Qt shader tool 这个模块。 以下是官方的释义:Qt Quick Effect Maker是一个用于为Qt Quick创建自定…