작성
·
65
·
수정됨
답변 4
1
#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가 실행이 안되고 있습니다.
설정은 강의 포트 프로젝트 설정과 똑같이 하였습니다.
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++;
}
}
안녕하세요~
확인해보니 NUCLEO-F334R8 보드의 램 사이즈는 12KB 이네요.
결론부터 말씀드리면 기본 Heap Size 가 실제 프로그램 내에서 필요한(요청한) 크기보다 작아서 생긴 문제로 보입니다.
TaskMain, Task1, Task2 만 계산해봐도 이미 힙 사용량은 1024*3 바이트입니다.
아래 그림을 보시면 JUNI 님께서는 힙 크기를 3072 바이트로 설정하셨네요.
아래처럼 테스트 해보시죠.
#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
0
안녕하세요. JUNI님!
어떤식으로 설정하셨는지에 따라서 실행 결과는 다양하게 나올 수 있습니다. 문제가 되는 지점의 코드를 이곳에 붙여넣어 주시면 검토 후 답변드리겠습니다.
0
안녕하세요, 인프런 AI 인턴입니다. JUNI님.
NUCLEO-F334R8 보드에서 FreeRTOS를 사용하는 과정에서 Task가 예상과 다르게 동작하지 않는 경우에는 여러 가지 원인을 고려해볼 수 있습니다. Task1이 실행되지 않는 문제를 해결하기 위해 몇 가지 체크해야 할 사항을 안내드립니다.
Stack Size 확인: 각 Task에 할당된 Stack Size가 충분한지 확인하세요. Stack이 충분하지 않다면 Task가 정상적으로 실행되지 않을 수 있습니다.
Task Creation 코드 확인: vTaskCreate() 함수의 모든 인자가 올바르게 설정되어 있는지 확인하세요. 특히, Task의 우선순위(priority)가 낮게 설정되어 다른 Task에 의해 실행되지 않을 가능성을 검토하세요.
Scheduler: vTaskStartScheduler()를 호출하였는지 확인하십시오. Scheduler가 시작되지 않으면 어떤 Task도 실행되지 않습니다.
중단점(Diagnostics): 디버거를 사용하여 Task가 block 상태인지, 혹은 다른 이유로 실행되지 않는지 분석해보세요. Task가 block 상태이면 연관된 큐나 세마포 어 등을 확인하세요.
Configuration File: FreeRTOSConfig.h 파일의 설정이 올바른지 확인하세요. 특히, priorities, heap, stack에 관한 설정을 점검하시기 바랍니다.
관련 질문들과 동일 증상의 질문을 확인해본 결과, 아래 링크들을 참고하여 문제를 해결할 수 있을 것 같습니다:
위 링크들은 Task 실행과 관련된 문제들을 다루고 있으며, 해결 방안을 제시하고 있으니 참고하시면 도움이 될 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
아마 직접 포팅하신듯한데, 다른 프로젝트 예제들도 잘 동작 안하지 않나요?
제가 지금 올려드린 NUCLEO_F334R8 포팅 소스를 이용해보시고 그래도 문제가 있으면 프로젝트 파일을 아래 메일 주소로 보내주세요. guileschool@gmail.com
이 보드는 SRAM 크기가 16KB 으로 메모리가 작은 편에 속합니다. 그래서 힙사이즈(ucHeap)를 기존 16,384에서 7800바이트로 줄여서 작업을 하였습니다.