热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

15FreeRTOS任务应用函数(1)

1-获取系统的任务状态(uxTaskGetSystemState())1.1函数描述UBaseType_tuxTaskGetSystemState(


1-获取系统的任务状态(uxTaskGetSystemState())

1.1 函数描述

UBaseType_t uxTaskGetSystemState(
TaskStatus_t * const pxTaskStatusArray,
const UBaseType_t uxArraySize,
unsigned long * const pulTotalRunTime );

configUSE_TRACE_FACILITY 必须设置为1
该函数向TaskStatus_t结构体填充相关信息,系统中每一个任务的信息都可以填充到TaskStatus_t结构体数组中,数组大小由uxArraySize指定。结构体TaskStatus_t定义如下:

typedef struct xTASK_STATUS
{
/* 任务句柄 */
TaskHandle_t xHandle;
/* A pointer to the task's name. This value will be invalid if the task was
deleted since the structure was populated! */

const signed char *pcTaskName;
/* A number unique to the task. */
UBaseType_t xTaskNumber;
/* The state in which the task existed when the structure was populated. */
eTaskState eCurrentState;
/* The priority at which the task was running (may be inherited) when the
structure was populated. */

UBaseType_t uxCurrentPriority;
/* The priority to which the task will return if the task's current priority
has been inherited to avoid unbounded priority inversion when obtaining a
mutex. Only valid if configUSE_MUTEXES is defined as 1 in
FreeRTOSConfig.h. */

UBaseType_t uxBasePriority;
/* The total run time allocated to the task so far, as defined by the run
time stats clock. Only valid when configGENERATE_RUN_TIME_STATS is
defined as 1 in FreeRTOSConfig.h. */

unsigned long ulRunTimeCounter;
/* Points to the lowest address of the task's stack area. */
StackType_t *pxStackBase;
/* The minimum amount of stack space that has remained for the task since
the task was created. The closer this value is to zero the closer the task
has come to overflowing its stack. */

configSTACK_DEPTH_TYPE usStackHighWaterMark;
} TaskStatus_t;

注意,这个函数仅用来调试用,调用此函数会挂起所有任务,直到函数最后才恢复挂起的任务,因此任务可能被挂起很长时间。在文件FreeRTOSConfig.h中,宏configUSE_TRACE_FACILITY必须设置为1,此函数才有效。


1.2 参数描述

pxTaskStatusArray:指向TaskStatus_t类型的结构体数组。这个数组至少要包含1个元素。RTOS控制的任务数量可以使用API函数uxTaskGetNumberOfTasks()获取。
uxArraySize:参数pxTaskStatusArray指向的数组大小,也就是该数组的索引数目。
pulTotalRunTime:如果在文件FreeRTOSConfig.h中设置宏configGENERATE_RUN_TIME_STATS为1,则该函数将总运行时间写入*pulTotalRunTime中。pulTotalRunTime可以设置为NULL,表示忽略总运行时间。
返回值:由uxTaskGetSystemState()填充的TaskStatus_t结构的数量。这个值应该等于uxTaskGetNumberOfTasks() API函数返回的值,但是如果uxArraySize参数传递的值太小,它将为零。


1.3 用例

/*本例演示如是使用uxTaskGetSystemState()函数来获取运行时间信息,并将其转化为程序员更易识别的字符格式,这些转化后的字符保存到pcWriteBuffer中。*/
void vTaskGetRunTimeStats(signed char *pcWriteBuffer )
{
TaskStatus_t*pxTaskStatusArray;
volatileUBaseType_t uxArraySize, x;
unsignedlong ulTotalRunTime, ulStatsAsPercentage;

/* 防御性代码,确保字符串有合理的结束*/
*pcWriteBuffer = 0x00;

/* 获取任务总数目*/
uxArraySize = uxTaskGetNumberOfTasks ();

/*为每个任务的TaskStatus_t结构体分配内存,也可以静态的分配一个足够大的数组 */
pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ));

if(pxTaskStatusArray != NULL )
{
/*获取每个任务的状态信息 */
uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize,&ulTotalRunTime );

/* 百分比计算 */
ulTotalRunTime /= 100UL;

/* 避免除零错误 */
if(ulTotalRunTime > 0 )
{
/* 将获得的每一个任务状态信息部分的转化为程序员容易识别的字符串格式*/
for( x &#61; 0; x < uxArraySize; x&#43;&#43; )
{
/* 计算任务运行时间与总运行时间的百分比。*/
ulStatsAsPercentage &#61; pxTaskStatusArray[ x ].ulRunTimeCounter /ulTotalRunTime;

if( ulStatsAsPercentage > 0UL )
{
sprintf( pcWriteBuffer, "%s\t\t%lu\t\t%lu%%\r\n",
pxTaskStatusArray[ x ].pcTaskName,
pxTaskStatusArray[ x ].ulRunTimeCounter,
ulStatsAsPercentage );
}
else
{
/* 任务运行时间不足总运行时间的1%*/
sprintf( pcWriteBuffer, "%s\t\t%lu\t\t<1%%\r\n",
pxTaskStatusArray[ x ].pcTaskName,
pxTaskStatusArray[x ].ulRunTimeCounter );
}

pcWriteBuffer &#43;&#61; strlen( ( char * ) pcWriteBuffer );
}
}

/* 释放之前申请的内存*/
vPortFree( pxTaskStatusArray );
}
}

