实现调度器
vTaskStartScheduler启动调度器,开始多任务调度,启动成功则不返回,就在各种任务中不断切换着 1:创建空闲任务 2:#if ( configUSE_TIMERS == 1 )使用软件定时器 3:使能 NEWLIB 4:xTickCount = ( TickType_t ) 0 5:调用函数 xPortStartScheduler()来初始化跟调度器启动有关的硬件,比如滴答定时器、FPU 单元和 PendSV 中断等等 xPortStartScheduler内核相关硬件初始化函数 1:初始化滴答定时器(提供系统时钟)和PendSV中断(任务切换用),优先级都设置为最低 2:调用prvStartFirstTask启动第一个任务 prvStartFirstTask启动第一个任务,主要做了两个动作 1:一个是更新MSP的值(向量表的起始地址)main stack pointer 2:使能全局中断 3:一个是产生SVC系统调用,然后去到中断服务函数里面真正切换到第一个任务。产生系统调用,服务号0表示SVC中断,接下来将会执行SVC中断服务函数 vPortSVCHandler SVC中断服务函数 进程堆栈指针PSP,指向任务栈的栈顶,也就是将pxCurrentTCB中保存的栈的内容加载到寄存器里,就相当于重新恢复了过来,又可以继续运行了
|