FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架

2023-05-16

目录

一、为什么要学习FreeRTOS

二、前言------从0到1认识FreeRTOS

1、逻辑系统与多任务系统

1.1、裸机系统:裸机系统通常分成轮询系统和前后台系统

1.2、多任务系统

2、数据结构-列表与列表项

三、任务

3.1基本属性

3.1.1任务栈

3.1.2任务控制块

3.1.3任务成员

3.2状态

四、机制

4.1任务优先级

4.1.1高优先级抢占低优先级

4.1.2时间片

4.2任务调度器

4.3临界段的保护

4.4空闲任务与阻塞延时

五、API函数


写这篇文章的目的有两个。1、方便初学者快速的入门;2、对自己这一阶段的学习进行一个阶段性的小结。

因为笔者也不过是个短时间的初学者,难免会有疏漏和差错,仅供参考。同时也欢迎大佬批评指教。不吝赐教 。

 

一、为什么要学习FreeRTOS

        当我们进入嵌入式这个领域的时候, 往往首先接触的都是单片机编程, 单片机编程又

首选 51 单片机来入门。 这里面说的单片机编程通常都是指裸机编程,即不加入任何 RTOS

(Real Time Operating System 实时操作系统) 的程序。在裸机系统中,所有的程序基本都是自己写的, 所有的操作都是在一个无限的大循环里面实现。现实生活中的很多中小型的电子产品用的都是裸机系统, 而且也能够满足需求。

        但是为什么还要学习 RTOS 编程,偏偏还要整个操作系统进来。一是项目需要,随着产品要实现的功能越来越多,单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得

更加复杂,如果想降低编程的难度, 我们可以考虑引入 RTOS 实现多任务管理, 这是使用

RTOS 的最大优势。二是学习的需要,必须学习更高级的东西,实现更好的职业规划,为

将来走向人生巅峰迎娶白富美做准备,而不是一味的在裸机编程上面死磕。作为一个合格

的嵌入式软件工程师,学习是永远不能停歇的事,时刻都得为将来准备。书到用时方恨少,

我希望机会来临时你不要有这种感觉。

二、前言------从0到1认识FreeRTOS

1、逻辑系统与多任务系统

1.1、裸机系统:裸机系统通常分成轮询系统和前后台系统

1.1.1轮训系统

        轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情,轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。如果只是实现 LED 翻转,串口输出,液晶显示等。

        这些操作,那么使用轮询系统将会非常完美。但是,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。当一个按键事件发生时,程序刚好运行到一个函数,要命的是这个函数要执行的时间还很久,久到按键释放之后都还没有执行完毕,那么按键时间就会丢失。可以看见轮训系统只适合顺序执行的功能代码。

1.1.2前后台系统

        相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成,中断在这里我们称为前台, main 函数里面的无限循环我们称为后台。

        在顺序执行后台程序的时候,如果有中断来临,那么中断会打断后台程序的正常执行流,转而去执行中断服务程序,在中断服务程序里面标记事件,如果事件要处理的事情很简短,则可在中断服务程序里面处理,如果事件要处理的事情比较多,则返回到后台程序里面处理。虽然事件的响应和处理是分开了,但是事件的处理还是在后台里面顺序执行的,但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可以大大的提高程序的实时响应能力。在大多数的中小型项目中,前后台系统运用的好,堪称有操作系统的效果。

1.2、多任务系统

        相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。在多任务系统中, 任务跟中断一样,也具有优先级,优先级高的任务会被优先执行。当一个紧急的事件在中断被标记之后,如果事件对应的任务的优先级足够高,就会立马得到响应。相比前后台系统,多任务系统的实时性又被提高了。

        相比前后台系统中后台顺序执行的程序主体,在多任务系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为任务。每个任务都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后,我们在编程的时候不需要精心地去设计程序的执行流,不用担心每个功能模块之间是否存在干扰。加入了操作系统,我们的编程反而变得简单了。整个系统随之带来的额外开销就是操作系统占据的那一丁点的 FLASH 和 RAM。现如今,单片机的 FLASH 和 RAM 是越来越大,完全足以抵挡 RTOS 那点开销。

        无论是裸机系统中的轮询系统、前后台系统和多任务系统,我们不能一锤子的敲定孰优孰劣,它们是不同时代的产物,在各自的领域都还有相当大的应用价值,只有合适才是最好。

