FreeRTOS 多任务

-----

写在前面的话,本文档介绍FreeRTOS实时操作系统的多任务:

————————————————

  多任务和单任务几乎没有差别。只是多创建一个或多个任务,其它地方和单任务创建相同。

  调度器保证总是在所有可运行的任务中选择具有最高优先级的任务,并使其进入运行态。如果被选中的优先级上具有不止一个任务,调度器会让这些任务轮流执行。这种行为方式在之前的例子中可以明显看出来,两个任务被创建在同一个优先级上,并且一直是可运行的。所以每个任务都执行一个”时间片”,任务在时间片起始时刻进入运行态,在时间片结束时刻又退出运行态。

  我们知道裸机编程中,中断优先级设置一样时,会看硬件编号,编号小的优先级高。

  freertos中,任务优先级数值越大的,优先级越高,那么,要是设置成任务优先级相同,以什么方式运行的呢?

  要能够选择下一个要运行的任务,调度器需要在每个时间片的结束时刻运行自己本身(即新的滴答中断产生期间运行)。一个称为滴答(tick,有些地方被称为心跳时钟, 本文中一律称为滴答时钟)中断的周期性中断用于此目的。时间片的长度通过滴答中断的频率进行设定,滴答中断频率由FreeRTOSConfig.h 中的编译时配置常量 configTICK_RATE_HZ 进行配置。比如说,如果 configTICK_RATE_HZ 设为 100(HZ),则时间片长度为 10ms。

  需要说明的是,FreeRTOS API 函数调用中指定的时间总是以滴答中断周期为单位(”ticks”)。常量 portTICK_RATE_MS 用于将以滴答为单位的时间值转化为以毫秒为单位的时间值,有效精度依赖于系统滴答频率。滴答计数(tick count)值表示的是从调度器启动开始,滴答中断的总数,并假定滴答计数器不会溢出。用户程序在指定延迟周期时不必考虑滴答计数溢出问题,因为时间连贯性在内核中进行管理。

  一句话:时间片长度 = 滴答中断(System Tick)周期

  注意,在优先级设置不相同的情况下,task1 优先级1,task2 优先级2,task2不使用freertos的延时函数就无法发生任务切换。在优先级设置相同的情况下,不使用freertos的延时函数,即阻塞,也是可以切换的,此时采用的时间轮转片切换任务。

  任务状态:

猜你喜欢

转载自www.cnblogs.com/caiiniaoshiyizhixiaoxiaoniao/p/12738153.html