FreeRTOS——任务调度

1.开启任务调度器

1.1 vTaskStartScheduler()

作用:启动任务调度器
实现功能:1)创建空闲任务、2)若能使能定时器,创建定时器任务、3)关闭中断、防止任务任务调度器开启之前或中断中,受中断干扰,4)初始哈全局变量,将运行标志设置为已运行,5)初始化任务时间统计功能的时基定时器、6)调用函数xPortStartSchedule()

1.2 xPortStartSchedule()

作用:启动与硬件架构相关配置,启动第一个任务函数内部实现
1)配置PenSV和Systick的中断优先级为最低优先级
2)调研函数xPortSetupTimerInterrupt()配置Systick
3)初始化临界区嵌套计数为0
4)调用函数prvStartFirstTask()启动第一个任务

2.启动第一个任务

2.1 prvStartFirstTask()

作用:初始化启动第一个任务前的环境,主要重新设置MSP(主堆栈指针)指针,并使能全局中断。
MSP:是向量表的第一个元素,主要用于中断

2.1 vPortSVCHandler() SVC中断服务函数

1)通过pxCurrentTCB获取优先级最高的就绪状态任务的任务栈地址
2)通过栈顶地址,通过栈顶地址将栈中内容出栈到CPU寄存器中,然后设置PSP指针
3)出栈(恢复现场),方向从下往上
压栈(保存现场),从高到低

3 任务切换

本质:CPU寄存器的切换
任务从A切换到B步骤:
1)暂停任务A的执行,将任务A的寄存器保存到任务堆栈中,保存现场
2)将任务B的各个寄存器恢复到CPU寄存器上,较恢复现场
这个过程称为上下文切换
在这里插入图片描述

4.1其他知识总结

4 .1PendSV中断是如何触发

1、滴答定时器中断调用
2、执行FreeRTOS提供的相关API函数:portYIELD()
本质:通过向中断控制和状态寄存器 ICSR 的bit28 写入 1 挂起 PendSV 来启动 PendSV 中断

4 .2查找最高优先级任务

vTaskSwitchContext( ) /查找最高优先级/
taskSELECT_HIGHEST_PRIORITY_TASK( ) /* 通过这个函数完成 *

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
FreeRTOS任务的优先级通过配置文件FreeRTOSConfig.h中的configMAX_PRIORITIES宏定义进行设置。用户可以将可用的优先级范围从0到configMAX_PRIORITIES - 1进行配置。建议将configMAX_PRIORITIES的最大值设置为不超过32。空闲任务的优先级为0,而任务的优先级数值越小,优先级越低。 通常情况下,任务的优先级可以根据以下几个方案进行分配: 1. 中断任务:这些任务是通过中断服务程序触发的,应该设置为所有任务中优先级最高的。 2. 高优先级后台任务:例如按键检测、触摸检测、USB消息处理、串口消息处理等,这类任务可以归为高优先级后台任务。 3. 低优先级的时间片调度任务:例如emWin的界面显示、LED数码管的显示等不需要实时执行的任务,可以归为低优先级的时间片调度任务。 4. 空闲任务:空闲任务是系统任务。 需要注意的是,中断的优先级永远高于任何任务的优先级,即任务在执行的过程中,中断来了就开始执行中断服务程序。因此,中断优先级的数值越小,优先级越高;任务优先级数值越小,优先级越低。 关于为什么设置最大优先级为32个的疑惑,实际上,虽然一般十几个优先级就足够使用了,但是最大优先级的设置还是有一些限制条件的。具体限制条件可能与系统硬件或软件的实现有关,但是没有提供具体的信息。 在FreeRTOS中,任务调度器会根据优先级来选择就绪任务进行执行。调度器会从优先级最高的任务开始查找就绪任务,如果找到了就会跳出循环,将找到的任务分配给TCB任务控制块去执行。然后,将找到的优先级传递给uxTopReadyPriority变量。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [FreeRTOS任务优先级](https://blog.csdn.net/m0_55744970/article/details/125951720)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [FreeRTOS的学习(二)——任务优先级问题](https://blog.csdn.net/qq_39397153/article/details/123666584)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_libinc++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值