建立FreeRTOS操作系统
-
STM32CubeMX中选择FreeRTOS
-
选择CMSIS_V1(CMSIS_V1和CMSIS_V2是两个版本,这里我们选择CMSIS_V1)
-
对操作系统进行简要配置:简要参数如下
-
USE_PREEMPTION:是否支持抢占机制,支持则设为Enabled
TICK_RATE_HZ:系统时钟频率,时钟按照该速率为FreeRTOS中各个任务执行计时-eg:设置为1000,则每个任务的最小调度时间为1ms
MAX_PRORITIES:最大优先级数量,默认为7
MINIMAL_STAK_SIZE:最小任务栈大小,每创建一个任务,都需要为该任务分配一定大小的空间,默认为128个字
MAX_TASK_NAME_LEN:最大任务名称长度,在创建任务时,需要给每个任务起名为标识,默认为16
-
创建任务,对任务进行配置,具体配置如下(Task and Queues)
-
Task Name:任务名称
Priority:任务创建时的优先级
Stack Size (Words):任务栈的大小,默认单位为字
Enrty Function:任务函数的入口
Code Generation Option:任务函数代码的生成方式
As weak:产生一个用__weak修饰符修饰的任务函数
As external:产生一个外部引用的任务函数,用户需要自己实现该函数
Default:产生一个默认格式的任务函数,用户需要在该函数实现功能
-
生成工程,将自动生成FreeRTOS的底层源代码
-
在FreeRTOS.c中调用osThresdDef()对要创建的任务进行设置
-
然后调用osThreadCreate()进行创建一个任务
-
具体参数设置如下
-
名称:osTheardDef
功能:对要创建的任务进行设置
参数1:name-要创建的任务名称
参数2:thread-要创建的任务代码的入口名称
参数3:priority-要创建的任务的优先级
参数4:instances-任务下可创建的线程数量
参数5:stacksz-任务栈大小
名称:osThreadCreate
功能:创建一个任务
返回值:osThread-任务ID
参数1:const osThreadDef_t *thread_def-我们通过osThreadDef所设置的任务参数,采用强制转换+任务名的方式进行-eg:在osThreadDef中设置任务名称为LED_RED,则此处输入osThread(LED_RED)
参数2:void *argument-任务需要的初始化参数,一般填NULL
操作系统基础配置完成
对操作系统的简要理解
操作系统的三种重要的调度算法
-
先来先服务(FCFS)算法
-
FCFS调度算法,该算法的原理非常简单,当存在多个任务的时候,先就绪的任务占用CPU,直到任务执行结束,进入阻塞态后释放CPU,此时下一个任务才可以占有CPU。
-
优先级调度算法
-
优先级调度算法,我们可以提前给各个任务赋予不同的优先级,当一个进程占有了CPU的时候,假如有一个更高优先级的任务就绪,则正在运行的任务会被挂起,转而执行高优先级的任务,直到高优先级任务执行完毕之后,再恢复原任务继续执行。
-
时间片轮转调度算法
-
时间片轮转调度算法,为了避免某个任务执行时间过长,导致其他任务一直等待的情况出现,给每一个任务划定一段特定长度的运行时间,成为时间片。如果任务执行时间超出了时间片。则该任务将被挂起,转而执行其他的任务。
当FreeRTOS开始运行后,将同时遵从以上三个算法的原则对各个任务进行调度。
对不同优先级的任务采用优先级调度算法,对于同优先级的任务采用FCFS算法和时间片轮转算法。
需要注意的是FreeRTOS中的任务,不论优先级,都可以被中断给打断。
当需要在FreeRTOS中进行延时操作时,可以通过将任务挂起一段时间的方式实现。在该任务挂起时,其他任务可以占有CPU,等延时结束后,原先被挂起的任务又恢复执行。
一般称呼不使用操作系统的单片机开发方式为“裸机开发“,当进行逻辑开发时,需要自己设计循环,中断,定时等功能来控制各个任务的执行顺序。
而使用操作系统进行开发时,只需要创建任务,操作系统会自动按照一些特定的机制自动进行任务的运行和切换。
注意:使用FreeRTOS后时钟源应该进行更改,不建议使用systick