FreeRTOS的任务触发是由滴答时钟触发SysTick中断来触发调度器执行或阻塞或挂起和切换任务的。
首先是任务的并发能力,FreeRTOS的任务执行是基于全抢占调度机制,任务优先级按在就绪列表中由高到低排布,系统首先执行最高优先级任务,如果最高优先级在while(1)中,最高优先级任务将永远执行。要想分配CPU资源给其他任务,可以用 vTaskDelay 来暂时将高优先级任务挂起。此时下一个高优先级任务就会抢占CPU资源,开始执行任务,delay时间过后,高优先级重新抢占CPU,恢复执行。
全抢占调度机制比较适用于实时控制,对响应时间要求严格,因为延迟可能导致系统性能下降或安全问题。比如说智能车,电机控制方面,优先级肯定是最高的,但是像camera的数据采集就可以在电机控制之下,智能车在运行的时候,camera采集数据不需要极其的频繁,再往下比如LCD图像显示,就更不需要那么频繁的显示,即便有延迟,对系统安全也不会产生多大的影响。这种设置可以确保电机控制任务的实时性和响应性,同时允许相机数据采集和LCD图像显示任务在不影响关键功能的情况下进行适当的延迟。
接下来是任务的并行能力,时间片轮转调度机制是任务的并行机制,也就是当多个任务处于同一优先级时,CPU通过划分时间片,每个时间片执行任务,任务没有执行完,就将数据或寄存器配置等暂存到CPU的堆栈上,等待其他任务全部执行完对应的时间片,再次恢复到任务被执行的点。
时间片轮转调度机制其实最好的应用法是对于某些任务,需要等待某个事件,或者需要等待什么资源的时候,为了不白白空等,就先去执行其他的任务,等到其他任务执行完了,我这个任务也等到了想要的资源。
比如camera的数据采集和数据处理与分析,可以在同一个优先级,也就是数据该采集采集,等camera数据采集完了我就执行数据分析,之后camera依旧在不同的时间片进行数据采集,采集完的数据在不同的时间片进行分析。(但是这也要注意一些问题,如果数据采集任务在一个时间片内没有完成数据的采集,而数据处理与分析任务在下一个时间片内开始执行,可能会导致数据丢失。因为数据采集任务没有机会在连续的时间片内完成采集,而数据处理与分析任务已经开始处理下一次采集的数据。以及如果数据处理与分析任务占用的执行时间较长,可能会导致相机数据采集任务无法及时响应。这可能会导致数据采集的延迟增加,影响实时性能。此时可能用高低优先级全抢占调度机制实现camera的数据采集和数据处理与分析更稳一点)
时间片轮转调度机制一般用于没有紧急的实时需求情况下,比如智能车需要通过多个传感器(如相机、雷达、激光等)获取环境信息,并进行实时的感知和决策。这几个任务完全可以利用时间片轮转调度机制获取信息吗。