FreeRTOS笔记(九)任务相关的过渡

上一文链接:FreeRTOS笔记(八)任务切换


01 - 任务相关的过渡

1.1 - get和set函数

  了解到任务、列表和调度器后,关于任务的核心内容应该比较清晰,FreeRTOS还有很多任务的辅助函数,比如一些必要的getset函数,用于获取和设置任务的状态和信息,比如常见的如下

函数功能
xTaskGetCurrentTaskHandle()获取运行态任务的句柄
uxTaskGetNumberOfTasks()获取当前所有任务的数量
vTaskGetRunTimeStats()获取任务的运行时间
eTaskGetState()获取任务状态
vTaskPrioritySet()设置任务优先级
vTaskSetTimeOutState()设置任务溢出时间

  这些辅助函数在工作进度调整的时候需要用到,比如vTaskGetRunTimeStats()用于获取任务占用CPU的时间,在工作进度开始之前可以先测试每个任务的CPU占用率,再去调整任务的优先级。关于这些函数应该要根据实际去使用。

1.2 - delay延迟函数

  为了验证自己了解的任务基本内容,现在我们可以分析一下常用的延迟函数,FreeRTOS提供了两种延迟方式,vTaskDelay()相对延迟和vTaskDelayUntil()绝对延迟,不同点是时间计算的起点不同,相同点是都会进入阻塞状态,相对延迟是每次都从调用处的时刻为起点,而绝对延迟是根据上一次的结束点为起点,绝对延迟用于周期性任务的设置。

  跟踪vTaskDelay()函数,可以得到常见延迟的调用层次如下

vTaskDelay()    
	prvAddCurrentTaskToDelayedList()    
		xTimeToWake = xConstTickCount + xTicksToWait;   #以当前值为起点计算唤醒时间xTimeToWake
		listSET_LIST_ITEM_VALUE()   					#把xTimeToWake插入任务列表项的列表值
		vListInsert()   								#任务插入延迟列表

  可以尝试下面的追朔

这样,唤醒任务的时间就加入任务的列表项中了,同时任务也加入延迟列表pxDelayedTaskList,那么是谁唤醒的,要唤醒任务,必须把任务从延迟列表中移到就绪列表,于是追朔延迟列表的调用者,可以其中一个调用者是listGET_OWNER_OF_HEAD_ENTRY(),继续追朔,调用者是xTaskIncrementTick(),继续追朔,调用者是xPortSysTickHandler(),到此追朔完成,上一文已经提及,xPortSysTickHandler()SysTick中断的服务函数,周期性地进行工作。

  下面是唤醒的调用层次,唤醒的核心代码在xTaskIncrementTick()

xPortSysTickHandler()   								#中断服务函数
	xTaskIncrementTick()    					#更新xTickCount计数
		pxTCB = listGET_OWNER_OF_HEAD_ENTRY()   #获取延迟列表项
		xItemValue = listGET_LIST_ITEM_VALUE()  #获取唤醒时间
		if( xConstTickCount < xItemValue )      #如果到达唤醒时间
			uxListRemove()                      #把任务从延迟列表移除
			prvAddTaskToReadyList( pxTCB );     #任务插入就绪列表

  以上简单总结为:调用vTaskDelay()后,计算唤醒时间并加入任务属性中,然后任务加入延迟列表,每个SysTick中断周期内就会检查延迟列表中的任务是否到达唤醒时间,如果是,就从延迟列表中移到就绪列表,唤醒完成。

  可以用同样的方式追朔vTaskDelayUntil()绝对延迟,它只是计算唤醒时间的方式不同,以上一次唤醒的时间为起点,如果是第一次调用,那么起点就是任务函数的执行时刻,区别可以用下图表达

相对延迟vTaskDelay()

绝对延迟vTaskDelayUntil()

  除了延迟函数,还可以去分析挂起函数xTaskSuspend()等等,任务函数相关API就过渡到这里。

02 - 总结

  • 任务有非常多的get和set函数,可以在任务运行期间获取和设置任务的状态和属性
  • 延迟函数分为相对和绝对,相对延迟一般用于短暂的等待,绝对延迟一般用于周期性工作
  • 任务还有很多辅助API函数
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值