首页 > 其他分享 >FreeRTOS--列表和列表项

FreeRTOS--列表和列表项

时间:2024-08-22 14:24:51浏览次数:11  
标签:深色 FreeRTOS -- 调度 列表 任务 就绪

目录

1 列表(Lists)

2 列表项(List Items)

3 使用列表和列表项

4 使用实例


在FreeRTOS中,列表和列表项是非常重要的数据结构,用于实现任务管理和调度。以下是关于这两个概念的详细介绍:

1 列表(Lists)

列表是FreeRTOS中的一种数据结构,用于存储任务状态的信息。主要有两种类型的列表:就绪列表和延迟列表。

  1. 就绪列表(Ready Lists): 就绪列表包含的是那些已经准备好运行的任务。当一个任务被调度器选中执行时,它会被放入相应的就绪列表中。就绪列表按照优先级排序,这样调度器就可以选择最高优先级的任务作为下一个要运行的任务。

  2. 延迟列表(Delayed Lists): 延迟列表则用于存储那些因为某种原因而暂时不能运行的任务。例如,一个任务可能会因为等待某个事件的发生而进入延时状态,此时它就会被移到对应的延迟列表中。

2 列表项(List Items)

列表项是列表中的元素,每个列表项对应于一个任务。列表项由两个指针组成:前向指针和后向指针,用于形成双向链表。此外,列表项还包含任务状态信息,比如任务的优先级、是否处于挂起状态等。

在FreeRTOS中,列表项通过xListEntry结构体表示。这个结构体定义如下:

c

深色版本

1typedef struct xLIST_ITEM {
2    volatile struct xLIST_ITEM *pxNext; /*< The next list item in the list. */
3    volatile struct xLIST_ITEM *pxPrevious; /*< The previous list item in the list. */
4} xListItem;

3 使用列表和列表项

FreeRTOS使用列表和列表项来管理任务的调度。每当有新的任务加入到系统中,或者任务的状态发生变化时,都会涉及到列表和列表项的操作。例如,当一个新的任务被创建时,会为其分配一个列表项,并将其插入到合适的列表中;当任务完成或者发生错误时,会从列表中移除其对应的列表项。

列表和列表项的设计使得FreeRTOS能够在不消耗大量内存的情况下高效地管理大量的并发任务。这是因为列表只需要存储必要的任务状态信息,而不是整个任务的上下文。同时,双向链表的结构也使得在列表中查找、插入和删除任务变得非常快速。

总的来说,列表和列表项是FreeRTOS实现任务调度的关键部分,它们帮助FreeRTOS保持了良好的性能和灵活性。

4 使用实例

在FreeRTOS中,列表和列表项主要用于任务调度和管理。这里有一个简单的例子来说明如何使用列表和列表项:

假设我们有一个简单的RTOS应用,其中有两个任务:TaskA和TaskB。TaskA每秒打印一次"Hello from Task A!",而TaskB每秒打印一次"Hello from Task B!"。我们将使用列表和列表项来管理这两个任务。

首先,我们需要在FreeRTOS的源代码中包含必要的头文件:

c

深色版本

1#include "FreeRTOS.h"
2#include "task.h"

接下来,我们可以定义两个任务函数:

c

深色版本

1void vTaskA(void *pvParameters)
2{
3    for(;;)
4    {
5        printf("Hello from Task A!\n");
6        vTaskDelay(pdMS_TO_TICKS(1000)); // 延迟1000毫秒
7    }
8}
9
10void vTaskB(void *pvParameters)
11{
12    for(;;)
13    {
14        printf("Hello from Task B!\n");
15        vTaskDelay(pdMS_TO_TICKS(1000));
16    }
17}

现在,我们需要创建这两个任务并将它们添加到就绪列表中:

c

深色版本

