三,FreeRTOS之——动态创建多任务+优先级

声明:本专栏参考韦东山,野火,正点原子以及其他博主的FreeRTOS教程,如若侵权请告知,马上删帖致歉,个人总结,如有不对,欢迎指正。

    • 动态创建多任务+优先级
      • 实验一
      • 实验二
      • 实验三
      • 实验四
      • 实验五
    • 实验总结:
      • 1.同级优先级任务采用时间片轮转调度,轮转时间可调
      • 2.高优先级任务具有优先执行权限,低优先级任务只有等高优先级阻塞或者主动放弃cpu资源才可以执行
      • 3. 高优先级具有抢占作用

动态创建多任务+优先级

在各类RTOS中,因为有中断优先级,和时间片轮转调度,所以才具有实时性

优先级是RTOS的重点,一起看一下任务是怎样一个执行过程

三,FreeRTOS之——动态创建多任务+优先级_第1张图片

这里创建了两个任务函数,提取关键字,任务的优先级都是为2,那么任务都干了什么???

三,FreeRTOS之——动态创建多任务+优先级_第2张图片

分析一下运行的过程,创建了LED1与LED2任务,
猜想:将flag1与flag2添加到逻辑分析仪中,逻辑分析仪中flag1先运行高电平1ms,然后flag2运行,串口打印先打印LED1……然后LED2……就这样交替执行,来看看是这样么

实验一

仿真来看看猜想是否正确,
三,FreeRTOS之——动态创建多任务+优先级_第3张图片

三,FreeRTOS之——动态创建多任务+优先级_第4张图片

实验证明:我们的猜想并不是正确的,居然是任务2先运行???,逻辑分析仪中任务2先运行,然后延时10个tick,轮到任务一执行,依次这样,但是我们可以看到,串口打印的数据是混乱的,这是为什么???,这是因为我们设置的时间片轮转调度的时间太短了或者是进入阻塞的时间太短了,一次打印不完这些数据,说白就是给的时间不够,那么我们改一改轮转调度的时间看看什么效果
更改时间片轮转调度是在FreeRTOSconfig.h配置。

这里我们把1000改成100,也就是1s中断100次,那么每次轮转调度的时间为10ms,看看10ms是否足够串口打印

在这里插入图片描述

实验二

实验二在实验一的基础上只是更改了时间片轮转调度的时间
三,FreeRTOS之——动态创建多任务+优先级_第5张图片
可以看到已经完整的打印出来了,实验证明我们的猜想是正确的。

但是我们要不改变这个轮转调度的时间让他完整打印,如何做到呢???我好像讲跑偏了,这个可以用同步互斥解决,到时候再讲

这篇的主题是优先级,再来做第三个实验

实验三

实验三还是先把轮转调度的时间改回来
在这里插入图片描述

先来创建三个任务,任务1,2,3的优先级分别为3 2 2,在FreeRTOS中,数字越大,优先级越高,但是最大只有32,为了不浪费资源,我们一般把它设置为用到的最大优先级,是在FreeRTOSconfig.h中配置
三,FreeRTOS之——动态创建多任务+优先级_第6张图片

再看看各任务都在干嘛,注意任务一没有加延时函数
三,FreeRTOS之——动态创建多任务+优先级_第7张图片
三,FreeRTOS之——动态创建多任务+优先级_第8张图片

来仿真看下任务怎么运行
逻辑分析仪中
三,FreeRTOS之——动态创建多任务+优先级_第9张图片
串口(这里没有其他资源共享cpu所以全部打印)
三,FreeRTOS之——动态创建多任务+优先级_第10张图片
可以得到什么结论呢,高优先级的任务具有执行权限,低优先级貌似没有,那这还怎么玩儿???这让其他任务怎么活啊
当然是有让其他任务运行的方法了,接下来实验四

实验四

我们给这个最高优先级的加一个延时函数再看看实验结果
三,FreeRTOS之——动态创建多任务+优先级_第11张图片

分析时序,首先任务一先执行,然后是任务二,接着任务三,这时候就可以让低优先级的任务也运行了,

三,FreeRTOS之——动态创建多任务+优先级_第12张图片

分析串口:啊这???没法分析,太乱了,其实就是切换时间快了,打印慢了。以后再讲如何处理
三,FreeRTOS之——动态创建多任务+优先级_第13张图片

记住:vTaskDelay()是个好东西,不仅仅有延时的效果,还可以让其他低优先级任务执行,
vTaskDelay()我把它看做睡觉,夏天太热,只有一把扇子,但是同一时刻只能有一个人用,爷爷最大,再是爸爸,再是儿子,爷爷睡着了爸爸才可以用扇子,儿子想用扇子只有等爷爷和爸爸都在睡觉才可以。

实验五

这三个任务中,让最高的优先级一直计数,计数到1000时候触发一次,看看实验效果
三,FreeRTOS之——动态创建多任务+优先级_第14张图片
三,FreeRTOS之——动态创建多任务+优先级_第15张图片

以下就是实验效果,大概过了1s之后,这里任务1执行了一次,这里的时序不怎么对,实际上来说,应该在3s左右才会触发一次,为什么这样说呢,三个任务可以执行,cpu在同一时间上只能处理一个任务,计数1次要3ms,计数1000次就应该要3s才对,这里不能完全看时序图呀,因为我不会调……呜呜呜。这个实验可以知道,高优先级任务具有抢占的作用,管你什么任务在执行,我是爷,我最大,小弟统统闪开。
三,FreeRTOS之——动态创建多任务+优先级_第16张图片

实验总结:

1.同级优先级任务采用时间片轮转调度,轮转时间可调

2.高优先级任务具有优先执行权限,低优先级任务只有等高优先级阻塞或者主动放弃cpu资源才可以执行

3. 高优先级具有抢占作用

git仓库源码地址:https://gitee.com/he-dejiang/free-rtos.git

你可能感兴趣的:(FreeRTOS,stm32,freertos)