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

FreeRTOS——介绍及移植过程

目录

  • 一、RTOS的基本概念
  • 二、RTOS的种类对比
  • 三、RTOS的源码下载
  • 四、RTOS的源码结构
  • 五、RTOS的移植流程

一、RTOS的基本概念

实时操作系统(Real Time Operating System)的简称就叫做RTOS,是指具有实时性、能支持实时控制系统工作的操作系统,RTOS的首要任务就是调度所有可以利用的资源来完成实时控制任务的工作,其次才是提高工作效率。

绝大多数比较简单的产品(中小型产品)是直接在单片机上“裸奔”的,也就是产品不搭载RTOS的,但是产品的各个功能想要正常工作都需要主程序来进行调度。

其实RTOS就是一段嵌入在程序中的代码,在系统上电复位后首先被执行,可以理解为用户的主程序,只不过用户把产品的其他功能(子程序)都建立在RTOS之上,在RTOS中可以调用API函数为每个子程序都创建一个任务(也可以叫做线程),用户只需要调用RTOS内核中的相关的API函数接口就可以控制子程序,而且可以为每个任务设置不同的优先级,通过RTOS的调度器进行调度,这样就可以合理的使用CPU。

这里就涉及到产品的设计思路(裸机开发 or RTOS)以及程序的运行方式,可以分为三种:

轮询式系统

指的是在程序运行时,首先对所有的硬件进行初始化,然后在主程序中写一个死循环,需要运行的功能按照顺序进行执行,轮询系统是一种简单可靠的方式,一般适用于在只需要按照顺序执行的并且没有外部事件的影响的情况下。

程序的运行过程中出现如按键等需要外部检测的事件,轮询系统的实时响应能力变得很差。

int main()
{
//1. 对所有的硬件进行初始化(LED、BEEP、KEY…)

//2.进入死循环
while(1)

{
//点灯
//警报
//按键
}
}

前后台系统

相比于轮询系统,前后台系统增加中断的概念,如果外部事件发生,则在中断中进行处理,主程序在轮询系统中运行,中断被称为前台,主程序中的while(1)就称为后台。中断会终止后台程序的运行,然后跳转到对应的中断服务函数中去处理,处理完成后,在继续执行后台的程序。

//不需要手动调用,当进程捕获到SIGINT信号时,系统会暂停主程序的执行,来执行该函数
void signal_handler(int signum)
{
//处理动作
}

int main()
{
//1.对中断进行注册
signal(SIGINT,signal_handler);

while(1)
{
//执行动作,while(1)不允许退出
}
}

如果使用前后台系统,可以极大程度的提高程序的实时响应能力,避免造成外部事件的缺失。

多任务系统

相比于前后台系统,多任务系统的外部事件也是在中断中进行响应,但是外部事件的处理是任务中进行处理。任务具有优先级,优先级高的任务先处理,所以程序就会被分割为一个个的任务,任务是一个独立的死循环,并且不能返回,可以由操作系统进行任务的调度,程序段的实时响应能力又得到提升。

//任务1
void * task1(void *arg)
{
while(1)
{

}
}

//任务2
void * task2(void *arg)
{
while(1)
{

}
}

int main()
{
//1.对所有的硬件进行初始化
//2.创建任务,并设置任务的属性(优先级、内存分配、时间片)
//3.交给系统的调度器去执行
}

二、RTOS的种类对比

RTOS是实时操作系统的统称,不意味着是某一种确定的操作系统,而是指某一类操作系统,比如最常用的uC/OSII、uC/OSIII、FreeRTOS、RTX、RT-Thread、Huawei LiteOS…每种RTOS各有特色,所以大家可以根据实际需要选择对应的RTOS进行学习。

uC/OS

uC/OS是Micrium公司推出的RTOS实时操作系统,分为uC/OSII 和 uC/OSIII,该RTOS的特点是开源的、可裁剪的、具有可剥夺型内核,uC/OSII可以支持创建最多255个任务,而uC/OSIII对任务数量没有限制。

uC/OS的发布时间是较早的,所以中文资料是最多的,并且代码例程比较丰富,但是想要在商业中进行使用,需要取得正版授权(花钱),所以大家可以把UCOS作为RTOS的入门。关于uC/OS的资料和源码都可以去官网下载 官网地址:www.micrium.com

在这里插入图片描述
在这里插入图片描述

FreeRTOS

FreeRTOS也是RTOS的一种,在2003年发布,是免费的,虽然起步比UCOS晚,但是由于可以在商业中免费使用,所以目前的市场占有率是最高的,并且很多的半导体公司都和FreeRTOS有很紧密的合作关系,这些半导体公司的评估板绝大多数都是采用FreeRTOS进行程序设计。比如半导体公司发布的SDK(开发工具包)一般也采用FreeRTOS,另外,像蓝牙、WIFI等带协议栈的芯片或者模块也是采用FreeRTOS。

