STM32F103 포팅 FreeRTOS 시리즈 10: 작업 스케줄러 일시 중단 및 복구

 크리티컬 섹션에 코드가 많으면 실행 시간이 길어 인터럽트 지연이 발생하는데, 이렇게 인터럽트에 응답하지 않으면 실시간 운영체제에 맞지 않는다.

사용 사례

	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 함수의 특정 기본 구현을 설명하겠습니다.

 우리는 시스템이 pendsv 인터럽트를 통해 작업 전환을 수행한다는 것을 알고 있습니다. 그렇다면 이 변수는 이 인터럽트에 어떻게 연결됩니까?

in delay.c

M3 Definitive 가이드에서

portNVIC_INT_CTRL_REG레지스터 주소에 대한 포인터로 정의됩니다. 이 포인터에 (정수) 값을 할당하면 portNVIC_PENDSVSET_BIT레지스터 값이 실제로 로 portNVIC_PENDSVSET_BIT표시되는 비트 패턴으로 설정됩니다.

delay.c로 돌아가기

 들어가다

그 다음에   

 이때 작업 스케줄러가 일시 중단되는 것과 동일하며 중첩된 기능이기도 합니다.

작업 스케줄러를 일시 중지하는 기능도 있습니다.찍을 스크린 샷이 너무 많습니다.위 내용을 읽으신 후 비디오를 시청하십시오.

 여기서 0과 같다는 것은 변수 uxSchedulerSupended가 0과 같다는 것을 의미합니다.

Supongo que te gusta

Origin blog.csdn.net/qq_51519091/article/details/131576118
Recomendado
Clasificación