FreeRTOS-任务信息查询

FreeRTOS-任务信息查询

  • FreeRTOS中提供了很多函数可以用来获取相应的任务信息,这里我们会深入分析vTaskGetInfo()、uxTaskGetSystemState()和vTaskList()这三个函数以及它们之间的一些联系。FreeRTOS中的任务信息查询函数列举如下:
函数名 描述
uxTaskPriorityGet() 获取某任务优先级
vTaskPrioritySet() 改变某任务优先级
uxTaskGetSystemState() 获取系统中所有任务状态信息
vTaskGetInfo() 获取某个任务信息
xTaskGetApplicationTaskTag() 获取某个任务的标签值
xTaskGetCurrentTaskHandle() 获取当前正在运行的任务的任务句柄
uxTaskGetStackHighWaterMark() 获取任务堆栈历史剩余最小值
eTaskGetState() 获取某任务状态
pcTaskGetName() 获取某任务名字
xTaskGetTickCount() 获取系统时间计数器值
xTaskGetTickCountFromISR() 在中断中获取时间计数器的值
xTaskGetSchedulerState() 获取任务调度器的状态
uxTaskGetNumberOfTask() 获取当前系统中存在的任务数量
vTaskList() 以表格形式输出当前系统中所有信息
vTaskGetRunTimeStats() 获取每个任务的运行时间
vTaskSetApplicationTaskTag() 设置任务标签值

vTaskGetInfo()

  • 该函数几乎能获取单个任务的所有信息。下面来看一下该函数的函数声明:
	void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, 
	                   BaseType_t xGetFreeStackSpace, eTaskState eState )
	
  • 该函数输入参数有四个,TaskHandle_t xTask为所要查询任务的任务句柄;TaskStatus_t *pxTaskStatus为任务状态结构体,用于存放任务的状态,该结构体需要用户自定义;BaseType_t xGetFreeStackSpace为是否计算任务剩余最小堆栈大小,传入参数pdTRUE表示计算,但需要耗费一些时间;eTaskState eState为是否获取任务状态,输入参数eInvalid时表示获取任务状态,但同样也会消耗一些时间,否则用户指定任务状态,不会消耗时间。下面深入分析一下该函数源码。
	void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState )
	{
   
   
	TCB_t *pxTCB;

		/* xTask is NULL then get the state of the calling task. */
		pxTCB = prvGetTCBFromHandle( xTask );------(1)

		pxTaskStatus->xHandle = ( TaskHandle_t ) pxTCB;------(2)
		pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName [ 0 ] );------(3)
		pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority;------(4)
		pxTaskStatus->pxStackBase = pxTCB->pxStack;------(5)
		pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber;------(6)

		#if ( INCLUDE_vTaskSuspend == 1 ) ------(7)
		{
   
   
			/* If the task is in the suspended list then there is a chance it is
			actually just blocked indefinitely - so really it should be reported as
			being in the Blocked state. */
			if( pxTaskStatus->eCurrentState == eSuspended )
			{
   
   
				vTaskSuspendAll();
				{
   
   
					if( listLIST_ITEM_CONTAINER( &( pxTCB-</
### 关于 FreeRTOS-Plus-TCP 的使用指南 #### 配置 FreeRTOS-Plus-TCP 是一个专为嵌入式系统设计的 TCP/IP 协议栈,适用于资源受限的设备。为了成功配置该协议栈,需完成以下几个方面的设置工作: 1. **硬件初始化**:确保目标平台上的网络接口已正确初始化,并且驱动程序支持必要的功能(如发送和接收数据包)。这一步骤通常涉及调用特定函数来启动网卡以及分配内存缓冲区用于存储待处理的数据帧[^1]。 2. **IP 地址及相关参数设定**:通过 API 函数 `vIPv4AddressSet` 或者其他方式指定静态 IP 地址、子网掩码、默认网关等基本信息。如果希望动态获取这些值,则可以启用 DHCP 客户端服务[^3]。 3. **堆栈大小调整**:根据实际应用场景需求合理规划任务优先级及其对应的堆栈尺寸。过小可能导致溢出错误而过大则浪费有限资源[^2]。 4. **中断向量表映射**:对于某些架构而言还需要手动修改中断向量表以便正确响应来自物理层事件的通知信号。 --- #### 示例代码 下面给出一段简单的服务器监听循环作为参考实例之一: ```c #include "FreeRTOS.h" #include "task.h" #include "socket.h" void vSimpleServerTask(void *pvParameters){ struct freertos_socket_t* pxSocket; /* 创建套接字 */ if( (pxSocket = socket(FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP)) != NULL ){ /* 绑定到本地地址 */ struct freertos_sockaddr bindAddr; memset(&bindAddr,0,sizeof(bindAddr)); bindAddr.sin_family=FREERTOS_AF_INET; bindAddr.sin_port=htons((uint16_t)80); int iResult = bind(pxSocket,(struct sockaddr*)&bindAddr,sizeof(bindAddr)); if(iResult==pdPASS){ listen(pxSocket,BACKLOG_QUEUE_LENGTH); while(TRUE){ struct freertos_socket_t* newClientConnection; /* 接受连接请求 */ newClientConnection=accept(pxSocket,NULL,PASSIVE_BACKLOG_TIME_MS); if(newClientConnection!=NULL){ // 处理客户端交互逻辑... closesocket(newClientConnection); } } } closesocket(pxSocket); } } ``` 此代码展示了如何创建一个基本的服务端应用程序框架,在其中等待客户建立连接之后再进一步执行具体业务流程[^3]。 --- #### 相关文档下载链接 官方提供了详尽的技术手册帮助开发者深入了解产品特性及最佳实践方法论。可以从以下位置访问更多资料: - GitHub 主页: [https://github.com/FreeRTOS/FreeRTOS](https://github.com/FreeRTOS/FreeRTOS)[^1] - GitCode 存储库: [https://gitcode.com/gh_mirrors/fr/FreeRTOS-Plus-TCP](https://gitcode.com/gh_mirrors/fr/FreeRTOS-Plus-TCP) 另外还有专门针对初学者编写的入门教程可供查阅学习。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值