FreeRTOS新手+入门学习笔记

今日头条

1115人已加入

描述

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

二、FreeRTOS的核心功能

FreeRTOS


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

FreeRTOS

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

下图为heap2内存分配方式

FreeRTOS

下图为heap4内存分配方式

FreeRTOS


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


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

FreeRTOS

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

FreeRTOS

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

FreeRTOS

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

FreeRTOS


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

FreeRTOS

这是不用delay的时候

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

FreeRTOS

这是用delay的情况


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

FreeRTOS


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

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


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

FreeRTOS

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

FreeRTOS

3.接收队列

FreeRTOS

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

lw

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分