STM32F103 FreeRTOS任务启动与切换流程

STM32F103 FreeRTOS任务启动与切换流程_第1张图片

即SVC_Handler,PendSV_Handler,SysTick_Handler。其中:SVC是用于触发一个PendSV异常来进行一个上下文切换,具体切换过程在PendSV_Handler里完成,SysTick_Handler则是为操作系统提供一个时基,进行一系列操作比如延时时切换任务等。
简单点来说:
SVC_Handler是用于启动第一个任务的中断
PendSV_Handler是用于每次任务切换中断;
SysTick_Handler是一个定时器,比如一个任务运行3s,这3s就是用这个定时器来计时得到的
至于为什么这些操作要放在这几个中断内进行,这是因为CM3内核有两种模式:用户和特权,模式不同,权限不同,有些操作需要在特权模式下进行。
具体的代码分析放在后面,现在只了解存在这三个中断。
接下来直接进入到main函数

STM32F103 FreeRTOS任务启动与切换流程_第2张图片
在main里面关于操作系统主要存在于三个函数内:delay_init,xTaskCreate,vTaskStartScheduler
其中delay_init中主要开启了SysTick中断:

STM32F103 FreeRTOS任务启动与切换流程_第3张图片
然后xTaskCreate是创建函数任务,里面主要操作是为任务申请堆栈空间

STM32F103 FreeRTOS任务启动与切换流程_第4张图片

一个任务创建时,会将它的任务堆栈初始化的像是经过一次任务切换一样,如图1-1所示。对于Cortex-M3架构,需要依次入栈xPSR、PC、LR、R12、R3R0、R11R4,其中r11~R4需要人为入栈,其它寄存器由硬件自动入栈。寄存器PC被初始化为任务函数指针vTask_A,这样当某次任务切换后,任务A获得CPU控制权,任务函数vTask_A被出栈到PC寄存器,之后会执行任务A的代码;LR寄存器初始化为函数指针prvTaskExitError,这是由移植层提供的一个出错处理函数。

你可能感兴趣的:(STM32F103 FreeRTOS任务启动与切换流程)