2、数据结构-列表与列表项

        在 FreeRTOS 中存在着大量的基础数据结构列表和列表项的操作,要想读懂 FreeRTOS的源码或者从 0 到 1 开始实现 FreeRTOS,就必须弄懂列表和列表项的操作。在FreeRTOS中的列表就等同于C语言中的链表。

        链表作为 C 语言中一种基础的数据结构,在平时写程序的时候用的并不多,但在操作系统里面使用的非常多。链表就好比一个圆形的晾衣架, 具体见图, 晾衣架上面有很多钩子,钩子首尾相连。链表也是,链表由节点组成,节点与节点之间首尾相连。晾衣架的钩子本身不能代表很多东西,但是钩子本身却可以挂很多东西。同样,链表也类似,链表的节点本身不能存储太多东西,或者说链表的节点本来就不是用来存储大量数据的,但是节点跟晾衣架的钩子一样,可以挂很多数据。

 

链表又分为单向链表和双向链表

单向链表

双向链表

对于链表的操作无非就是增删改查,这里不过多讲解。

链表与数组的对比

在C语言中,链表和数组确实很像。但是二者又完全不同

        链表是通过节点把离散的数据链接成一个表,通过对节点的插入和删除操作从而实现对数据的存取。而数组是通过开辟一段连续的内存来存储数据,这是数组和链表最大的区别。 数组的每个成员对应链表的节点,成员和节点的数据类型可以是标准的 C 类型或者是用户自定义的结构体。数组有起始地址和结束地址,而链表是一个圈,没有头和尾之分,但是为了方便节点的插入和删除操作会人为的规定一个根节点。

剩下的部分在我的专栏里,大家有需要的话可以进FreeRTOS那个专栏继续进行学习

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架 的相关文章

  • n模块管理多个版本的node.js

    安装 homebrew方式 brew span class token function install span n github方式 span class token function curl span L https git io
  • 11.23总结

    今天除了上数学课和心里考试全部坐在电脑前刷题 启航oj 4 xff0c 菜鸟杯 oj3 因为我是一个入门比较晚的菜鸟所以我唯一能做的就是挤出所有的时间全部用来补别人已经明白的东西 今天主要的收获就是 字符串三个函数的应用 字符与二维数组的混
  • 11.24总结

    1 jsua oj 0 打算明后两天集中搞菜鸟杯题组 2 启航oj 5 今天上午满课下午都在敲代码 这真的是大一吗 有了昨天的刷题经验今天自己刷题快多了就是被那些提交语言折磨到窒息白白浪费了好多时间 主要学习了蛇形矩阵的算法根据题意判断从那
  • 11.25总结

    博客被吞了一遍 我吐了想一点前上床睡觉有这么难吗 虽然今天一天满课但是我还是学到了很多知识 今天启航oj 1 菜鸟杯补题 4 写了一篇关于党的19届六中全会的文章 主要学习了汉诺塔的数据变化原理 xff0c 递归 加深我对递归的理解 xff
  • 12.1日总结

    刷题数0 真的是挺无语的因为感觉指针链表栈的知识混成一团了 xff0c 只能各种百度 xff0c 最后发现书本里面的才是最香的 虽然没有做出来栈的题目但是大体的基本概念已经理清了 先从链表讲起 一说到结构体 xff0c 指针 xff0c 链
  • 12.2总结(纵使结局不如意,放弃实属下下签。)

    刷题数三 xff0c 菜鸟杯补题2 xff1b 启航栈1 xff1b 终于知道这两天为什么这么痛苦了 我一度难受到窒息因为我看的是链栈我看了两天硬是对这些题目无从下手 xff0c 因为他吧指针 结构体 链表 栈一起结合起来使用 我去搜各种博
  • 12.3日总结 单调栈

    今天就刷了两个题 xff0c 尝试了一个题 xff0c 主要看了单调栈 xff0c 单调栈分为两种一中是栈中元素从栈顶到栈顶呈从小到大的排序的栈这样的栈称为单调递增栈 另一种从栈顶到栈底数据从大到小称为单调递减栈 单调栈的应用一般可以用来求
  • 12.5总结

    开始着手于项目的编写 其实所有事情都是开头难 xff0c 项目也一样 xff0c 第一次写项目必定要接触到很多新东西 xff0c 今天主要遇到了两个新的头文件里面包含了写项目必备的几个函数 stdlib h里面定义了五种类型 一些宏和通用工
  • 搬运! Windbg调试命令详解

    转载注明 gt gt 作者 xff1a 张佩 原文 xff1a http www yiiyee cn Blog 1 概述 用户成功安装微软Windows调试工具集后 xff0c 能够在安装目录下发现四个调试器程序 xff0c 分别是 xff
  • 使用光盘安装Microsoft media foundation

    一 准备 系统 xff1a widnows server 2012 R2 Datacenter 准备文件 xff1a 安装光盘或iso 双击iso文件 xff0c windows server会自动虚拟出一个光驱 假如光驱或虚拟光驱的盘符为
  • 如何用MindManager将导图导出为HTML5交互式导图?

    最新版MindManager 2017中新增了一种导出方式 HTML5交互式导图 xff0c 相信很多人在了解MindManager 2017新功能的时候就已经知道了 本文 xff0c 小编将给大家演示 xff0c 如何将做好的思维导图导出
  • 判断两个IP是否属于同一个子网

    例如 xff1a 192 168 1 1 24和192 168 1 33 27 192 168 1 1 24的ip地址为192 168 1 1 xff0c 子网掩码为255 255 255 0 转化为二进制 xff1a IP地址为 xff1
  • 记录一次K8s-Flannel插件的坑

    版本 xff1a K8s版本1 17 6 部署方式 xff1a ansible 43 kubeadm部署 架构 xff1a master1 43 node2 43 registry私有仓库 执行kubectl apply f kube fl
  • opencv imencode和imdecode使用,用于网络传输图片

    这是C 43 43 版本的 程序首先读入一个图片 然后encode xff0c 之后把encode后的内容写入文件 xff08 实际应用可以发送到网络 xff09 第二步 xff0c 从文件读取encode的内容 然后解码decode 转换
  • 云计算&云存储

    云计算技术 云计算技术主要分为以下几个部分 xff1a 编程模式海量数据分布存储技术海量数据管理技术虚拟化技术云计算平台管理技术 云计算应用 云计算应用主要包含以下六个部分 xff1a 密码优先检查安全问题加密方法管理密码双重认证备份 云存
  • 用C语言实现字符串反转函数strrev的经典方法

    字符串反转函数strrev不是C语言标准库函数 xff0c 很多C语言编译器并没有提供对它的支持 xff0c 比如你在Linux下输入Shell命令man 3 strlen xff0c 屏幕上会显示 xff0c STRLEN 3 Linux
  • OSPFv3报文格式与作用分析

    OSPFv3报头 xff1a 实际抓包 xff1a 具体内容 xff1a Version xff1a 3 Type xff1a 报文类型 1 Hello 2 DD 3 LSR 4 LSU 5 LSAck Packet length xff1
  • IPv6基础知识

    概述 xff1a IPv6 xff08 Internet Protocol Version 6 xff09 是网络层协议的第二代标准协议 xff0c 也被称为IPng xff08 IP Next Generation xff09 它是Int
  • BGP在数据中心的应用1——数据中心网络介绍

    注 xff1a 本文根据 BGP in the Datacenter 整理 xff0c 有兴趣和英文阅读能力的朋友可以直接看原文 xff1a https www oreilly com library view bgp in the 978
  • 意法nucleo-h723zg原理图,stm32h723zg原理图

    兄弟们 xff1a 我之前一直都在找这个图 xff0c 废了老大的劲才找到 xff0c 并且找到就马上给大家分享了 xff0c 希望能顺手点个赞 Introduction xff1a The STM32H7 Nucleo 144 board

