15-FreeRTOS任务应用函数(1)

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 = 0; x < uxArraySize; x++ )
         {
           /* 计算任务运行时间与总运行时间的百分比。*/
           ulStatsAsPercentage = 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 += strlen( ( char * ) pcWriteBuffer );
         }
      }
 
      /* 释放之前申请的内存*/
     vPortFree( pxTaskStatusArray );
   }
}

2-获取任务消息(vTaskGetInfo())

2.1 函数描述

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

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

2.2 参数描述

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

2.3 用例

void vAFunction( void )
{
TaskHandle_t xHandle;
TaskStatus_t xTaskDetails;

    /* 从任务的名称中获取任务句柄。*/
    xHandle = 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;

   /*指向任务名称的指针。这个值将无效,如果任务被删除,因为结构已填充! */
   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;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
第一篇 平台篇 第1章 ARM处理器简介 1.1 ARM内核处理器沿革 1.1.1 传统ARM处理器 1.1.2 Cortex内核处理器 1.2 Cortex内核系列处理器技术特点 1.2.1 ARM Cortex-M系列处理器 1.2.2 ARM Cortex-R系列处理器 1.2.3 ARM Cortex-A系列处理器 1.3 STM32互联型嵌入式控制器 1.4 微控制器选型 1.4.1 选型因素 1.4.2 选型示例 第2章 基于STM32F107的开发板 2.1 STM32F107开发板 2.2 主要板载资源 2.2.1 10/100M以太网接口 2.2.2 CAN总线接口 2.2.3 RS485总线接口 2.2.4 其他总线接口 2.3 硬件设计要点 2.3.1 电磁兼容问题 2.3.2 信号完整性 2.3.3 电源完整性 第3章 开发环境 3.1 开发环境及搭建 3.1.1 常见开发环境 3.1.2 IAR EWARM安装 3.1.3 RealView MDK安装 3.2 相关开发工具 3.3 创建工程 第4章 编程规范 4.1 ST固件库编程规范 4.1.1 缩写 4.1.2 命名规则 4.1.3 编码规则 4.2 基于C语言的嵌入式编程规范 4.2.1 源代码的排版 4.2.2 源代码的注释 4.2.3 标识符命名 4.2.4 代码可读性 4.2.5 变量、结构 4.2.6 函数、过程 4.2.7 可测性 4.2.8 程序效率 4.2.9 质量保证 4.2.10 代码编辑、编译、审查 4.2.11 测试与维护 4.2.12 宏定义 第5章 项目规划 5.1 概述 5.2 系统分析 5.3 系统设计 5.4 系统制造 5.5 系统运用及反馈 5.6 开发团队 5.6.1 团队负责人 5.6.2 调研人员 5.6.3 开发人员 第二篇 RTOS篇 第6章 操作系统原理基础知识 6.1 前后台模式应用程序 6.2 嵌入式操作系统 6.2.1 相关基本概念 6.2.2 系统调用 6.2.3 操作系统结构 6.2.4 进程与任务 6.2.5 进程间的通信 6.2.6 进程调度 6.2.7 存储管理 第7章 FreeRTOS嵌入式操作系统 7.1 FreeRTOS特色 7.2 任务管理 7.2.1 任务函数 7.2.2 基本任务状态 7.2.3 任务创建 7.2.4 任务的优先级 7.2.5 非运行状态 7.2.6 空闲任务及回调函数 7.2.7 改变任务优先级 7.2.8 删除任务 7.2.9 调度算法概述 7.3 队列管理 7.3.1 概述 7.3.2 使用队列 7.3.3 大型数据单元传输 7.4 中断管理 7.4.1 延迟中断处理 7.4.2 计数信号量 7.4.3 在中断服务例程中使用队列 7.4.4 中断嵌套 7.5 资源管理 7.5.1 基本概念 7.5.2 临界区与挂起调度器 7.5.3 互斥量 7.5.4 互斥的另一种实现 7.6 内存管理 7.6.1 概述 7.6.2 内存分配方案范例 7.7 常见错误 7.7.1 概述 7.7.2 栈溢出 7.7.3 其他常见错误 第8章 基于STM32F107的FreeRTOS移植 8.1 概述 8.2 FreeRTOS移植 8.2.1 portmacro.h头文件 8.2.2 port.c源文件 8.2.3 portasm.s汇编源文件 8.2.4 其他问题 8.3 创建测试任务 第三篇 LwIP篇 第9章 TCP/IP协议栈介绍 9.1 引言 9.2 网络分层 9.2.1 OSI七层参考模型 9.2.2 TCP/IP分层 9.2.3 TCP/IP协议簇的协议 9.3 IP协议 9.4 ARP协议与RARP协议 9.5 ICMP 9.6 TCP协议 9.7 UDP协议 9.8 FTP协议 第10章 LwIP轻量级TCP/IP协议栈 10.1 LwIP进程模型 10.2 LwIP缓冲与内存管理 10.2.1 LwIP动态内存管理机制 10.2.2 LwIP的缓冲管理机制 10.3 LwIP网络接口 10.4 LwIP的ARP处理 10.5 LwIP的IP处理 10.6 LwIP的ICMP处理 10.7 LwIP的UDP处理 10.8 LwIP的TCP处理 10.8.1 TCP处理流程概述 10.8.2 TCP控制块 10.8.3 LwIP的TCP滑动窗口 10.8.4 LwIP的TCP超时与重传 10.8.5 LwIP的TCP拥塞控制 10.8.6 LwIP的TCP定时器 10.9 LwIP的应用程序接口简介 10.9.1 RAW API接口 10.9.2 Sequential API接口 第11章 基于STM32F107的LwIP移植 11.1 ethernetif.c文件的移植 11.1.1 ethernetif_init函数 11.1.2 low_level_init函数 11.1.3 ethernetif_input函数 11.1.4 low_level_input函数 11.1.5 low_level_output函数 11.2 网络驱动移植 11.2.1 以太网控制器概述 11.2.2 以太网控制器硬件配置 11.2.3 以太网控制器硬件的引脚配置 11.2.4 以太网驱动之接收 11.2.5 以太网驱动之发送 11.2.6 其他注意事项 11.3 基于RAW API接口的HelloWorld例程 第四篇 移植篇 第12章 基于FreeRTOS的LwIP协议栈移植 12.1 概述 12.2 FreeRTOS下以太网驱动程序的移植 12.3 LwIP程序移植 12.3.1 以太网接口文件ethernetif.c的移植 12.3.2 操作系统模拟层文件sys_arch.c的移植 第13章 工业通信网关解析 13.1 概述 13.2 编码实现 13.3 通信测试 附录A 开发板原理图 附录B 专业术语 参考文献
### 回答1: Modbus是一种常用的串行通信协议,其主从架构适用于工控领域。STM32是一系列微控制器芯片,其中包含了强大的处理器和周边设备,适用于工业控制、通信等应用。HAL是STM32提供的硬件抽象层,可以简化STM32芯片的驱动和编程过程。FreeRTOS是一个流行的实时操作系统,可以帮助开发者进行多线程编程、任务调度等操作。 在使用Modbus通信协议的过程中,通常使用STM32芯片作为主机或从机,通过HAL驱动与外设进行通信。通过FreeRTOS实现多任务调度,可以使得主从设备之间的通信更加稳定可靠。具体实现过程中,开发者需要熟悉Modbus协议的通信机制和STM32芯片的相关知识,同时掌握HAL驱动和FreeRTOS操作系统的编程方法。相应的,也可以选择其他适用于工控领域的通信协议和芯片平台进行开发。 ### 回答2: Modbus是一种通信协议,它被广泛应用于工业自动化领域。Modbus协议采用主从结构,主设备控制整个通信过程,从设备接收主设备发送的指令并返回相应的数据。STM32是一系列单片机产品,Hal是针对STM32开发的一套低层驱动库,FreeRTOS是一种流行的实时操作系统。 在使用STM32单片机实现Modbus主从通信时,可以使用Hal库提供的相关函数来对串口进行初始化和设置,同时可以使用FreeRTOS来实现多任务并行运行。对于Modbus协议的实现,可以利用从设备的地址进行区分,主设备通过读写寄存器的方式与从设备进行通信,而从设备则需要根据读写寄存器的指令进行相应的数据处理和返回。 总之,通过使用STM32、Hal库和FreeRTOS可以方便地实现Modbus主从通信,提高工业自动化控制系统的效率和稳定性。 ### 回答3: Modbus,又称为Modicon通信协议,是一种基于串行传输的通信协议。Modbus协议中定义了Master-Slave模式的通信方式,其中Master可以向Slave发送读/写命令,Slave可以回复数据给Master。STM32是一种32位的嵌入式微控制器,可以通过外围设备如串口等实现Modbus的通信。HAL则是ST公司提供的硬件抽象层,可以简化开发者对系统引脚和外设的访问。FreeRTOS则是一种开源的实时操作系统,可以帮助开发者实现多任务系统。 因此,modbus-master-slave-stm32-hal-freertos指的是使用STM32芯片作为Modbus通信的主体,使用HAL层引脚和外设抽象库简化访问,使用FreeRTOS实现基于多任务的系统设计,实现Modbus通信的Master-Slave模式。这种模式可以用于控制系统的监控和控制,能够实现高效、准确、可靠的数据交换,广泛应用于自动控制、仪器仪表、工业自动化等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

南山府嵌入式

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

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

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

打赏作者

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

抵扣说明:

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

余额充值