FreeRTOS(随便写写,项目用到)

FreeRTOS是什么(并发)

RTOS(Real Time Operating System,中文就是实时操作系统)     

FreeRTOS是一个迷你的实时操作系统内核。

作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。     

由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为10.4.4版。   

FreeRTOS的设计小巧且简易,整个核心代码只有3到4个C文件,为了让代码容易阅读、移植和维护,大部分的代码都是以C语言编写,只有一些函数(多数是架构特定排班副程序)采用汇编语言编写。

FreeRTOS移植

【FreeRTOS】FreeRTOS移植stm32详细步骤介绍_freertos 202212.01下载-CSDN博客

1、添加RTOS源码到Keil工程

2、添加head_4.c到Keil工程

3、添加port.c到Keil工程

4、添加头文件路径

5、添加FreeRTOSConfig.h

6、修改FreeRTOSConfig.h配置文件,直到工程编译无错误

前后台

前后台:应用程序是一个无限的循环,循环中调用相应的函数完成所需的处理。有时候我们也需要中断中完成一些处理。相对于多任务系统而言,这个就是单任务系统,也称作前后台系统,中断服务函数作为前台程序,大循环while(1)作为后台程序。

任务(Task)是什么

多任务系统会把一个大问题(应用)“分而治之”,把大问题划分成很多个小问题,逐步的把小问题解决掉,大问题也就随之解决了,这些小问题可以单独的作为一个小任务来处理。这些小任务是并发处理的,注意,并不是说同一时刻一起执行很多个任务,而是由于每个任务执行的时间很短,导致看起来像是同一时刻执行了很多个任务一样。

优先级划分策略

平均划分:一种简单的任务优先级划分策略是平均划分,即将可用的优先级范围均匀地分配给各个任务。这样的划分可以确保每个任务都有相对平等的机会被调度执行。

优先级分层:另一种策略是根据任务的功能和紧急程度将优先级进行分层。紧急程度较高的任务分配较高的优先级,确保这些任务更早地得到执行。

动态调整优先级: FreeRTOS允许在运行时动态调整任务的优先级。通过使用vTaskPrioritySet函数,可以根据实时需求在任务执行过程中调整其优先级。

创建任务

pxTaskCode:指向任务函数的指针。注意,任务函数不能返回(即死循环)。

pcName:任务名,字符串

usStackDepth:栈深,即任务的栈大小(单位是字,1字=4字节)

pvParameters:任务的参数指针

uxPriority:任务的优先级,最低优先级为0,数字越大,优先级越高。

pxCreatedTask:任务的句柄,用于控制任务 

任务的一般形式

void Task_Temp(void *pvParameters)
{
int i = 0;
    while (1)  {
        printf("i: %d\r\n", i++);
        vTaskDelay(1000);
    }
}

任务优先级概述

在FreeRTOS中,任务的优先级范围通常从0到(configMAX_PRIORITIES - 1),其中configMAX_PRIORITIES 是用户在FreeRTOS配置中定义的常量。优先级数越大,优先级越高,任务越早被调度执行。     

通过合理的任务优先级划分策略,可以有效提高FreeRTOS系统的响应速度和性能。在设计和实现嵌入式系统时,开发者应该根据任务的紧急程度和功能特点选择适当的优先级划分策略,以满足实时性和稳定性的需求。

任务的状态

 移植操作系统:

 

FreeRTOS队列、信号量 

队列(邮箱)

队列是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传递信息,实现了任务接收来自其他任务或中断的不固定长度的消息(而这个消息可以是任意类型的数据),任务能够从队列里面读取消息,也能够向队列发送消息。   

 队列可以被多个任务读、也可以被多个任务写,但要防止同一时刻被多个任务访问(多进程/多线程对共享变量的并发访问)。

队列的特点:

队列的创建/删除函数:

队列发送函数

队列接受函数

队列发送/接受函数中断版本

信号量

信号量的种类

任务的互斥

任务的同步

计数信号量

计数值信号量是长度大于0的队列,计数值信号量常用于事件计数、资源管理,其实如果限定计数信号量计数值最大值只能为1则就等同于二值信号量。

计数值信号量的应用场景

计数值信号量API接口

二值信号量

只有两个值的计数信号量。

二值信号量的应用场景

二值信号量API接口

互斥信号量

二值信号量/计数值信号量其实也可以实现互斥,但存在优先级反转的缺点,而解决方法就是优先级继承,优先级继承就是互斥信号量的特性,则互斥信号量的本质就是具有优先级继承的二值信号量。

优先级反转的现象

简单来说就是低优先级的任务霸占CPU资源,导致高优先级任务无法运行的情况。导致这种严重优先级反转的问题的根本原因在于持有锁的低优先级任务因为优先级低,而得不到执行,得不到执行的话,就无法解锁,无法解锁就导致高优先级的任务获取锁会失败,从而导致高优先级任务一直在阻塞状态。

解决优先级反转:优先级继承 

解决方式就是优先级继承,在高优先级任务进入阻塞之前将低优先级任务的优先级提升至与高优先级一致,这样等高优先级任务进入阻塞之后,低优先级任务就能继承高优先级任务的优先级,这样低优先级任务就能尽快执行(从而解锁,让高优先级能够获取锁)。     

优先级继承:暂时提高某个占有某种资源的低优先级任务的优先级,使之与在所有等待该资源的任务中优先级最高那个任务的优先级相等,而当这个低优先级任务执行完毕释放该资源时,优先级重新回到初始设定值。

优先级继承示意图

消除优先级反转带来的影响了吗?

    没有。因为优先级反转概念是指一个低优先级的任务持有一个被高优先级任务所需要的共享资源,也就是说当因为任务A上锁之后,然后任务C来获取锁失败而进入阻塞态,在高优先级任务进入阻塞态的时候已经是优先级反转了,而优先级继承只是让任务A尽快执行(尽快解锁),让高优先级任务C尽快解除阻塞态,所以优先级继承只能是缩短优先级反转的时间。

互斥信号量的API

互斥信号量的应用场景

递归互斥信号量 

递归互斥信号量的API

 

 

 

 

 

 

 

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值