随机推荐

  • MAX30102学习笔记(上)

    MAX30102学习笔记 xff08 上 xff09 一 小简介 max30102是一个将脉搏血氧仪的心率检测仪融为一体的一个传感器模块 简单的说就是一个可以采集心率和血氧数据的小模块 xff0c 使用者只需将其佩戴于手指 xff0c 手腕
  • java---爬虫

    提示 xff1a 以下代码仅能用于学习使用 xff0c 部分代码已脱敏 前言 为了帮助女朋友完成作业从没接触过爬虫的我被赶鸭子上架 xff0c 硬着头皮code 索性是不负所托 xff0c 虽然代码很垃圾但是所期望的功能也完整实现 下面进入
  • 【详细教程】zmq c++ cmake 实现发布订阅

    前言 ZMQ是一种性能极高的通信框架 xff0c 吞吐量大延迟低 xff0c 使用简便 本文手把手讲解如何用c 43 43 实现zmq的订阅和发布 xff0c 编译环境我们选择了cmake 环境准备 zmq 可以参考我写的这篇 xff1a
  • 职场分身术:从给答案到做引导

    在学校读书的时候 xff0c 偶尔作业不会做 xff0c 很可能会问同学 xff0c 他很可能会把答案直接给出来 但是 xff0c 如果去问老师 xff0c 他很可能给一些启发和引导 这正是对不同帮助类型最初的感受 进入职场之后 xff0c
  • DNS及mDNS 名字(名称)压缩规则

    Author Shawn Lee WebSite http blog csdn net twelvelee Email xff1a xiaofengoffice 64 163 com Update Time 2011年8月24日星期三 Sh
  • 、做最好的自己--【我的2014】

    花开花落 xff0c 云卷云舒 不平凡的 2014年也接近尾声了 xff0c 留给我们的是无尽的感慨和反思 回首这一年 xff0c 自己在慢慢的成长 经过这一年 xff0c 我渐渐意识到专业技术的重要性 于是 xff0c 在2014年10月
  • 最新版22.04Linux系统下配置Go语言开发环境

    Linux系统下配置Go语言环境过程 1 先进入root超级用户2 查看Linux系统的版本 xff1a 3 根据系统版本找到对应的Go语言安装包4 切换到 usr local 目录下 xff0c 下载Go语言安装包 xff0c 并解压缩
  • VDO虚拟数据优化及RAID

    VDO虚拟数据优化 Virtual Data Optimize是一种通过压缩或删除存储设备上的数据来优化存储空间的技术 xff0c 简称VDO xff0c 中文名叫虚拟数据优化 第1步 xff1a 创建一个全新的VDO卷 vdo creat
  • Ubuntu20.4系统下安装kvm并创建虚拟机

    Ubuntu20 4系统下安装kvm并创建虚拟机 一 安装Ubuntu20 4系统二 在Ubuntu20 4系统下安装KVM三 kvm虚拟机及其磁盘映像文件 xff08 CentOS 7 9 xff09 制作 一 安装Ubuntu20 4系
  • 回首16,展望17。

    我是一名在校的大学生 xff0c 时光流逝转眼就到了该毕业的时间了 xff0c 大学的四年对于我们来说却只有三年 学校的压缩式教学让我们三年学完了四年的东西 xff0c 无论你学的怎样都要出去找工作 现在的我也将面临这样的抉择了 大学是轻松
  • 树莓派4B装安卓11系统 可超频到2GHZ 运行流畅

    树莓派4B安装安卓系统需要下载安卓镜像和烧写器 xff0c 安卓镜像我目前知道的有两种 xff0c 一种是基于LineageOS的魔改版 xff0c 另外一种是omni官方制作的 下面我把地址贴出 xff0c 大家根据需要下载 树莓派安卓下
  • 在12864液晶上显示任何图像

    一 xff0c 所需软件 xff1a Any to Icon 作用 xff1a 用来把随意彩图 xff0c 转化成黑白2色图 windows画图软件 作用 xff1a 用来编辑DIY2色图片 xff0c 并可改属性改成128X64像素 字模
  • 关于openstack错误-cirros镜像-无法启动

    链接 xff1a https www cnblogs com learn2teach p 12456635 html
  • 双机调试和windbg的命令

    各位大牛以及和我一样还是菜鸟的朋友们 xff0c 大家好 xff0c 今天在调试驱动程序时 xff0c 由于要做双机调试 xff0c 所以顺便再论坛发给以后需要的朋友 xff0c 相对网上其他教程我的这个 算是比较详细了 xff0c 因为我
  • 【无标题】

    Java中的类 类可以看成是创建 Java 对象的模板 通过下面一个简单的类来理解下 Java 中类的定义 xff1a public class Dog String breed int age String color void bark
  • sdwan和传统专线,二者的区别在哪里?

    传统的企业网络通常由园区 分支和数据中心组成 xff0c 通过企业WAN网络相互连接 长期以来 xff0c 为了保证服务质量 xff0c 企业WAN网络互联通常采用运营商的传统专线 虽然网络质量有保证 xff0c 但业务开通繁琐 xff0c
  • <a>标签用法总结

    说起a标签真实功能强大呀 xff0c 所以做个总结怕自己忘了 a标签的强大功能都要归咎于href属性可以为多种类型 1 lt a href 61 34 34 gt 的作用 xff1a 点击标签链接到网页的顶端 lt a href 61 34
  • 我的2011-没有011,只是比较2

    很多东西和算法一样古老 xff0c 但很实用 企鹅们每天吃饭睡觉打豆豆久了 xff0c 也会去思考从老巢到觅食地两点之间的最短路线问题 实际上各种生物都不缺乏探索的精神 xff0c 不管是迫于生存还是寻求更好的发展 xff0c 这种迁移包括
  • mybatis-plus简单使用

    1 导包 lt mysql 驱动 gt lt dependency gt lt groupId gt mysql lt groupId gt lt artifactId gt mysql connector java lt artifact
  • FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架

    目录 一 为什么要学习FreeRTOS 二 前言 从0到1认识FreeRTOS 1 逻辑系统与多任务系统 1 1 裸机系统 xff1a 裸机系统通常分成轮询系统和前后台系统 1 2 多任务系统 2 数据结构 列表与列表项 三 任务 3 1基