인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

Inflearn Community Q&A

ydj90720740's profile image
ydj90720740

asked

FreeRTOS Programming

Source Code Analysis - vTaskSuspend

TODO 2번 문제

Written on

·

51

·

Edited

1

NUCLEO-F334R8 보드를 사용하고 있습니다.
task.c 2번문제를 풀고있는데 task1이 실행이 안되는 이유를 찾으려고 하는데 방법이 어떻게 되나요?

1. task1,2가 create 각각 되는건 확인이 됩니다.
2. 하지만 supped 이후 두개의 task는 실행되지 않고 main만 실행되고 있습니다.
3. MAX_PRIORITIES 20으로 설정하였습니다.

운영체제임베디드FreeRTOS

Answer 4

1

ydj90720740님의 프로필 이미지
ydj90720740
Questioner

image.png

#if 1

xTaskCreate( (TaskFunction_t)Task1, /* Pointer to the function that implements the task. */

"Task1", /* Text name for the task. This is to facilitate debugging only. */

256, /* Stack depth - most small microcontrollers will use much less stack than this. */

NULL, /* We are not using the task parameter. */

TASK_1_PRIO, /* This task will run at this priority */

&xHandle1 ); /* We are not using the task handle. */

#endif // TODO #1

 

/* Create the other task in exactly the same way. */

Param = &Param_Tbl; /* get parameter tbl addr */

Param->P1 = 111111; /* set parameter */

Param->P2 = 222222;

#ifdef CMSIS_OS

osThreadDef(Task2, (void const *)Task2, osPriorityBelowNormal, 0, 256);

xHandle2 = osThreadCreate (osThread(Task2), (void*)Param);

#else

xTaskCreate( (TaskFunction_t)Task2, "Task2", 256, (void*)Param, TASK_2_PRIO, &xHandle2 );

#endif

 

/* TODO #2:

Task1을 중지

use 'vTaskSuspend' */

#if 1

vTaskSuspend(xHandle1);

#endif // TODO #2

다음과 같이 xHandle1을 suspend 했음에도 불구하고 task2가 실행이 안되고 있습니다.

설정은 강의 포트 프로젝트 설정과 똑같이 하였습니다.

guileschool님의 프로필 이미지
guileschool
Instructor

아마 직접 포팅하신듯한데, 다른 프로젝트 예제들도 잘 동작 안하지 않나요?

제가 지금 올려드린 NUCLEO_F334R8 포팅 소스를 이용해보시고 그래도 문제가 있으면 프로젝트 파일을 아래 메일 주소로 보내주세요. guileschool@gmail.com

이 보드는 SRAM 크기가 16KB 으로 메모리가 작은 편에 속합니다. 그래서 힙사이즈(ucHeap)를 기존 16,384에서 7800바이트로 줄여서 작업을 하였습니다.

guileschool님의 프로필 이미지
guileschool
Instructor

TASK2에 브레이크 포인트 잡아보시죠. 아니면 아래와 같이 TODO3 을 활성화 시켜보세요.
메일로 보내신 소스를 확인한 결과 특별히 이상한 곳은 찾을 수 없었네요.

static void Task2( const struct Param_types *Param )
{
	const char *pcTaskName = "Task2";

	/* Print out the name of this task. */
	printf( "%s is running\n", pcTaskName );

	printf("\n-------  Task2 parameter passed from main --------\n");
	printf("task2 first parameter = %d \n",Param->P1);
	printf("task2 second parameter = %d \n",Param->P2);
	printf("--------------------------------------------------\n");

	while(1) {
	/* TODO #3:
		코드를 실행 하여 보고
		vTaskDelay() 코드를 주석 처리한 후 그 결과를 설명한다 */
#if 1 // No comment
vTaskDelay (pdMS_TO_TICKS (1000));
printf("b"); fflush(stdout);	// 문자 'a' 출력
#endif // TODO #3

		task2timer++;
	}
}
ydj90720740님의 프로필 이미지
ydj90720740
Questioner

