FreeRTOS_从底层学习实时操作系统

news2024/11/27 21:54:33

目录

1. 裸机系统和多任务系统

2. 任务的定任务切换的实现

2.1 什么是任务?

2.2 调度器

2.3 临界段

3. 空闲任务和阻塞延迟

4. 时间片


1. 裸机系统和多任务系统

裸机系统:

        裸机系统分为轮询系统前后台系统;(51单片机就属于裸机系统)

        轮询系统是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在死循环里面不断的循环,顺序的做各种事情。(也就是我们写51单片机程序时,初始化好相关的外设,然后在主程序 int main() 中的 while(1) 不断的循环我们想要通过外设来实现的功能)

        相比于轮询系统,前后台系统是在轮询系统的基础之上加入了中断。

        前台:中断服务程序接收异步中断,来通知后台,后台收到中断请求后进行处理。

void XXX_ISR(void)
{
    Clear interrupt;
    Read data;
}

        后台:应用程序通常是一个无限的循环,在循环中,通过调用相应的处理函数,完成相应的操作,这部分可以看做是后台行为。

void main(void)
{
    init();
    while(1)
    {
        Task(1);
        Task(2);
        Task(3);
        Task(4);
        ……            
    }
}

多任务系统:

        在多任务系统中,每个任务都是独立的,任务跟中断一样,也具有优先级,优先级高的任务会被优先执行。

void XXX_ISR(void)
{
    Clear interrupt;
    Read data;
}

void Task1()
{
    while(1)
    {
        /*无限循环*/
        do_xxxx();
    }
}

void Task2()
{
    while(1)
    {
        /*无限循环*/
        do_xxxx();
    }
}

        多任务系统就是:首先后台会分布着多个任务,假设是 A B C D ,这个时候会通过调度器分配哪个任务开始运行,任务中也会存在优先级高的任务,优先级高的任务先执行,执行完以后会返回后台接着执行优先级低的任务,如果有中断,那么会优先执行中断;

2. 任务的定任务切换的实现

2.1 什么是任务?

        根据功能的不同,把整个系统分割成一个个独立的且无法返回(void)的函数,这个函数我们称之为任务

        比方说,我们在裸机系统中,LED0和LED1呈现流水灯,那么程序应该是LED0点亮,延迟,LED1熄灭,延迟,LED0熄灭,延迟,LED1点亮,延迟;而在操作系统中,LED0和LED1是同时进行的;

        在裸机系统中,局部变量统统放在一个叫栈的地方(调用子函数或者发生中断时,它们会将这些变量压入栈中;其他的全局变量统统存放在 RAM 中),栈是单片机 RAM 里面一段连续的内存空间,栈的大小一般在启动文件或者链接脚本里面指定,最后由C库函数_main进行初始化;

        在操作系统中,每个任务都是独立的,互不干扰的,所以要为每个任务都分配独立的栈空间,这个栈空间通常是一个预先定义好的全局数组,也可以是动态分配的一段内存空间,但它们都存在于 RAM 中。

任务函数:

        任务是一个独立的函数,函数主体无限循环且不能返回。

任务控制块:

        任务控制块就相当于任务的身份证,里面存有任务的所有信息,比如任务的栈指针,任务名称,任务的形参等。

        定义一个任务控制块需要一个新的数据类型,该数据类型在 task.c 这C头文件中声明。

任务创建函数:

        任务创建函数 xTaskCreateStatic() 将任务栈、任务函数实体等与任务控制块联系起来,最终统一管理任务控制块。

        任务创建函数在 Task.c 中定义,在 Task.h 中声明,所有跟任务相关的函数都在这个文件定义。

2.2 调度器

        调度器是操作系统的核心,其主要功能就是实现任务的切换,即从就绪列表里面找到优先级最高的任务,然后去执行该任务。

        调度器的启动由 vTaskStartScheduler() 函数来完成,该函数在 task.c 中。

        指定运行的任务,然后调用 xPortStartScheduler() 函数。

2.3 临界段

        临界段用一句话概括就是一段在执行的时候不能被中断的代码段。

那么什么情况下临界段会被打断?

        一个是系统调度,还有一个就是外部中断。

        因此 FreeRTOS 对临界段的保护最终还是回到对中断的开和关的控制。

