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

动态创建多任务+优先级

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

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

在这里插入图片描述

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

在这里插入图片描述

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

实验一

仿真来看看猜想是否正确,
在这里插入图片描述

在这里插入图片描述

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

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

在这里插入图片描述

实验二

实验二在实验一的基础上只是更改了时间片轮转调度的时间
在这里插入图片描述
可以看到已经完整的打印出来了,实验证明我们的猜想是正确的。

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

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

实验三

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

先来创建三个任务,任务1,2,3的优先级分别为3 2 2,在FreeRTOS中,数字越大,优先级越高,但是最大只有32,为了不浪费资源,我们一般把它设置为用到的最大优先级,是在FreeRTOSconfig.h中配置
在这里插入图片描述

再看看各任务都在干嘛,注意任务一没有加延时函数
在这里插入图片描述
在这里插入图片描述

来仿真看下任务怎么运行
逻辑分析仪中
在这里插入图片描述
串口(这里没有其他资源共享cpu所以全部打印)
在这里插入图片描述
可以得到什么结论呢,高优先级的任务具有执行权限,低优先级貌似没有,那这还怎么玩儿???这让其他任务怎么活啊
当然是有让其他任务运行的方法了,接下来实验四

实验四

我们给这个最高优先级的加一个延时函数再看看实验结果
在这里插入图片描述

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

在这里插入图片描述

分析串口:啊这???没法分析,太乱了,其实就是切换时间快了,打印慢了。以后再讲如何处理
在这里插入图片描述

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

实验五

这三个任务中,让最高的优先级一直计数,计数到1000时候触发一次,看看实验效果
在这里插入图片描述
在这里插入图片描述

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

实验总结:

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

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

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

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

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值