FreeRTOS的调度器源码分析及系统滴答SysTick

1. PendSV系统调用

查遍了C站上所有关于FreeRTOS调度器的分析,发现大家分析完vTaskStartScheduler()之后就戛然而止了,我就会比较迷糊,这个仅开启了调度器的调度,而FreeRTOS是一个实时操作系统,并不能体现出他的实时性在哪里,虽然已经在FreeRTOSConfig.h中设置了configUSE_PREEMPTION等于1,那他是怎么其的作用呢?

project\demo\FreeRTOSConfig.h

 

刚开始对PendSV系统调用还比较陌生,读过很多的资料之后,下面是我的理解:
我们都知道,CPU的内部会有一个系统滴答,也就是SysTick,在我的系统里面设置的是1ms。系统滴答就相当于是CPU的心跳,注意,在每次的系统滴答时,都会产生一次中断,来判断是否有更高的优先级需要处理,如果有,就发生一次上下文切换。那么问题来了,如果每次都产生中断的话,那么如果CPU此时正好正在处理中断程序呢,处于系统的实时性问题,系统滴答同样会产生一次系统时钟的中断来判断是否需要发生一次调度。那么为了能使中断顺利且全部一次完成,就加入了PendSV系统调用。他的目的就是为了能够使中断产生时,避免被系统时钟中断打断产生调度而引入的。

而PendSV就是一次SWI系统调用。我们先看SWI系统调用的结果是什么,SWI系统中断定义在中断向量表中,

FreeRTOS的调度器源码分析及系统滴答SysTick_第1张图片

 当系统发生SWI中断的时候,就会触发调用FreeRTOS_SWI_Handler函数,而FreeRTOS_SWI_Handler的处理过程如下:

FreeRTOS_SWI_Handler:
	/* Save the context of the current task and select a new task to run. */
	portSAVE_CONTEXT
	LDR R0, vTaskSwit

你可能感兴趣的:(RTOS,算法,freertos,操作系统,arm,实时操作系统)