1// 创建任务A
2xTaskCreate(vTaskA, "TaskA", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
3
4// 创建任务B
5xTaskCreate(vTaskB, "TaskB", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);

在上面的代码中,xTaskCreate() 函数用于创建任务。它接受几个参数,包括任务函数名、任务名称、任务堆栈大小、优先级和任务句柄。注意,我们在这里没有使用任务句柄,因为我们不需要直接访问这些任务。

最后,启动调度器:

c

深色版本

1vTaskStartScheduler();

在实际应用中,列表和列表项的使用更为复杂,因为它们涉及到了任务的调度和管理。例如,当一个任务被挂起或唤醒时,它会在列表中移动。同样,当一个任务完成或出错时,它也会从列表中移除。这些都是由FreeRTOS的内部实现自动处理的,无需开发者直接操作列表和列表项。

然而,理解列表和列表项的概念对于理解FreeRTOS的内部工作原理非常重要。在调试RTOS应用时,了解列表和列表项可以帮助你更好地理解任务是如何调度和管理的。

标签:深色,FreeRTOS,--,调度,列表,任务,就绪
From: https://blog.csdn.net/MHD0815/article/details/141387621

相关文章

  • 本周送黑神话悟空,抽奖开始!直面天命!!
    文章目录一等奖:黑神话悟空标准版1份。二等奖:瑞幸腾云美式一杯☕️x1活动规则一等奖:黑神话悟空标准版1份。(最终不一定是WeGame,看你是哪个平台都可。中奖后1天内联系我)......
  • Spring Cloud LoadBalancer 源码解析
    前言LoadBalancer(负载均衡器):一种网络设备或软件机制,用于分发传入的网络流量负载到多个后端目标服务器上,依次来提高系统的可用性和性能,SpringCloud2020版本以后,移除了对Netflix的依赖,也就移除了负载均衡器Ribbon,SpringCloud官方推荐使用Loadbalancer替换Ribbon,并......
  • 【AD9361 数字基带】多片基带内FPGA补偿 I/Q Rotation
    I/Q旋转Rotation在许多多通道射频系统中,如AD-FMCOMMS5,甚至在AD-FMCOMMS2、AD-FMCOMMS3上,都需要测量或校正两个复数(I/Q)RF信号之间的相位差。从纯粹的数学描述来看,单个正弦波没有相位,一个相位只能在两个不同的正弦波之间发展。增加复杂性的是,我们没有一个单一的真实......
  • 详解Elastic Search及架构
    前言             如果我有三段文本,id分别为0、1、2,具体如下,我要找到哪段文本里有关键词es,这时最容易想到的办法就是依次遍历文本,匹配es,最后将符合的文本id输出。    0 ilike es    1 ilovees    2 iusedevops......
  • Go语言基础--函数基本介绍及包
    Go语言(也称为Golang)的函数是执行特定任务的代码块。它们允许你重用代码,让程序更加模块化和易于维护。在Go中,函数可以接收参数(输入值)并返回结果(输出值)。下面详细解释Go语言中的函数:函数定义函数通过 func 关键字定义。基本结构如下:funcfunctionName(parameterList)......
  • 链表的一些常用函数
    本文用一个相同的主函数和结构体来讲述链表的14种常见函数主函数和结构体#include<stdio.h>#include<stdlib.h>typedefstructnode{ intnum; structnode*p_next;}node;typedefstruct{ nodehead; nodetail;}link;intmain(){ linklnk={0}; li......
  • Cell子刊|最新研究:多种细胞的花样死法均与表观遗传密切相关
    细胞凋亡是哺乳动物细胞中发现的第一种可被调节的细胞死亡形式,由caspase-3和caspase-7执行。活细胞中caspase-3和caspase-7处于休眠状态,当细胞外细胞因子或细胞内应激信号刺激后,caspase-3和caspase-7由上游caspase-8和caspase-9激活,引发凋亡。当caspase-8被抑制时,相同的细胞死......
  • avalonia学习之按钮
    Button按钮是一个对指针动作做出反应的控件(并且有一些键盘等效物)。当指针向下时,它以按下状态的形式呈现视觉反馈。指向指针释放序列的指针被解释为点击;并且这种行为是可配置的。在确定用户是否按下按钮时,始终使用Click事件而不是PointerPressed。单击是特定于按钮的高级......
  • ado.net 操作sqlite
    新建控制台项目安装nuget包Microsoft.Data.Sqlite数据库名字和链接stringdbName="test.db";SqliteConnection?connection=null;try{//创建链接connection=newSqliteConnection($"DataSource={dbName}");//打开链接connection.Open();......
  • Typora
    汇总上面所有帖子的信息,整理后的步骤如下,并提供一种去除左下角“未激活”提示的不完美的修改方案:1.修改Typora安装目录\resources\page-dist\static\js\LicenseIndex.xxxxxxxxx.xxxxxxx.chunk.js,激活主程序查找:e.hasActivated="true"==e.hasActivated,替换:e.hasActivated="true"......