STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第1张图片

 如果临界区代码量很多,执行时间长会造成延时中断,这样子如果中断得不到响应的话,不符合实时操作系统。

使用实例

	void vTaskDelay( const TickType_t xTicksToDelay )
	{
	BaseType_t xAlreadyYielded = pdFALSE;

		/* A delay time of zero just forces a reschedule. */
		if( xTicksToDelay > ( TickType_t ) 0U )
		{
			configASSERT( uxSchedulerSuspended == 0 );
			vTaskSuspendAll();
			{
				traceTASK_DELAY();

				/* A task that is removed from the event list while the
				scheduler is suspended will not get placed in the ready
				list or removed from the blocked list until the scheduler
				is resumed.

				This task cannot be in an event list as it is the currently
				executing task. */
				prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );
			}
			xAlreadyYielded = xTaskResumeAll();
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}

		/* Force a reschedule if xTaskResumeAll has not already done so, we may
		have put ourselves to sleep. */
		if( xAlreadyYielded == pdFALSE )
		{
			portYIELD_WITHIN_API();
		}
		else
		{
			mtCOVERAGE_TEST_MARKER();
		}
	}

下面讲解一下这两个API函数具体的底层实现

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第2张图片

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第3张图片STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第4张图片

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第5张图片

 我们知道,系统是通过pendsv中断来进行任务切换的,那么这个变量又是怎么和这个中断联系在一起的呢?

在delay.c中

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第6张图片

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第7张图片

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第8张图片

在M3权威指南中

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第9张图片

portNVIC_INT_CTRL_REG 被定义为一个指向寄存器地址的指针。通过将 portNVIC_PENDSVSET_BIT 的值(一个整数)赋给该指针,实际上将寄存器的值设置为 portNVIC_PENDSVSET_BIT 所表示的位模式。

回到delay.c

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第10张图片

 go to进去

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第11张图片

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第12张图片

然后   

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第13张图片

 此时相当于任务调度器被挂起,也是嵌套的一个功能

还有个挂起任务调度器的功能,要截图实在太多了,大家看完上面的再看视频应该就可以了。

STM32F103移植FreeRTOS系列十:任务调度器的挂起和恢复_第14张图片

 这里等于0说的是变量uxSchedulerSupended等于0

你可能感兴趣的:(stm32,嵌入式硬件,单片机)