
算法执行时间过长导致的Task抖动问题
汽车嵌入式开发中,各家产品算法都属于核心秘密,如果说基础软件是"地基",那么,算法就是各异的上层建筑。而不同的上层建筑也意味着用材和工时不同,对应到嵌入式开发,也就意味着算法复杂度不同,算法复杂度的不同,意味着算法代码执行时间不同。而Task对应代码执行时间的长短对产品功能的影响至关重要。本文,讨论一下算法执行时间过长所带来的影响,以及优化方式。
1、算法执行时间过长带来的影响
举例:某个核(eg:Core0)有两个Task,20ms周期的Task1(优先级低)和5ms的Task2(优先级高)。其中Task1中有复杂算法,对应的代码执行时间需要12ms,Task2对应代码的执行时间需要3ms。Task1和Task2的运行状况如下所示:
如上可以看出,Task1的调度周期为20ms,但是,由于Task2的抢占,Task1无法在20ms的时间内将算法完整的执行一遍,而是需要30ms的时间才能将算法执行一次。如此,就会造成Task1(20ms周期)周期不准,即:30ms才能完整执行一次算法,如下所示:
Task抖动对算法会有什么影响呢?具体的影响因产品不同而有所区别,Task不准以后,对计时的影响最为直接。比如:在Task1中设计一个软件计时器用于计时。影响如下:
如上可以看出,在20ms的Task中设计一个软件计时器,代码每执行一遍,时间累加20ms,由于Task抖动,实际代码每30ms才执行一次。如此,导致软件计时与真实时间产生差距,使得计时不准。
2、算法优化
如上问题,主要是Task1中的代码执行时间过长导致。针对这种问题,如何优化好呢?本文讨论一种可能:拆分算法。即:将复杂算法Algorithm_Fun()拆分成多个函数,比如,拆分成12个子函数:Function_1()...Function_12(),假设:拆分的每个子函数执行时间大约1ms,如下所示:
将复杂算法拆分以后,根据项目实际,将拆分后的子函数重新分配,示例如下:
如上图,由于Core0的CPU负载过高,无法在Task规定时间内有效处理Code。这种情况,很难通过优化Core0的Task分配,解决Task抖动问题。但是,可以将复杂算法拆分成小的代码段,部分代码段分配到其他Core(本文:Core1),如上图,将拆分的Function_9()~Function_12()分配到Core1的Task1中。这样,既不影响Core1 Task的运行,又避免了Core0 Task的抖动。如上,通过拆分算法,均衡不同Core负载,从而达到优化目的。
文章转载自公众号:开心果 Need Car