메일 확인 부탁드립니다.

guileschool님의 프로필 이미지
guileschool
Instructor

안녕하세요~

확인해보니 NUCLEO-F334R8 보드의 램 사이즈는 12KB 이네요.

결론부터 말씀드리면 기본 Heap Size 가 실제 프로그램 내에서 필요한(요청한) 크기보다 작아서 생긴 문제로 보입니다.

TaskMain, Task1, Task2 만 계산해봐도 이미 힙 사용량은 1024*3 바이트입니다.

아래 그림을 보시면 JUNI 님께서는 힙 크기를 3072 바이트로 설정하셨네요.

아래처럼 테스트 해보시죠.

image.png
#if 1
	xTaskCreate( (TaskFunction_t)Task1,
			"Task1",
			128,
			(void*)NULL,
			TASK_1_PRIO,
			&xHandle1 );
#endif // TODO #1

TaskMain, Task1, Task2 각 태스크 생성시 스택크기를 256 -> 128 로 변경해서 테스트 해보세요.

사용하시는 개발 환경이 메모리가 꽤 작은 시스템이기에 앞으로도 주의가 필요합니다.

그리고, 이 강의 예제를 이용하실 때는 CubeMX 를 직접 수정하면 안됩니다.

그 이유에 대해서는 이 영상을 참고해주세요. 부득이 꼭 수정하셔야 할 경우에는 FreeRTOSConfig_base.h 와 FreeRTOSConfig.h 을 적절히 수정하여 사용하여야 합니다.

 

0

ydj90720740님의 프로필 이미지
ydj90720740
Questioner

해결되었습니다 감사합니다

0

guileschool님의 프로필 이미지
guileschool
Instructor

안녕하세요. JUNI님!
어떤식으로 설정하셨는지에 따라서 실행 결과는 다양하게 나올 수 있습니다. 문제가 되는 지점의 코드를 이곳에 붙여넣어 주시면 검토 후 답변드리겠습니다.

0

안녕하세요, 인프런 AI 인턴입니다. JUNI님.

NUCLEO-F334R8 보드에서 FreeRTOS를 사용하는 과정에서 Task가 예상과 다르게 동작하지 않는 경우에는 여러 가지 원인을 고려해볼 수 있습니다. Task1이 실행되지 않는 문제를 해결하기 위해 몇 가지 체크해야 할 사항을 안내드립니다.

  1. Stack Size 확인: 각 Task에 할당된 Stack Size가 충분한지 확인하세요. Stack이 충분하지 않다면 Task가 정상적으로 실행되지 않을 수 있습니다.

  2. Task Creation 코드 확인: vTaskCreate() 함수의 모든 인자가 올바르게 설정되어 있는지 확인하세요. 특히, Task의 우선순위(priority)가 낮게 설정되어 다른 Task에 의해 실행되지 않을 가능성을 검토하세요.

  3. Scheduler: vTaskStartScheduler()를 호출하였는지 확인하십시오. Scheduler가 시작되지 않으면 어떤 Task도 실행되지 않습니다.

  4. 중단점(Diagnostics): 디버거를 사용하여 Task가 block 상태인지, 혹은 다른 이유로 실행되지 않는지 분석해보세요. Task가 block 상태이면 연관된 큐나 세마포 어 등을 확인하세요.

  5. Configuration File: FreeRTOSConfig.h 파일의 설정이 올바른지 확인하세요. 특히, priorities, heap, stack에 관한 설정을 점검하시기 바랍니다.

관련 질문들과 동일 증상의 질문을 확인해본 결과, 아래 링크들을 참고하여 문제를 해결할 수 있을 것 같습니다:

위 링크들은 Task 실행과 관련된 문제들을 다루고 있으며, 해결 방안을 제시하고 있으니 참고하시면 도움이 될 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ydj90720740's profile image
ydj90720740

asked

Ask a question