3. 空闲任务和阻塞延迟

        任务体内的延时使用的是软件延时,也就是说让 CPU 空等(空等的意思就是说任务中一旦运行到延时时,CPU 停下来等待延时时间过去,在延时的这块时间内 CPU 什么都不干)来达到延时的效果。

        而使用 RTOS 的很大优势就是榨干 CPU 的性能,永远不能让它闲着。

        RTOS 中的延时叫做阻塞延迟,即任务需要延时的时候,任务会放弃 CPU 的使用权,CPU 可以去干其他的事情,当任务延时时间到以后,任务重新获得 CPU 的使用权,任务继续运行,这样可以充分的利用 CPU 的资源,而不是让 CPU 干等着。

        如果没有其他任务可以运行,这个时候 CPU 就运行空闲任务(空闲任务是主函数在进行任务调度的时候创建的,它的任务优先级是最低的)。因为系统保证必须每时每刻都有一个可以运行的任务。

实现空闲任务:

        1. 定义空闲任务栈,空闲任务的栈在 main.c 中定义。

        2. 定义空闲任务的任务控制块。

        3. 定义空闲任务函数主体。

        4. 创建空闲任务。

实现阻塞延时:

        阻塞延时的阻塞是指任务调用该延时函数后,任务会被剥离 CPU 的使用权,然后进入阻塞状态,直到延时结束,任务重新获取 CPU 使用权才可以继续运行。

        需要在任务控制块中添加成员变量 xTicksToDelay。

4. 时间片

        所谓时间片就是同一优先级下可以有多个任务,每个任务轮流地享有 CPU 的使用权,享有 CPU 的时间我们叫做时间片。

        RT-Thread 和 uC/OS 可以指定时间片的大小为多个 tick,但是 FreeRTOS 时间片只能是一个 tick

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

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

相关文章

八大排序:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序

文章目录 排序概念常见的排序算法常见排序算法的实现直接插入排序希尔排序选择排序堆排序冒泡排序快速排序递归实现Hoare版本挖坑法前后指针法 非递归实现Hoare版本挖坑法前后指针法 快速排序俩个优化 归并排序递归实现非递归实现外排序 计数排序 常见排序算法的性能分析 排序概…

【已完美解决】scons问题求助:如何设置编译输出目录搞清楚后,有些编译输出的obj文件却在源码目录,而不是设置的输出目录。

【已完美解决】scons问题求助:如何设置编译输出目录搞清楚后,有些编译输出的obj文件却在源码目录,而不是设置的输出目录。 文章目录 1 前置背景2 我的疑问3 一手点拨4 问题解决 1 前置背景 最近在基于目前已有的rt-thread构建框架&#xff0…

【Spring源码解读一】IoC容器之AnnotationConfigApplicationContext