相比于UCOS而言,FreeRTOS的文件数量更少,占用内存空间更少,所以在移植到不同硬件平台的时候更加轻松,FreeRTOS对于任务数量也是没有限制的,而是对于任务的优先级也没有限制。

FreeRTOS支持抢占式、合作式、时间片调度等算法,而且FreeRTOS是完全免费的,这也是FreeRTOS的核心竞争力。

FreeRTOS可以用在商业领域,不具有版权问题,如果在产品中使用FreeRTOS时没有修改源码,则产品不需要开源,如果使用FreeRTOS的过程修改了源码,则需要把修改的那部分代码进行开源,遵循MIT开源协议。

大家可以去FreeRTOS的官网下载源码以及其他的资料,比如FreeRTOS提供了若干本书籍,比如关于RTOS的API函数的参考手册以及新手教程。 官网地址:www.freertos.org

在这里插入图片描述

三、RTOS的源码下载

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

如果没有办法跳转到Github,则可以选择从其他的托管网站下载FreeRTOS的源码,比如Sourceforge

在这里插入图片描述
在这里插入图片描述

四、RTOS的源码结构

在这里插入图片描述

在这里插入图片描述

可以知道用户需要移植:3个公共源文件(list.c、queue.c、tasks.c)、和MCU架构相关的2个文件(port.c和portmacro.h)、和1个内存管理相关的源文件(heap_4.c)、和内核相关的头文件。

五、RTOS的移植流程

在这里插入图片描述

可以知道,在编译工程时,出现提示找不到FreeRTOSConfig.h头文件,需要了解一下该头文件的作用,用户可以选择从FreeRTOS内核源码中的案例demo中移植FreeRTOSConfig.h !!!

在这里插入图片描述
在这里插入图片描述

再次编译,发现出现新错误,提示SystemCoreClock标识符未定义,原因是因为在FreeRTOSConfig.h中使用了该变量,但是头文件中没有定义该变量,所以需要在FreeRTOSConfig.h中声明SystemCoreClock是外部文件的,但是如下图:
在这里插入图片描述

可以看到,这个变量声明是有条件的,当用户定义了宏_ICCARM_则该声明是启用的,但是_ICCARM_是在IAR软件中使用的,但是现在采用的开发环境是KEIL,而KEIL软件采用的是__CC_ARM宏定义,解决方案:把_ICCARM_替换为__CC_ARM即可。

在这里插入图片描述

再次编译,发现出现新错误,可以发现是在port.c和stm32f4xx_it.c中出现了函数重复定义的情况,所以通过阅读stm32f4xx_it.c源文件,可以知道该文件中只是提前定义这三个函数,但是并没有使用,所以只需要把stm32f4xx_it.c中三个函数接口注释即可。

在这里插入图片描述

再次编译,发现出现新错误,错误原因是没有定义相关的回调函数,在FreeRTOSConfig.h中如果启用某些功能,则需要定义该功能的回调函数,如果不需要使用该功能,则解决方案是在FreeRTOSConfig.h头文件把这些宏定义禁用,设置为0。

在这里插入图片描述

在这里插入图片描述

http://www.dtcms.com/a/391575.html

相关文章:

  • Day 07 Physics list-----以B1为例
  • 重读一次IS015765-2,记录对错误和异常处理的方式
  • Edge浏览器CSDN文章编辑时一按shift就乱了(Edge shift键)欧路翻译问题(按Shift翻译鼠标所在段落)
  • SpringIoc 基础练习 验证码
  • 前端项目,CDN预热有什么用?
  • TF卡的存储数据结构—fat32格式
  • led的带宽在模拟太阳光中设备中的影响
  • go资深之路笔记(三) sync.WaitGroup, sync.errgroup和 sync.go-multierror
  • Docker 与数据库环境
  • Node.js 模块系统详解
  • proxy代理应用记录
  • 基于python大数据的汽车数据分析系统设计与实现
  • WebSocket实现原理
  • 从保存到加载Docker镜像文件操作全图解
  • IDEA文件修改后改变文件名和文件夹颜色
  • 【MySQL 】MySQL 入门之旅 · 第十篇:子查询与嵌套查询
  • TM52F1376 SSOP24电子元器件 HITENX海速芯 8位微控制器MCU 芯片 深度解析
  • 基于Matlab图像处理的工件表面缺陷检测系统
  • 业务上云实践MYSQL架构改造
  • 深入解析TCP/IP协议分层与通信原理
  • 【人工智能通识专栏】第二十讲:科创项目选题
  • 数据治理系列(三):SQL2API 平台格局与发展趋势
  • 软考-系统架构设计师 软件项目管理详细讲解
  • three.js添加CSS2DRenderer对象
  • 磁共振成像原理(理论)9:射频回波 (RF Echoes)-三脉冲回波(2)
  • 栈的主要知识
  • question:使用同一请求数据且渲染顺序不确定时复用
  • Redis群集三种模式介绍和创建
  • 【LeetCode 每日一题】1935. 可以输入的最大单词数
  • eeprom和flash的区别