前言
2021年的全国大学生电子设计竞赛延期了,这就让我们这群电赛人难得有了空档期,借此机会学习一些新的东西。 注:在本文我不介绍FreeRTOS的移植,因为在正点原子的开发手册中有非常详细的讲解,如果项目要求再去学习也不迟,在前期学习中找到自己开发板的那个例程就好了,我的开发板是STM32F407。
一、FreeRTOS是什么?
FreeRTOS的英文全称是:Free Real Time Operating System。翻译成中文有几个关键词:免费、实时、操作系统。
免费,是指这个操作系统是开源的,使用它是不用付钱的,基于这一点很多的公司为了节约成本,在设计产品系统的时候都要求使用FreeRTOS,这就导致了FreeRTOS被广泛使用。
实时,是指FreeRTOS在实际的环境中能够对某一个事件做出实时的相应,即具有实时性。而实现实时性,FreeRTOS主要是依靠任务调度器来完成。FreeRTOS通过用户给每个任务分配优先级以及能够实时改变任务的状态,而任务调度器则会根据任务的优先级和任务所处的状态来决定下一刻应该运行哪个任务,这样在遇到实际的事件时,操作系统就可以快速得做出反应。也就是实现实时性。
操作系统,指的是它是一个操作系统。
二、FreeRTOS的任务基础知识
1.多任务系统
在没有使用操作之前,我们写程序大都是在main.c文件中写一个while(1)死循环,来不停的循环运行多个任务。这样写虽然很直观方便,但是它有一个特点就是在上一个任务没有完成之前当前的任务是无法执行的,这就可能导致在实际项目中会出现数据丢包反应延迟的现象,为了处理这个问题我们可以设置中断,通过信号来触发中断或者通过定时来进中断来处理当前任务,但是这样仍旧无法完成解决当前任务没有完成下个任务无法进行的问题。像这样的系统,叫做单任务系统
而使用操作系统后就不一样了,用户可以在操作系统中将一个大任务分成很多个小任务,每个小任务通常都是一个while(1),因为任务调度的存在,操作系统可以每次执行这些小任务一小段时间,尽管说每个时刻仍旧是执行一个任务,但是由于操作系统并不完全执行完一个任务就切换到另一个任务,这样整个系统运行起来就有一种多任务并行的感觉,而且每个任务的运行并不干扰其他任务的。这就是多任务系统。这时候读者应该有一个问题,尽管是每个任务执行一小段时间,但是先后顺序如何决定?FreeRTOS是通过设置不通过任务的优先级来解决的。高优先级就绪状态的任务总是先运行,而且还可以抢占低优先级运行态任务的CPU使用权。因此FreeRTOS系统也是一个抢占式的实时多任务系统。
2.任务的状态
FreeRTOS中的任务有四种状态:运行态、就绪态、阻塞态、挂起态。
运行态:当前任务正在运行的状态。 就绪态:如果该任务已经准备好了,可以进入运行态了,这种状态就是就绪态。 阻塞态:当一个任务正在等待某个外部事件的状态。一般调用vTaskDelay()来使任务进入阻塞态,直至延时周期完成。 挂起态:任务被挂起不能进入运行状态的状态,不同于阻塞态等待延时周期完成了就解除了,挂起态需要调用相应的函数来解除。
这四种状态的关系如下:
3.任务的优先级
·通常情况下,FreeRTOS操作系统设置32级优先级,其中数值越小优先级越低。当然如果有特殊要求,也可以自己设置优先级的级数,一般设置成满足应用要求的最小值。 ·多个任务也可以共用一个优先级,数量不限。如果操作系统同时遇到相同优先级且处于就绪状态的任务时,就会使用时间片轮转调度器获取运行时间。 注:1、空闲任务需要使用优先级0 2、中断函数中要使用FreeRTOS中的API函数的话,中断优先级一定要低于32
4.任务堆栈
当任务调度器打断一个任务去运行另一个任务时,如何保证第二个任务执行时间结束后,前一个任务可以恢复现场,这时候就要运用到任务堆栈了。在每个任务被创建时都会人为地或者系统自动地定义一个对应的堆栈,用来保存现场和恢复现场。 任务堆栈的大小由用户定义,一般根据任务的大小分配空间。这里要注意,因为任务堆栈的数据类型是uint32_t,大小为4个字节。所以我么定义的堆栈的大小是usStackDepth的四倍。
三、FreeRTOS的基础任务函数
1.任务创建和删除
任务创建函数,一般是使用动态创建运用:xTaskCreate()
删除函数运用:vTaskDelete(),参数为删除任务的任务句柄,如果删除自身的话用NULL。
2.任务挂起和恢复
任务的挂起函数用:vTaskSuspend() 任务的恢复函数用: vTaskResume() 在中断中恢复一个任务用:vTaskResumeFromISR() 注:参数都是任务的任务句柄。
总结
本文完全是为了对自己学习进行的一个总结,如果文中有错误欢迎大佬批评指正。
|