根据AnnotationConfigApplicationContext类去阅读其将Bean对象交给IoC容器管理的过程。以下这三个代码块是将配置类注册进IoC容器的例子。下面是关于这个类的继承与实现的类图关系树。 public class Test {public static void main(String[] args) {// 配置类注册进IoC容器App…

解决Ubuntu16中安装opencv后找不到vtk库的问题

最近一个项目中要用到OpenCV的VTK库&#xff0c;但引入头文件#include <opencv2/viz.hpp>时却说找不到这个库&#xff0c;网上搜了下说在编译opencv源码的时候&#xff0c;需要加上编译VTK库的选项&#xff0c;于是重新下载、编译、安装了源码&#xff0c;在cmake时加上了…

最流行的AI绘图工具Midjourney,你不得不知道的使用技巧

​关注文章下方公众号&#xff0c;可免费获取AIGC最新学习资料 本文字数&#xff1a;1500&#xff0c;阅读时长大约&#xff1a;10分钟 Midjourney成为了最受欢迎的生成式AI工具之一。它的使用很简单。输入一些文本&#xff0c;Midjourney背后的大脑&#xff08;或计算机&#…

Linux 权限

目录 一、 从问题开始 问题一: 什么叫shell? 问题二: 为什么不能直接使用kernel呢? 问题三: shell 与bash 有什么不同吗? 二、 Linux权限 0x01 Linux用户 0x02 切换用户命令 0x03 sudo命令 0x04 权限的相关概念 0x05 chmod 0x06 chown 0x07 chgrp 0x08 文件权…

重磅!软著申请不需要邮寄纸质材料啦,附软著申请流程。

重磅&#xff01;软著申请不需要邮寄纸质材料啦&#xff0c;附软著申请流程。 最新消息申请流程一&#xff0c;准备申请材料二&#xff0c;申请人填写申请表三&#xff0c;提交申请材料四&#xff0c;补正五&#xff0c;审查六&#xff0c;发布公告七&#xff0c;接受异议八&am…

力扣---二叉树OJ题(多种题型二叉树)

文章目录 前言&#x1f31f;一、剑指 Offer 55 - I. 二叉树的深度&#x1f30f;1.1 链接&#xff1a;&#x1f30f;1.2 代码一&#xff1a;&#x1f30f;1.3 代码二&#xff1a;&#x1f30f;1.4 流程图&#xff1a; &#x1f31f;二、100. 相同的树&#x1f30f;2.1 链接&…

超强实用!利用xfsdump和xfsrestore打造无懈可击的数据备份与恢复策略

前言 上次我们分析了EXT文件系统的恢复方式&#xff0c;借助于extundelete工具仅可以恢复EXT类型的文件&#xff0c;但无法恢复CentOS 7系统&#xff0c;因为centos7默认采用xfs类型的文件。 xfs文件系统恢复工具有以下几种&#xff1a; xfsprogs&#xff1a;xfs文件系统扩展…

HTB MonitorsTwo

MonitorsTwo HTB MonitorsTwo 老规矩信息收集了&#xff1a; NMAP信息收集 ┌──(kali㉿kali)-[~/桌面] └─$ sudo nmap --min-rate 1000 10.10.11.211 Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-19 09:18 CST Nmap scan report for 10.10.11.211 Host is up…

Python入门(十六)函数(四)

函数&#xff08;四&#xff09; 1.传递列表1.1 在函数中修改列表 2.传递任意数量的实参2.1 结合使用位置实参和任意数量实参2.2 使用任意数量的关键字实参 作者&#xff1a;Xiou 1.传递列表 我们经常会发现&#xff0c;向函数传递列表很有用&#xff0c;其中包含的可能是名字…

设计模式-模板方法模式

模板方法模式 问题背景解决方案&#xff1a;模板方法模式基本介绍解决问题代码示例运行结果 钩子方法注意事项和细节 问题背景 豆浆的制作&#xff1a; 1&#xff09;制作豆浆的流程&#xff1a;选材—>添加配料—>浸泡—>放到豆浆机打碎 2&#xff09;通过添加不同…

高可用性和双机热备浅析

在用户眼里&#xff0c;业务需要永远正常对外提供服务&#xff0c;这就要求应用系统的高可用&#xff08;High availability&#xff0c;即 HA&#xff09;。高可用主要是针对架构而言&#xff0c;第一步一般会采用分层的思想将一个庞大的应用系统拆分成应用层、中间件、数据存…

SpringBoot+MyBatis-plus实现CRUD (踩坑总结!!!)

一、创建项目&#xff0c;引入相应的依赖 (项目源码在文末) &#xff08;不要选Module !!!!&#xff09; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version&g…

linux常见的二十多个指令

目录 一、指令的概念 二、28个常见的指令 ⭐2.1 ls指令 ⭐2.2 pwd指令 ⭐2.3 cd指令 ⭐2.4tree指令 ⭐2.5 mkdir指令 ⭐2.6 touch指令 ⭐2.7 rmdir指令 ⭐2.8 rm指令 ⭐2.9 clear指令 ⭐2.10 man指令 ⭐2.11 cp指令 ⭐2.12 mv指令 ⭐2.13 cat指令&#xff08;适…

正规文法、正规表达式、有限自动机及其之间的转换(笔记)

The Equivalent Transforming among RG, RE and FA 正规文法 A Grammar G is a quadruple (四元组):G (VN, VT, S, P ) Where, VN is a finite set of nonterminals.VT is a finite set of terminals.S is the start symbol, S ∈ \in ∈ VN.P is a finite set of product…

.Net 使用OpenAI开源语音识别模型Whisper

.Net 使用OpenAI开源语音识别模型 Whisper 前言 Open AI在2022年9月21日开源了号称其英文语音辨识能力已达到人类水准的 Whisper 神经网络&#xff0c;且它亦支持其它98种语言的自动语音辨识。 Whisper系统所提供的自动语音辨识&#xff08;Automatic Speech Recognition&…

python基础知识(四):input语句、if语句和pass语句

目录 1. input语句2. 强制转换3. if语句4. pass语句 1. input语句 input语句是程序获取从键盘输入的内容&#xff0c;会把输入的内容自动转换成字符串。 使用方法: 变量名 input(“提示语”) 例如 language input("你最爱什么语言?") print(language)这两行代码…

RK3588平台开发系列讲解(项目篇)常见模型结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、DNN二、CNN三、RNN沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 AI 模型常采用人工神经网络来模拟人脑神经的记忆和处理信号的能力。常见的人工神经网络类型有深度神经网络(Deep Neural Network,DNN)…

Vue中组件的几个重要点

1 单词命名组件名称 vue推荐的命名组件名称有以下几种&#xff1a; 首先看下组件有几个单词构成 单个单词 如果只有一个单词&#xff0c;那么建议全部小写&#xff0c;用的时候也是全部小写的&#xff0c;或者首字母大写 有人喜欢哪怕只有一个单词也首字母大写&#xff0c;…