2-获取任务消息&#xff08;vTaskGetInfo()&#xff09;

2.1 函数描述

void vTaskGetInfo( TaskHandle_t xTask,
TaskStatus_t *pxTaskStatus,
BaseType_t xGetFreeStackSpace,
eTaskState eState );

configUSE_TRACE_FACILITY必须设置1
uxTaskGetSystemState()为系统中的每个任务填充TaskStatus_t结构&#xff0c;而vTaskGetInfo()仅为单个任务填充TaskStatus_t结构。TaskStatus_t结构包含任务句柄的成员、任务名称、任务优先级、任务状态和任务消耗的运行时间总量。
注意:此函数仅用于调试&#xff0c;因为使用它会导致调度器在较长时间内保持挂起状态。


2.2 参数描述

xTask &#xff1a; 正在查询任务的句柄。将xTask设置为NULL将返回调用任务的信息。
**pxTaskStatus&#xff1a;**由pxTaskStatus指向的TaskStatus_t结构体将被xTask参数中传递的句柄所引用的任务的信息填充。
xGetFreeStackSpace&#xff1a; TaskStatus_t结构包含一个成员&#xff0c;用于报告正在查询的任务的堆栈高水位标记。堆栈高水位标志是曾经存在的堆栈空间的最小值&#xff0c;因此该数字越接近零&#xff0c;任务就越接近溢出堆栈。计算堆栈高水位标志需要相对较长的时间&#xff0c;并且可能使系统暂时无响应——因此提供xGetFreeStackSpace参数以允许跳过高水位标志检查。如果xGetFreeStackSpace没有设置为pdFALSE&#xff0c;高水位值只会被写入TaskStatus_t结构。
eState&#xff1a; TaskStatus_t结构体包含一个成员&#xff0c;用于报告正在查询的任务的状态。获取任务状态没有简单的赋值那么快——因此提供eState参数以允许从TaskStatus_t结构中省略状态信息。要获得状态信息&#xff0c;请将eState设置为eInvalid—否则在eState中传递的值将作为TaskStatus_t结构中的任务状态报告。


2.3 用例

void vAFunction( void )
{
TaskHandle_t xHandle;
TaskStatus_t xTaskDetails;
/* 从任务的名称中获取任务句柄。*/
xHandle &#61; xTaskGetHandle( "Task_Name" );
/* 检查句柄是不是任务本身. */
configASSERT( xHandle );
/* 使用句柄可以获得关于任务的进一步信息。 */
vTaskGetInfo( /* 正在查询任务的句柄。 */
xHandle,
/* 要用信息完成的TaskStatus_t结构xTask。 */
&xTaskDetails,
/* Include the stack high water mark value in the
TaskStatus_t structure. */

pdTRUE,
/* 在TaskStatus_t结构中包含任务状态*/
eInvalid );
}

2.4 The TaskStatus_t definition

typedef struct xTASK_STATUS
{
/* 对象中的其余信息所归属的任务句柄结构有关。*/
TaskHandle_t xHandle;
/*指向任务名称的指针。这个值将无效&#xff0c;如果任务被删除&#xff0c;因为结构已填充! */
const signed char *pcTaskName;
/* A number unique to the task. */
UBaseType_t xTaskNumber;
/* The state in which the task existed when the structure was populated. */
eTaskState eCurrentState;
/* The priority at which the task was running (may be inherited) when the
structure was populated. */

UBaseType_t uxCurrentPriority;
/* The priority to which the task will return if the task&#39;s current priority
has been inherited to avoid unbounded priority inversion when obtaining a
mutex. Only valid if configUSE_MUTEXES is defined as 1 in
FreeRTOSConfig.h. */

UBaseType_t uxBasePriority;
/* The total run time allocated to the task so far, as defined by the run
time stats clock. Only valid when configGENERATE_RUN_TIME_STATS is
defined as 1 in FreeRTOSConfig.h. */

unsigned long ulRunTimeCounter;
/* Points to the lowest address of the task&#39;s stack area. */
StackType_t *pxStackBase;
/* The minimum amount of stack space that has remained for the task since
the task was created. The closer this value is to zero the closer the task
has come to overflowing its stack. */

configSTACK_DEPTH_TYPE usStackHighWaterMark;
} TaskStatus_t;






推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
  • 本文介绍了多因子选股模型在实际中的构建步骤,包括风险源分析、因子筛选和体系构建,并进行了模拟实证回测。在风险源分析中,从宏观、行业、公司和特殊因素四个角度分析了影响资产价格的因素。具体包括宏观经济运行和宏经济政策对证券市场的影响,以及行业类型、行业生命周期和行业政策对股票价格的影响。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
author-avatar
道士也调情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有