freertos实时内核实用指南_深入浅出,FreeRTOS新手+入门学习笔记

本文从实时操作系统原理出发,详细解析FreeRTOS的核心功能,包括内存管理、任务管理和通信管理。通过实例介绍如何创建任务、使用延迟函数以及队列通信,帮助初学者掌握FreeRTOS的使用。
摘要由CSDN通过智能技术生成

本篇文章从FreeRTOS10.0说明书,以及操作系统原理相关论文中,整合而成。 从操作系统原理本身去认识FreeRTOS,适合新手或者已入门的朋友进阶。

一、为什么使用实时多任务操作系统?
RTOS,real-time Operate System。有很多成熟的技术可以在不使用内核的情况下编写好的嵌入式软件,但是在复杂情况下,RTOS有如下的好处:
1)用户无需关心时间信息
内核负责计时,并由相关的API完成,从而使得用户的应用程序代码结构更简单。
2)模块化、可拓展性强
也正是由于第一点的原因,程序性能不易受底层硬件更改的影响。并且,各个任务是独立的模块,每个模块都有明确的目的,降低了代码的耦合性。
3)效率高
内核可以让软件完全由事件驱动,因次,轮询未发生的事件是不浪费时间的。相当于用中断来进行任务切换。
4)中断进程更短
通过把中断的处理推迟到用户创建的任务中,可以使得中断处理程序非常短。 二、FreeRTOS的核心功能

83783963f5bf87d8bfb016d13ac848b4.png


接下来,就按顺序介绍以上的4种核心功能。 三、内存管理

237c1d5762c2b82d7de696dc848c0911.png
FreeRTOS目前有5种内存管理方案供我们选择。

下图为heap2内存分配方式

3b21c1e151fb844e05f7892af74ba666.png

下图为heap4内存分配方式

b703478ed959fc16ab899fc7ade0cf83.png


其中,heap4:我们主要用到的是动态内存分配的heap4。相比于heap2的链表式内存块结构,heap4是按照物理地址来进行排序。这样设计的目的是方便合并相邻物理地址中空闲的内存块。但是,当在嵌入式系统中,频繁的创建与释放内存,还是会导致空闲块物理地址相对分散,依然会产生较多内存碎片。
补充:μS/OS采用的是静态分割成多个块。

四、任务管理
1.如何创建一个任务(接下来我会举一个实例)
用到的函数:xTaskCreate(如下图)

26454e50b838744b87e2afae5e7f6e9e.png

如何创建两个不同的任务,并让他们都能够执行呢?
首先,声明任务1和任务2(如下图)

07aebcea2539ec9d477b40935fad35ab.png

接着,在主函数中创建任务1和任务2(如下图)

3d7ccbb01eec47f918a75dff24b0a69c.png

最后,通过串口打印能看出两个任务在轮流执行。(下图)

a5f51ffcda1e712f49024165b3e4b98e.png


2.优先级
优先级0是最低优先级,可以通过在FreeRTOSConfig.h文件中,设置configMAX_priorities来配置最高优先级数。
特别要注意,不同任务可以共用同一个优先级。
3.你知道为什么要用vTaskDelay吗
在有两个任务的情况下,不用delay的时候,每执行完一个任务,需要等到Tick中断,才能让调度器选择运行下一个任务(如下图)。

53233419df1173fcc892ce2b33180af7.png
这是不用delay的时候

当使用了delay之后,两个任务能够在一个周期内依次运行(如下图),毕竟处理1个任务不需要占用整一个时间周期,之前不用delay的做法太浪费了。

cc556151a727e8ade50058b869292e66.png
这是用delay的情况


4.任务在不同的状态间调度

f15c4e4f71b930b58430b03ab0f72fe7.png


5.vTaskDelay和VTaskDelayUntil的区别
第一个delay是相对的延时,第2个delayuntil是绝对的延时,适合需要固定频率执行的任务

6.对于空闲任务来说,它一直都处于就绪态,只有当其他优先级比它高的任务,都执行完了,都在阻塞态里,空闲任务idle task才会执行。

五、(任务间)通信管理
1.队列的原理
队列,可以容纳有限数量固定大小的数据。一般采用FIFO存储方式(First in First Out)。而在freertos中,队列的传输用的是copy的方式。
队列传输数据方式(过程如下图)

bbd97fa0b7817202b8ca575f81d54fbe.png

采用copy传递的优势有:堆栈中的变量也可以直接发送到队列中,而不用担心是否会被释放掉。因次,发送和接收任务也不用去关心是哪一个任务“拥有”数据。
2.创建一个队列

21e54b3b4ee6dc32f1c5eb9b06c4345e.png

3.接收队列

321cb03c30f0cb7924794bf3f4001e70.png

4.利用指针传输特大变量。
5.可能有人问,队列有什么用处呢?
确实,用全局变量直接很多。但在中断的时候,如果中断执行的时间很长,数据处理量很大,会影响正常任务的运行。因次我们通过把数据转移到任务里面再作处理,减小中断开销。 六、其他功能
还有软件时钟管理、事件管理、解决互斥问题的内存管理方法等等,可以先不管,还未看到过有人用,感觉事件管理还不如来个全局变量flag。七、数据类型
freertos有自己的命名规格,在portmarco.h文件里。

今天就先介绍到这里,吐血整理,希望对你有帮助。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值