16逻辑代码的执行流程

逻辑代码写在开始任务函数内部

非常重要,看完这篇内容,可以理解任务执行的流程

在开始任务内部创建应用任务。

可以看到在开始任务函数内部,有一个临界区,在临界区内执行的函数,调度器不会打断临界区内执行的函数,临界区内的执行顺序为顺序执行

分析一下程序的运行过程:

首先进入main函数,进行硬件的初始化,然后创建开始任务,开始任务创建完成后,就会添加到就绪列表中。(此时就绪列表中有开始任务(优先级1)、空闲任务(优先级0)、软件定时器任务(优先级31)(软件定时任务需要使用才会打开))

然后开启任务调度器,按照优先级高的执行,所以执行开始任务。因为开始任务函数中创建了临界区,所以执行的时候,不会打断。随后将各个应用任务添加到就绪列表中,直到退出临界区后。就会由调度器来执行任务。(此时就序列表中有应用任务(任务的优先级)、空闲任务(优先级0)、软件定时器任务(优先级31)(软件定时任务需要使用才会打开)) 此时调度器会根据优先级来执行任务。

在执行任务的时候,任务当中可能会有阻塞,此时调度器会接着从接续列表中寻找优先级最高的任务继续执行

假设开始函数中没有临界区

程序执行的情况有三种

  1. 应用任务优先级>开始任务优先级

当开启任务调度器,由于开始任务优先级比空闲任务优先级高,所以会执行开始任务,然后再开始任务内,创建任务一,任务一的优先级比开始任务优先级高,所以会执行任务一函数,当任务一函数内有阻塞的时候,会暂停任务一,转去执行开始任务,继续往下执行(不太明白是接着执行,还是重新执行,猜测应该是接着执行,相当于是有阻塞,然后跳转到其他任务内了),比如创建任务二,任务二的优先级比开始任务的哟优先级高,此时就会区执行任务二。

  1. 应用任务优先级=开始任务优先级

FreeRTOS支持时间片轮转调度的,当优先级相同的时候,会根据时间片的大小,来逐个执行。首先创建开始任务,然后开启任务调度器,开始任务优先级大于空闲任务优先级,执行开始任务函数,开始任务函数内部创建应用任务一,应用任务一的优先级与开始任务优先级相同,然后去执行应用任务一,执行一个时间片,然后跳到开始任务,开始任务也执行一个时间片,然后再跳到应用程序一执行一个时间片,以此来循环执行。

  1. 应用任务优先级<开始任务优先级

首先创建开始任务,然后开启任务调度器,执行开始任务函数,由于开始任务函数内创建的应用任务的优先级低于开始任务,因此会将开始任务执行完,然后最后一行是删除开始任务,然后再去根据优先级执行应用任务

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值