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

【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS

初识FreeRTOS

    • 一、实时操作系统概述
    • 1、概念
    • 2、RTOS的必要性
    • 3、RTOS与裸机的区别
    • 4、FreeRTOS的特点
    • 二、FreeRTOS的架构
    • 三、FreeRTOS的代码架构

一、实时操作系统概述

1、概念

RTOS:根据各个任务的要求,进行资源(包括存储器、外设等)管理、消息管理、任务调度、异常处理等工作。每个任务都有一个优先级,RTOS根据各个任务的优先级,动态地切换各个任务,保证对实时性的要求。

2、RTOS的必要性

  • 嵌入式实时操作系统提高了系统的可靠性
  • 提高了开发效率、缩短了开发周期
  • 嵌入式实时操作系统充分发挥了32位CPU的多任务潜力

但是实时操作系统还需要额外的ROM/RAM开销,2~5%的CPU额外负荷,以及内核的费用。

3、RTOS与裸机的区别

①裸机开发
类似于我们学校里玩的51单片机、STM32都是跑在main函数中,里面会有一个超级大的while(1)循环,这里面几乎包含整个项目的所有业务逻辑,然后每个逻辑里面都会有delay这样的等待函数,这样就会导致所有的业务逻辑都是串行起来工作的。然后进行轮询一件件事,事情一件件按顺序来,同一时间只能做一件事情。类似于下图这种。
在这里插入图片描述
②如何改进呢?
把这每件事情,都对应一个任务,降低耦合度,一个任务对应一个硬件,这种通过抢占任务优先级,来高效的实现任务的切换。在这里插入图片描述

4、FreeRTOS的特点

  • FreeRTOS的内核支持抢占式和时间片调度
  • 提供了一个用于低功耗的Tickless模式
  • 系统的组件在创建时可以选择动态或者静态的RAM,比如任务、消息队列、信号量、软件定时器等。
  • FreeRTOS-MPU支持Corex-M系列中的MPU单元,比如STM32F429.
  • FreeRTOS系统简单、小巧、易用,通常情况下内核占用4k-9k字节的空间
  • 高可移植性,代码主要C语言编写。
  • 高效的软件定时器
  • 强大的跟踪执行功能。
  • 堆栈溢出检测功能。
  • 任务数量不限。
  • 任务优先级(0~63)不限。

二、FreeRTOS的架构

在这里插入图片描述

  • 一个任务管理一个硬件
  • 任务与任务或任务与中断涉及到数据传输使用消息队列
  • 任务件共享资源访问使用互斥锁
  • 任务的同步使用信号量
  • 标志位的管理使用事件标志组
  • 编写一个专门初始化硬件的任务,该任务可以包含创建任务的功能。

三、FreeRTOS的代码架构

在这里插入图片描述

  • croutine.c/croutine.h:协程,在8位/16位平台下效率比较高,在32位平台建议使用任务Task。
  • event_group.c/event_group.h:这个是事件组的实现。
  • heap_x.c:内核堆实现,FreeRTOS提供了heap_1.c~heap_5.c,5种堆管理器,各有优缺点,需要根据应用进行选择。这一块我会在另一篇博客详细讲解。
  • list.c/list.h:链表实现,主要为调度器提供数据结构算法支持服务。比如任务链表。
  • port.c/portmacro.h:硬件相关层级可移植抽象,主要包括SysTick中断,上下文切换,中断管理,具体实现很大程度上取决于平台(单片机体系硬件内核和编译器工具集)。通常以汇编语言实现。
  • queue.c/queue.h/semphr.h:信号量、互斥体实现。
  • tasks.c/task.h:任务管理器实现。
  • timers.c/timers.h:软件定时器实现。
  • FreeRTOS.h:编译配置文件,用于汇总所有源文件的编译选择控制。
  • FreeRTOSConfig.h:FreeRTOS内核配置,Tick时钟和irq中断配置。

http://www.kler.cn/a/3426.html

相关文章:

  • 分子动力学模拟里的术语:leap-frog蛙跳算法和‌Velocity-Verlet算法
  • 基于JAVA的微信点餐小程序设计与实现(LW+源码+讲解)
  • Word常见问题:嵌入图片无法显示完整
  • 基于单片机的智能台灯设计
  • Fastapi + vue3 自动化测试平台(4)-- fastapi分页查询封装
  • 纯前端实现表格中的数据导出功能-使用xlsx和file-saver
  • SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
  • 一文分析RISC-V Linux启动之页表创建
  • 人工智能能否取代软硬件开发工程师
  • ubuntu下使用GCC开发单片机的过程
  • 【数据结构】栈和队列
  • git为什么要先commit,然后pull,最后再push?而不是commit完直接push?
  • 【C++】类和对象(三)
  • Spring6 - (03) Spring 入门程序
  • 一文吃透SpringBoot整合mybatis-plus(保姆式教程)
  • 自己设计的网站,如何实现分页功能?(详细代码+注释)
  • 优秀程序员的5个特征,你在第几层?
  • 走进Vue【四】导航守卫和路由原信息详解
  • 进阶C语言——字符函数和字符串函数【详解】(二)
  • 开关电源Y电容放置的位置
  • 不要迷信 QUIC
  • 计算机组成原理实验一(完整)
  • git基本用法教程(fork软件+git命令)
  • 【华为OD机试 2023最新 】 最多颜色的车辆(C++)
  • linux实验之shell编程基础
  • 这几个SQL语法的坑,你踩过吗