FreeRTOS 笔记之⑦:多优先级支持

本文介绍了FreeRTOS如何支持多优先级任务,包括如何通过就绪列表数组实现任务按优先级插入,以及查找最高优先级就绪任务的通用方法和处理器优化方法。文章详细解析了通用方法中的taskRECORD_READY_PRIORITY()和taskSELECT_HIGHEST_PRIORITY_TASK()函数,以及优化方法中利用Cortex-M内核的CLZ指令快速确定最高优先级。
摘要由CSDN通过智能技术生成

目录

1. 如何支持多优先级

2. 查找最高优先级的就绪任务

2.1 通用方法(普适性)

2.2 优化方法(专业性)

3. 代码修改


之前的章节,FreeRTOS还没有支持多优先级,只支持两个任务互相切换,从本章开始,任务中我们开始加入优先级的功能。在FreeRTOS中,数字优先级越小,逻辑优先级也越小,这与隔壁的RT-Thread和μC/OS刚好相反。

1. 如何支持多优先级

就绪列表pxReadyTasksLists[ configMAX_PRIORITIES ]是一个数组,数组里面存的是就绪任务的TCB(准确来说是TCB里面的xStateListItem节点),数组的下标对应任务的优先级,优先级越低对应的数组下标越小。空闲任务的优先级最低,对应的是下标为0的链表。图 演示的是就绪列表中有两个任务就绪,优先级分别为1和2,其中空闲任务没有画出来,空闲任务自系统启动后会一直就绪,因为系统至少得保证有一个任务可以运行。

configMAX_PRIORITIES  为任务优先级数量,若 配置为 5,则优先级范围【0,4】,其余以此类推。

任务在创建的时候,会根据任务的优先级将任务插入到就绪列表不同的位置。相同优先级的任务插入到就绪列表里面的同一条链表中,这就是我们下一章要讲解的支持时间片轮转。 

pxCurrenTCB是一个全局的TCB指针,用于指向优先级最高的就绪任务的TCB,即当前正在运行的TCB。那么我们要想让任务支持优先级,即只要解决在任务切换(taskYIELD)的时候,让pxCurrenTCB指向最高优先级的就绪任务的TCB就可以,前面的章节我们是手动地让pxCurrenTCB在任务1、任务2和空闲任务中轮转,现在我们要改成pxCurrenTCB在任务切换的时候指向最高优先级的就绪任务的TCB即可,那问题的关键就是:如果找到最高优先级的就绪任务的TCB。

FreeRTOS提供了两套方法,一套是通用的,一套是根据特定的处理器优化过的,接下来我们重点讲解下这两个方法。

2. 查找最高优先级的就绪任务

<
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeRTOS是一个开源的实时操作系统(RTOS),专门用于嵌入式系统。它提供了一套可移植的API,使开发者能够轻松地编写多任务应用程序。 以下是一些关于FreeRTOS笔记: 1. 任务(Tasks):FreeRTOS使用任务实现并行执行。每个任务都有自己的独立堆栈空间和优先级。任务可以创建、删除和挂起。 2. 调度器(Scheduler):FreeRTOS的调度器负责决定哪个任务应该在给定时间运行。它使用优先级调度算法,并且可以配置为使用抢占式或协作式调度。 3. 信号量(Semaphores):信号量是一种用于同步和通信的对象。它可以用于任务之间的互斥访问共享资源或任务之间的通信。 4. 队列(Queues):队列提供了一种任务之间传递数据的方式。任务可以将数据发送到队列,另一个任务可以从队列中接收数据。 5. 事件标志组(Event Flags):事件标志组用于任务之间的同步和通信。一个任务可以等待一组特定的事件标志发生,另一个任务可以设置或清除这些事件标志。 6. 定时器(Timers):FreeRTOS提供了软件定时器,可以在指定时间间隔内运行回调函数。 7. 内存管理(Memory Management):FreeRTOS提供了内存管理功能,可以动态分配和释放内存。 8. 中断(Interrupts):FreeRTOS可以与硬件中断一起使用,以实现任务的抢占式调度。 这些只是FreeRTOS的一些基本概念和功能,它还有很多其他特性和组件。如果你对某个特定方面有更多的兴趣,请告诉我,我会提供更详细的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值